1.调度类
LINUX中有四种调度类(优先级从高到低),这里我们只介绍我们最常用的,完全公平类。
名称 | 优先级 |
停止类 | - |
实时类 | 0-99 |
完全公平类 | 100-139 |
空闲类 | - |
2.调度算法
2.1 task_struct* queue[140]
首先我们来看task_struct* queue[140](task_struct 是Linux的pcb),这是一个容量为140,内容类型为 task_struct* 的指针数组,这个数组下标100-139是给完全公平类用的,正好对应Linux中进程的40个优先级(60-99),如果进程的优先级为60,那么我就把这个进程的pcb链入queue[100]中,同理进程优先级为80,就把pcb链入queue[120]中(如右图)。
2.2 int bit_map[5]
因为进程的优先级是不同的,queue队列中不一定每个优先级都会有进程,想要知道哪个优先级有进程必须遍历一遍queue,bit_map的出现很好的解决了这个问题,如果queue的某个优先级存在进程,就把该优先级所对应的bit_map的位变为1,这样就可以直接遍历bit_map,如果bit_map[0] = 0就说明0 - 31个优先级内没有进程。
3.3 *actvie和*expried
现有一个进程优先级为80的进程将要被执行,现在我不断插入进程优先级为60的进程,这个时候优先级低的进程就会一直等待,所以设计出了,活跃进程和过期进程,*active指向活跃进程,*expried指向过期进程,cpu在执行的过程中,只会找活跃进程,而我们插入新的进程,只会插入到过期队列,当活跃进程执行完,会将*active与*expried交换,过期进程变为活跃进程。
//过期进程
struct p{
int nr_active;//进程数
int bit_map[5];
task_struct * queue[140]; //过期队列
}