首先,Linux是一个时分操作系统,普通线程每次被调度获得运行的最长时间是确定的linux判断线程是否在运行,即一个tick,通过内核CONFIG_HZ可配置。在tick中断时会发生,内核会触发线程调度;同时,当前正在运行的线程主动让出CPU时,也会触发调度。除此之外,其它中断、系统调用等也能触发线程调度。
linux线程优先级的范围是0~139,值越小,优先级越高。userspace线程优先级的范围是100~139红旗linux操作系统,默认创建的线程优先级是120,对应的nice值是0,nice值的范围是-20~19,对应的优先级是100~139。只有内核线程才支持高于100的优先级,优先级高于100的线程称为RT级线程。
在userspace中,可以设置线程的nice值,nice值越小,该线程通过调度获得运行的机会越大。但不是说nice值小的线程占有CPU直至执行完毕,nice值大的线程能够获取CPU。诸如:2个相同执行体linux判断线程是否在运行,不同nice值的线程,每位线程运行时间为5个tick,两线程同时启动,在每次tick中断发生时,内核调度nice值小的线程的机率是3/4,nice值大的线程的机率是1/4,这样硬盘安装linux,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),超过了,内核就是调度普通线程。