分享
 
 
 

Linux 2.4进程调度分析 2

王朝system·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

3. current

核心经常需要获知当前在某CPU上运行的进程的task_struct,在Linux中用current指针指向这一描述符。current的实现采用了一个小技巧以获得高效的访问速度,这个小技巧与Linux进程task_struct的存储方式有关。

在Linux中,进程在核心级运行时所使用的栈不同于在用户级所分配和使用的栈。因为这个栈使用率不高,因此仅在创建进程时分配了两个页(8KB),并且将该进程的task_struct安排在栈顶。(实际上这两个页是在分配task_struct时申请的,初始化完task_struct后即将esp预设为页尾作为进程的核心栈栈底,往task_struct方向延伸。)

因此,要访问本进程的task_struct,只需要执行以下简单操作:

__asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL));

此句将esp与0x0ffffe000作"与"运算,获得核心栈的首页基址,此即为task_struct的地址。

4. schedule_data

task_struct是用于描述进程的数据结构,其中包含了指向所运行CPU的属性。在Linux中,另有一个数据结构对应于CPU,可以利用它访问到某CPU上运行的进程,这个数据结构定义为schedule_data结构,包含两个属性:curr指针,指向当前运行于该CPU上的进程的task_struct,通常用cpu_curr(cpu)宏来访问;last_schedule时间戳,记录了上一次该CPU上进程切换的时间,通常用last_schedule(cpu)宏来访问。

为了使该数据结构的访问能与CPU的Cache line大小相一致,schedule_data被组织到以SMP_CACHE_BYTES为单位的aligned_data联合数组中,系统中每个CPU对应数组上的一个元素。

5. init_tasks

调度器并不直接使用init_task为表头的进程链表,而仅使用其中的"idle_task"。该进程在引导完系统后即处于cpu_idle()循环中(详见"其他核心应用的调度相关部分"之"IDLE进程")。SMP系统中,每个CPU都分别对应了一个idle_task,它们的task_struct指针被组织到init_tasks[NR_CPUS]数组中,调度器通过idle_task(cpu)宏来访问这些"idle"进程(详见"调度器工作流程")。

6. runqueue_head

以runqueue_head为表头的链表记录了所有处于就绪态的进程(当前正在运行的进程也在其中,但idle_task除外),调度器总是从中选取最适合调度的进程投入运行。

三. 就绪进程选择算法

Linux schedule()函数将遍历就绪队列中的所有进程,调用goodness()函数计算每一个进程的权值weight,从中选择权值最大的进程投入运行。

进程调度权值的计算分为实时进程和非实时进程两类,对于非实时进程(SCHED_OTHER),影响权值的因素主要有以下几个:

1. 进程当前时间片内所剩的tick数,即task_struct的counter值,相当于counter越大的进程获得CPU的机会也越大,因为counter的初值与(-nice)相关,因此这一因素一方面代表了进程的优先级,另一方面也代表了进程的"欠运行程度";(weight = p->counter;)

2. 进程上次运行的CPU是否就是当前CPU,如果是,则权值增加一个常量,表示优先考虑不迁移CPU的调度,因为此时Cache信息还有效;(weight += PROC_CHANGE_PENALTY;)

3. 此次切换是否需要切换内存,如果不需要(或者是同一进程的两个线程间的切换,或者是没有mm属性的核心线程),则权值加1,表示(稍微)优先考虑不切换内存的进程;(weight += 1;)

4. 进程的用户可见的优先级nice,nice越小则权值越大。(Linux中的nice值在-20到+19之间选择,缺省值为0,nice()系统调用可以用来修改优先级。)(weight += 20 - p->nice;) 对于实时进程(SCHED_FIFO、SCHED_RR),权值大小仅由该进程的rt_priority值决定(weight = 1000 + p->rt_priority;),1000的基准量使得实时进程的权值比所有非实时进程都要大,因此只要就绪队列中存在实时进程,调度器都将优先满足它的运行需要。

如果权值相同,则选择就绪队列中位于前列的进程投入运行。

除了以上标准值以外,goodness()还可能返回-1,表示该进程设置了SCHED_YIELD位,此时,仅当不存在其他就绪进程时才会选择它。

如果遍历所有就绪进程后,weight值为0,表示当前时间片已经结束了,此时将重新计算所有进程(不仅仅是就绪进程)的counter值,再重新进行就绪进程选择(详见"调度器工作流程")。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有