赞
踩
这一周为了准备OS课程的Seminar而去研究了一下Unix的进程调度,从网上的资料和我查阅的纸质资料上看,研究System V的比较多,所以我就拿System V来做例子。
需要注意的一点是,System V第一个版本是1983年发布的,Sytem V Release 4(1988)最成功的一个版本,离现在也有点久远了,*nix各种分支进化到现在和80年代比应该发生了比较大的变化,但是它们的设计思想还是值得研究一番的。
系统态
执行时完成子程序嵌套和中断处理时使用的信息保留区,只能被系统态进程使用。用户态
执行时完成子程序嵌套和中断处理时使用的信息保留区。
PSW:处理器状态寄存器:反映了当前执行进程的访问方式,比如进程在何种状态下执行、中断的优先级的状态是怎样的、进入中断或陷入指令之前处理器的执行方式是怎样的等等。
动态优先级多级反馈循环调度法(Round Robin With Multilevel Feedback)
Unix是根据优先数来判断进程调度优先级的。
优先数是进程的proc结构中的char p_pri字段,值的范围是0-127,优先数越小,优先级越高。
0-49之间的优先数是系统态进程的优先级,用户态下的进程优先级为50-127之间。
p_pri = p_cpu / 2 + PUSER + p_nice + NZERO
一个时间片结束后,系统将每个进程的p_cpu除以2,这个过程称为衰减。
衰减过后,系统重新计算每个进程的p_pri
分析一下这条公式,系统运行时PUSER和NZERO是常数,而p_nice一般也是一个常数,所以进程优先数就取决于p_cpu。对于那些占用CPU较长时间的进程,其优先数在衰减后还是比那些最近占用CPU较短的进程大,所以其优先级会变小,反过来,那些不怎么占用CPU的进程的优先级会增加,所以会在下一次调度中被执行。这是一种负反馈调节。
优先数0-49是内核保留的优先数,当进程睡眠(阻塞)时,就会被赋予一个系统优先级(0-49),由于比用户优先数小,所以这些进程醒来的时候(比如IO完成)能被及时处理。
关于调度时机,是让我比较疑惑的一点,我手上的中文教材和网上的一个课件说的都是调度时机有以下两个:
系统态
转入用户态
时,系统安排一次调度,这样做的意图是使那些被设置了高优先级调度标志,并且在内存中就绪的进程可以有机会抢先进入执行状态然而在查到的外文资料里没有提到“调度时机”。
如果是以上两个调度时机,那么说明在时间片结束的时候可能没有调度发生,因为只是发生了优先数计算,那么假设有一个用户态进程在执行过程中进行了大量计算(或者死循环),既没有主动放弃处理机,也没有从系统态到用户态的转换,那么处理机就一直被它占用。
0号进程一直是系统态,如果0号进程在时间片结束、计算完优先数并设置标记以后,让之前的用户进程继续执行,是否算是一种“系统态到用户态的转换”?如果是,那么就出现了调度时机,这种时机的安排就是有效的。
虽然有这个疑问,不过调度的主要思想我已经理解,也许后面的学习中这些疑问都会被解决。
参考资料
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。