(转)need_resched 是怎么使用的(ZT)

news/2024/7/4 20:34:10

终于在《情景》&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从系统空间返回到用户空间前夕要进行一次调度。


http://www.niftyadmin.cn/n/4464091.html

相关文章

nginx环境下配置nagios-关于nginx.conf

nginx.conf配置 user nagios nagios; worker_processes 4; worker_cpu_affinity 00000001 00000010 00000100 00001000; error_log /export/servers/nginx/logs/nginx_error.log notice; pid /export/servers/nginx/l…

need_sched 一些讨论

我想写一个简单的设备驱动, 但对驱动模块的可重入方面不甚了解. 有的书说驱动模块不会被中断, 除非主动地调用schedule()(或是隐式 地调用, 如vmalloc()); 有的书则说即使schedule()被调用, 它也不会 去作进程切换, 因为schedule()不对内核态进程切换. 不知谁对? 望高人指…

nginx环境下配置nagios-关于nagios配置文件

接上文:nginx环境下配置nagios-关于nginx.conf nagios文件应该处于conf/domain/目录下 nagios配置如下: server {listen 80;server_name 192.168.44.44;index index.html index.htm index.php;root /usr/local/nagios/share;auth_basic "…

操作系统多级页表计算问题

某计算机有64位虚地址空间,页大小是2048B.每个页表项长为4B。因为所有页表都必须包含在一页中,故使用多级页表,问一共需要多少级? 最佳答案2048B2^11 64-1153(地址中扣除页内地址位数) 共有2^53页一页中可…

nginx环境下配置nagiosQL-关于nagiosql配置文件

接上文:nginx环境下配置nagios-关于nginx.conf nagiosql文件应该处于conf/domain/目录下 nagiosql配置如下: server {listen 8088;server_name 192.168.44.44;index index.html index.htm index.php;root /usr/local/nagios/nagiosql/;locatio…

函数ERR_PTR,PTR_ERR还有IS_ERR理解

ERR_PTR()和PTR_ERR()都是很简单的类型转换,没有什么可说的。 IS_ERR()有一些妙处。 内核中的函数常常返回指针,问题是如果出错,也希望能够通过返回的指针体现出来。 所幸的是,内核返回的指针一般是指向页面的边界(4K边界)&#x…

nginx环境下配置nagios-关于start_perl_cgi.sh

文件配置如下: #!/bin/bash set -x dir/export/servers/nginxstop () { #pkill -f $dir/perl-fcgi.pl kill $(cat $dir/logs/perl-fcgi.pid) rm $dir/logs/perl-fcgi.pid 2>/dev/null rm $dir/logs/perl-fcgi.sock 2>/dev/null echo "stop perl-fcgi d…

sys_call_table undefined 及 如何替换系统调用

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://chenm.blogbus.com/logs/52077181.html 2.4的内核中可以通过修改sys_call_table来很轻松的替换系统调用,来完成很多trick,很多的rootkit就是基于这种手法来完成的。…