我们发现操作系统中有很多等待队列,也就是说进程需要排队,而排队的本质就是确认优先级,优先级高的排在前面,低的排在后面
为什么要有优先级?
本质就是资源不足,就像我们去食堂打饭需要排队一样,如果窗口够多,我们就不需要排队
优先级是什么?
是为了得到某种资源的先后顺序
怎么做?
优先级其实就是pcb中的一个int字段,数值越小,优先级越大
大家要分清楚优先级和权限这两个概念:权限是能不能做某件事/访问某个资源,而优先级是你访问资源的先后顺序,前提是你有这个权限
Linux中进程优先级范围是60~99,一般进程的默认优先级为80
Linux是支持动态优先级调整的,通过进程中pcb中的nice值:进程优先级的修正数据
pri(新)=pri(旧)+nice
下图是修改优先级的方法之一
UID : 代表执行者的身份PID : 代表这个进程的代号PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号PRI :代表这个进程可被执行的优先级,其值越小越早被执行NI :代表这个进程的nice值
注意:
1、pri(新)=pri(旧)+nice,这里的pri(旧)=80不会变,我们每次就只能在80的基础上改变
2、nice的范围是 [-20,19],小于-20的按-20算,大于19的按19算
这里解释一下,优先级的范围被限定的原因---为了保证公平,即所有的进程都能被合理调度,如果一个进程的优先级太高会导致优先级低的进程长时间得不到CPU的资源,产生进程饥饿
下面介绍几个概念?
前面三个概念都很容易理解,这里主要还是讲一下并发,我们的电脑一般都是单核CPU,我们的CPU在运行程序时,不是一个进程一直在运行,它是每个进程都会运行一个时间片(这个和计算机组成原理有关),然后进行轮换,如果有进程的优先级高于将要运行的进程,那么它就会优先抢占CPU资源,这种方式叫做基于时间片的轮转式抢占式内核,由于时间片很短,所以在我们看来这些进程好像是同时运行的,所以叫并发
上图的两个指针active和expired的来回交换就实现了总体进程的切换,并且保证了每个进程都能被调度,如果只有一个指针数组存放队列,那么我们只要不停的创建优先级高的进程,那么优先级低的进程就一直不会被调度,造成进程饥饿,无法保证调度的公平。