Linux系统的线程是内核线程,所以Linux系统的调度是基于线程调度的,而不是基于进程的。
为了进行调度,Linux系统将线程区分为三类:
1)实时先入先出
2)实时轮转
3)分时
实时先入先出线程具有最高优先级,它不会被其他线程抢占,除非那是一个刚刚准备好的、拥有更高优先级的实时先入先出线程。实时轮转线程有一个运行时间量,时间到了就可以被抢占。当有多个实时轮转线程时,每个线程运行它的时间量规定的时间,然后插入实时轮转线程列表的末尾。在系统内部,实时线程的优先级从0到99,0最最高,99最低。另外,Linux实时线程并不是真正的实时线程,执行的最后期限无法确定,只是实时线程比分时线程具有更高的优先级而已。
分时线程的优先级从100到139,也就是说Linux系统区分140级的优先级。分时线程的调度类似实时轮转,获得一定的运行时间量。
Linux系统给每个线程分配一个nice值(即优先级调节值)。默认为0,但可以通过系统调用nice(value)来修改,修改分为从-20到+19。这个值决定了线程的静态优先级,注意,只是静态优先级。
有静态优先级就有动态优先级。Linux系统线程的动态优先级不断地被重新计算,其目的在于:(1)奖励互动进程,(2)惩罚占用CPU的进程。最高优先级奖励是-5,最低优先级奖励是5。交互进程IO等待较多,CPU占用很少,但是对响应时间要求较高,较小的响应时间可以极大地提高交互进程的用户体验。因此交互进程常常因为IO等待而阻塞,IO完成后让其获得较高的优先级可以有利于其快速获得调度。而CPU密集进程对响应时间要求较低,在交互进程等待IO期间它便可以获取CPU资源。