nice值的范围有限,即为[-20, 19],也就是40个数字,优先级为[60, 99]即一共40个优先级
目前谈论的Linux操作系统叫做分时操作系统,调度的时候主要强调公平,还有一种是实时操作系统,比如智能汽车里面必须装有这种实时操作系统,要不然如果刹车还需要经过时间片的话,就来不及了
Linux系统中每一个CPU都有一个运行队列:
queue[140] -- >task_struct *queue[140]
本质上是一个数组,内部有140项
这里只会使用它下标的100 -- 139,前面0 -- 99我们不考虑,而进程的优先级刚好是40个,100 -- 139也刚好是40个下标,即优先级 + 40就可以映射到数组下标相应位置
当一个优先级为60的进程入队列的时候,实际上就是把PCB列入到队列100下标的位置中,若还有同优先级类型,则插到后边:
但是当前面无进程插入,而最开始的是优先级为80,下标为120时,就会把前面的空位置全部遍历,导致效率下降
这时bitmap[5]就起到作用了,它是一个位图:
若下标为100处有进程,则第一百个比特位为1。
为什么是[5]呢,因为它为long类型,一个则为4个字节,4个就是4 * 4 * 8 = 128个比特位,5个就是5 * 4 * 8 = 160个比特位,足够140个数组位置的映射
这时候就不用去一个一个遍历数组,而是可以32位32位的去检测是否存在进程需要调度
即时间复杂度O(1)快速找到系统中最合适的进程去调度
实际上我们的运行队列中会存在两批相同的结构
struct q
{
int nr_active;
bitmap[5];
queue[140];
}
struct q array[2];
这就是Linux内核真正的O(1)调度进程算法