首先,Linux是一个时分操作系统,普通线程每次被调度获得运行的最长时间是确定的,即一个tick,通过内核 CONFIG_HZ可配置。在tick中断时会发生,内核会触发线程调度;同时,当前正在运行的线程主动让出CPU时,也会触发调度。除此之外,其它中断、系统调用等也能触发线程调度。
linux线程优先级的范围是 0 ~ 139,值越小,优先级越高。user space 线程优先级的范围是 100 ~ 139,默认创建的线程优先级是120,对应的nice值是0,nice值的范围是 -20 ~ 19,对应的优先级是 100 ~ 139。只有内核线程才支持低于100的优先级,优先级低于100的线程称为RT级线程。
在user space中,可以设置线程的nice值,nice值越小,该线程通过调度获得运行的机会越大。但不是说nice值小的线程占有CPU直到执行完毕,nice值大的线程才能获取CPU。比如:2个相同执行体,不同nice值的线程,每个线程运行时间为5个tick,两线程同时启动,在每次tick中断发生时,内核调度nice值小的线程的概率是3/4, nice值大的线程的概率是1/4,这样,nice值小的线程会早于nice值大的线程执行完毕,但在nice值小的线程执行完毕时,nice值大的线程也肯定获得过运行,比如1个tick。而不会像RTOS那样,高优先级的线程执行完毕前,低优先级的线程是得不到CPU运行的。
在内核中,可以设置某个线程为RT级,即优先级值低于100,同时必须设置该线程相应的调度策略(SCHED_FIFO或SCHED_RR )。RT级线程能最大限度地优先获得CPU,并且优先级高的线程一定优先被调度。但是,对于整个系统,所有RT级线程对CPU占用有个限制,即不能在 sched_rt_period_us 时间内连续占用超过 sched_rt_runtime_us。(这两个值位于/proc/sys/kernel/sched_rt_period_us 和 /proc/sys/kernel/sched_rt_runtime_us),超过了,内核就是调度普通线程。