need_resched 是怎么使用的(ZT)
2005-01-23 12:40
316 查看
终于在《情景》&think hard地情况下,想明白了!
一 系统调用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()内发生切换。
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()内发生切换。
need_sched 表示CPU从系统空间返回到用户空间前夕要进行一次调度。
相关文章推荐
- 怎么使用response.write来做一个javascript的alert弹出窗口
- 大番薯本地模式怎么使用?大番薯u盘启动盘制作工具本地模式重装系统教程
- 在jquery中怎么使用css 类名和id 来获得元素
- java中Object类的getClass方法有什么用以及怎么使用?
- windows server 2008 怎么使用历史密码
- asp.net mvc 中怎么使用iframe 呢?
- CocoStudio导出的LUA文件怎么使用?
- 使用Jakarta Commons Pool处理对象池化(二)(zt)
- Android Studio 怎么添加使用第三方jar包及无法编译的问题解决方法
- 在block中使用self怎么避免循环引用
- 快速创建ZIP文件Beyond Compare怎么使用
- [精华] zt:Eclipse使用入门
- C# WinForm程序中,使用多线程,在关闭窗体时 怎么关闭窗体的所有线程,使程序退出。
- linux 怎么使用一个c/c++库
- wpf怎么使用WindowsFormsHost(使用WinForms中的控件)
- 在.NET里用XSLT时怎么使用msxsl:script
- 怎么使用Fiddler抓取手机上的数据包
- 使用 portversion 而非 pkg_version[zt]
- (原创)使用VMware安装Ubuntu,怎么无法使用startx进入桌面模式?
- 使用thymeleaf一旦没有闭合标签就会报错怎么解决