need_resched 是怎么使用的(ZT)

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()内发生切换。 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值