快速业务通道

内核笔记之“Process Scheduling”

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-13
linux采用抢占式任务处理方式.内核为每个进程分配一个nice value,nice value值的范围是~20-19,值越高的进程其优先级越低(because he is more nice).在内核中还有一种实时优先权,实时优先级进程高于普通进程.
对于优先级越高的进程,系统分配给它的时间片也越多,例如nice value值为19的进程可能只分配5ms的时间片,而-20的进程可能有800ms.当一个进程的时间片用完后,等待其他进程用完自己的时间片.同时,linux内核还有一个调度原则,即给交互式进程更高优先级和更多时间片.

linux内核的调度算法位于 kernel/Schedu.c文件中,这个调度算法有两个特性:(1)每个调度算法都在常量时间内完成.(2)更好的SMP扩展(对多核处理器而言).下面介绍一下该文件的几个主要成员:
(1)struct prio_array,优先级数组,该结构体有三个成员,nr_active指出当前优先级队列上的进程数目,queue[MAX_PRIO]指不同优先级的队列,MAX_PRIO=140,代表140个优先级,相应的就有140个进程队列.如果用每一个位表示一个优先级,则对于32为的字来说,需要5个字.这就是第三个成员bitmap[BITMAP_SIZE],没当一个任务进入运行态时,相应的bitmap位就被置1.这程序很容易寻找当前优先级.
(2)struct runqueue.调度程序的核心结构体,一个处理器只能有一个runqueue,该结构体包含了两个prio_array结构的成员active,expired.
(3)schedule()函数.在runqueue中,active指向当前处于运行态并且还有剩余时间片的任务,expire指向时间片已经用完的任务,当某一任务的时间片用完之后,它就被重新分配时间片并被移动到expire队列中.当active变为空时,便将active与expire两个变量互换.
schedule()函数在一个任务被抢占时被唤醒.程序寻找bitmap中第一个为1的优先级X,然后搜寻queue[X]队列的第一个任务作为下一个运行的任务.这两个过程的时间优先级都为O(1).
(4)时间片的计算过程.当任务被创建时,它继承父进程的时间片,当时间片用完后,内核基于静态优先级计算出新时间片.如果任务的交互行较强,则时间片用尽后任务会被重新插入active队列中.但如果expire的等待时间过长的话,这种情况就不会发生.
(5)优先级的计算过程.task_struct中的static_pro代表程序的nice value,程序基于此值计算动态优先级,sllep_avg用来计算任务的交互性,当程序睡眠时,此值加上睡眠时间,当程序运行时,此值减去运行时间.
effective_prio()函数根据nice值及上面计算的交互性值来计算动态优先级并存入到task_struct中的prio成员中.
(6)对处理器的负载均衡.
当一个处理器的runqueue为空时,schedule()调用load_balance()函数(也可能会定时调用).
该函数调用find_busiest_queue()函数寻找最忙处理器.如果最忙处理器上的expire队列不为空,则将其分布到执行schedule()的处理器上,否则分布active队列.
寻找拥有任务的最高优先级队列,并将不运行及联系不紧密的任务放到空闲处理器上.
重复以上过程直到负载均衡.

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号