linux系统的线程是内核线程,所以linux系统的调度是基于线程而不是基于进程的
为了进行调度,linux系统将线程区分为三类:
实时先入先出
实时轮转
分时
在系统内部,linux系统区分140个优先级,实时线程的优先级从0-99,0是最高优先级,99是实时线程的最低优先级,100-139是非实时线程优先级
调整静态优先级:
linux系统给每个线程分配一个Nice值(优先级调节值),这个值决定线程的静态优先级.默认值是0,修改范围是-20到+19;
调整动态优先级:
奖励互动进程,惩罚占用CPU进程,调整范围是-5 --5之间
不同的优先级被赋予不同的时间片长度,linux操作系统会赋予高优先级的进程较长的时间片
linux调度算法使用一个重要的数据结构
调度队列:调度队列中有两个数组,一个是活动的,一个是过期失效的,这两个分量都是指向数组的指针,每个数组都包含了140个链表头,每个链表具有不同的优先级,链表头指向给定优先级的双向进程链表
调度器从正在活动的数组中选择优先级最高的任务,如果这个时间片过期失效,就把它移到过期失效的数组中。当正在活动的数组中没有其他任务了,调度器交换指针,使得正在活动数组变为失效过期数组,过期失效数组变为正在活动数组
等待队列:等待队列的头包含一个指向任务链表的指针和一个自旋锁
调度器将可以运行的任务放入调度序列中,不可运行的任务和正在等待的IO操作放入等待队列中