Linux Process & CF scheduling


Published on

1 Comment
  • Be the first to like this

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide
  • wake_up_new_task; in other words, the task structure is added to the scheduler queue뒤쪽에서 스케줄링에서 설명하겠지만 생성된 프로세스는 무조건 한번은 수행되도록 보장함
  • Check flag – for clone system call parameterDup_task_struct – 실제 복사가 이루어짐Sched_fork – 스케줄링에 관련된 내용이 복사됨(확인요함)
  • Vruntime – 실제 수행된 시간에 prority별로 가중치를 둔 이후, 가장 수행시간이 적은 task 위주로 수행함
  • Prio, normal_proi – 동적으로 변함Static_proi- 고정됨Rt_prioroty – realtime인 경우만설정, 그렇지 않은 경우 0,max 99Sched_entity를 갖는 것은 모든지 스케줄링이 될 수 있음Policy는 cpu에 동작할 때의 정책 –sched_normalCpus_allows – bitfield로 특정 cpu에서 동작하는 것을 제한Tile_slice for realtimeß
  • Nr_running – 현재 큐에 들어있는 태스크 갯수Load – 가중치를 고려한 테스크의 워크로드Clock은 해당 런큐가 주기적으로 스케줄링을 받도록 계산하기 위하여 사용됨Cpu_load는 이전의 워크로드를 기록 – 로드벨런싱, 그룹핑에 쓰임\\
  • 전체 큐의 워크로드런큐 내부적으로 rb를 이용하기 때문에, 그에 필요한 노드On_rq – 현재 스케줄링이 되고 있는지 확인CFS를 구현하기 위하여 필요한 시간 값Task_struct가 sched_entity를 가지고 있기 때문에 스케줄링을 받을 수 있음
  • weight는 load 즉, 우선순위에 대한 가중치이고 inv_weight는 이의 역수(1/weight)에 해당하는 값이다.weight 값은 nice를 통해 지정할 수 있는 우선순위에 대응하는 값이며 (nice level 0일 때: 1024)sched.c 파일의 prio_to_weight[] 배열에 저장되어 있다.참고로 nice (우선순위) 값의 1 차이는 weight 값의 1.25 배 차이이며이는 프로세스가 CPU를 사용하는 시간에 10% 정도 영향을 준다.inv_weight값은 단지 계산을 간편하게 하기 위한 목적으로 도입된 것으로가중치 계산을 위한 나눗셈을 피하기 위해 미리 정해진 충분히 큰 수(2^32)에 나눗셈을 미리 계산해 둔 값이다.
  • Linux Process & CF scheduling

    1. 1. Process & CFS<br />
    2. 2. Process<br />
    3. 3. Process<br />Program in the midst of execution<br />How to create new process<br />fork(), vfork()<br />exec()<br />
    4. 4. Data structure<br />task_struct<br />Process descriptor<br />Priority(prio, static_prio, normal_prio) <br />Scheduling class(sched_class)<br />Scheduling policy(policy)<br />Link parent, child, sibling, group_leader<br />
    5. 5. Data structure<br />thread_info<br />Describe process data accessed by architecture specific code<br />Difference among other CPUs<br />Managed information<br />task_struct<br />flags for scheduling(TIF_SIGPANDING, TIF_NEED_RESCHED)<br />cpu number (for multi processor)<br />preempt_count<br />
    6. 6. Data structure<br />thread_union<br />Kernel stack & thread_info<br />1 or 2 pages(8KB)<br />Kernel stack size is less then 8K<br />
    7. 7. Process states<br />
    8. 8. Process creation system call<br /> fork()<br />Duplicate of the parent's page tables<br />Create unique process descriptor for child(pidetc)<br />Copy-on-Write<br />Delay the copying pages<br />exec() is called right after fork()<br />vfork()<br />Same as fork() except copying of parent page table<br />Share parent's address space<br />Child first scheme<br />Parent is blocked until the child calls exec() or exits<br />
    9. 9. do_fork()<br />Start point of fork<br />
    10. 10. copy_process()<br />
    11. 11. Thread<br />Implementation threads as same as standard processes<br />One thread has own task_struct<br />pid/ tgid<br />Create clone() system call<br />clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0);<br />clone(SIGCHLD, 0); // fork()<br />clone(CLONE_VFORK | CLONE_VM | SIGCHLD, 0); // vfork()<br />
    12. 12. Kernel Threads<br />Standard processes running in kernel space<br />Do not have an address space( is NULL)<br />Schedulable, preemptable like normal process<br />kthread_create() for creation<br />
    13. 13. Process Termination<br />exit()<br />wait(), waitpid()<br />
    14. 14. Scheduling<br />
    15. 15. Scheduling<br />CoopreativevsPreemptive <br />yield<br />timeslice<br />IO bound vs CPU bound<br />Low latency vsHigh throughput<br />
    16. 16. Process priority<br />nice <br />Integer value(-20~19, default 0)<br />High nice value correspond to low priority<br />renice, setpriority()<br />Realtime priority<br />Always higher priority than normal processes<br />Integer value(0~99)<br />
    17. 17. Process priority<br />Priority kernel internal<br />Integer value (0~139)<br />nice values[-20~19] are map to [100~139]<br />[0~99] for realtime processes<br />
    18. 18. Fairness scheduling<br />RR on static timeslice<br />100ms(0 nice) vs 95ms(1 nice)<br />10ms(19 nice) vs 5ms (20 nice)<br />A user’s 100 processes vs B user’s 1process<br />Per user based scheduling<br />Enable when kernel build<br />Per thread level scheduling<br />One nice value down gets 10% more CPU power<br />vruntime(virtual clock)<br />Support CGroupscheduling<br /><br />
    19. 19. Overview<br />schedule()<br />Core<br />T<br />T<br />T<br />Ruequene<br />do_fork()<br />wake_up_new_task()<br />T<br />Tß<br />T<br />Waitqueue<br />Core<br />T<br />Ruequene<br />Core<br />T<br />T<br />Ruequene<br />Core<br />T<br />T<br />Ruequene<br />
    20. 20. tast_struct<br />sched_class<br />seched_entity<br />sched_class<br />Sched_entity<br />load_weight<br />on_rq<br />vruntime<br />rq<br />load_weight<br />cfs_rq<br />rt_rq<br />load_weight<br />
    21. 21. CFS policy<br />Soft real-time policy<br />Posix standard<br />Priority scheduling<br />One nice level down gets 10% more CPU power<br />Virtual clock<br />Conceptual time considering priority<br />Task waiting most of time will be scheduled to run<br />Time order is managed by Runqueue<br />
    22. 22. Data struct<br />task_struct<br /><br />SCHED_NORMAL<br />SCHED_BATCH<br />SCHED_IDLE<br />SCHED_FIFO<br />SCHED_RR<br />
    23. 23. Data struct<br />sched_class<br /><br />
    24. 24. Data struct<br />rq<br /><br />
    25. 25. Data struct<br />sched_entity<br /><br />
    26. 26. Dealing with priority<br />Basic<br />static_prio<br />Value inherited by parent or set<br />prio,normal_prio<br />Dynamically changed<br />
    27. 27. Dealing with priority<br />Code<br />
    28. 28. Computing Load weights<br />load_weight<br />
    29. 29. Remaining<br />How to determine<br />vruntime<br />Process selection<br />When schedule() function is called<br />Context switching<br />Sleep and Wake up<br />Cgroup<br />Hard to understand<br />