need_resched 是怎么使用的(ZT)

来源:互联网 发布:ovid medline数据库 编辑:程序博客网 时间:2024/06/08 03:35

need_sched 表示CPU从系统空间返回到用户空间前夕要进行一次调度。


一 系统调用do_fork() 

1 当前进程调用fork()创建子进程,进入kernel 
2 当前进程分一半多时间片给子进程, 
3 如果当前进程时间片剩余为0,设定当前进程need_sched=1, 
4 从系统调用退出 
5 到达ret_from_sys_call 
6 到达ret_with_reschedule 
7 发现当前进程要求调度,跳转到reschedule 
8 调用schedule() 
9 schedule()处理当前进程的调度要求, 
10 如果有其他进程可运行,将在schedule()内发生切换。 


二 定时钟断do_timer() 
11 当定时钟断发生时8235->irq0->do_timer_interrupt()->do_timer() 
12 ->update_process_times()递减当前进程的时间片, 
13 如果当前进程时间片为0,设定当前进程need_sched=1, 
14 从中断调用退出, 
15 到达ret_from_intr 
16 到达ret_with_reschedule , 
17 发现当前进程要求调度,跳转到reschedule 
18 调用schedule() 
19 schedule()处理当前进程的调度要求, 
20 如果有其他进程可运行,将在schedule()内发生切换。 


三 唤醒进程wake_up_process() 
21 当前进程调用fork()创建子进程,进入kernel 
22 当前进程调用了wake_up_process来唤醒进程x 
23 使进程x状态为RUNNING,并加入runqueue队列, 
24 调用reschedule_idle() 
25 发现进程x比当前进程更有资格运行,设定当前进程need_sched=1, 
26 从系统调用退出 
27 到达ret_from_sys_call 
28 到达ret_with_reschedule 
29 发现当前进程要求调度,跳转到reschedule 
30 调用schedule() 
31 schedule()处理当前进程的调度要求, 
32 如果有其他进程可运行,将在schedule()内发生切换。这次大多数可能切换到进程x 


四 改变进程的调度策略setscheduler() 
33 进入系统调用setscheduler() 
34 改变进程x的调度策略 
35 提前进程x在runqueue队列的位置 
36 设定当前进程need_sched=1, 
37 从系统调用退出 
38 到达ret_from_sys_call 
39 到达ret_with_reschedule 
40 发现当前进程要求调度,跳转到reschedule 
41 调用schedule() 
42 schedule()处理当前进程的调度要求, 
43 如果有其他进程可运行,将在schedule()内发生切换。 


五 系统调用礼让 sys_sched_yield() 
44 进入系统调用sys_sched_yield() 
45 如果有其他的进程,进行礼让, 
46 设定当前进程need_sched=1, 
47 从系统调用退出 
48 到达ret_from_sys_call 
49 到达ret_with_reschedule 
50 发现当前进程要求调度,跳转到reschedule 
51 调用schedule() 
52 schedule()处理当前进程的调度要求, 
53 如果有其他进程可运行,将在schedule()内发生切换。