内核笔记之“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 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |
你可能对下面的文章感兴趣
上一篇: Linux命令学习手册-tar命令下一篇: linux 模拟发邮件centos
关于内核笔记之“Process Scheduling”的所有评论