简述
linux系统调度执行的最小单位是线程,线程的调度策略有以下三种:
(1)SCHED_FIFO
其静态优先级必须设置为1~99,这将意味着一旦线程处于就绪态,他就能立即抢占任何静态优先级为0的普通线程。采样SCHED_FIFO调度策略的线程还遵循以下原则:
- 当他处于就绪态时,就会被放入其所在优先级队列的队尾位置
- 当被更高优先级的线程抢占后,他会被放入其所在优先级队列的队头位置,当所有优先级比他高的线程不再运行后,他就恢复运行
- 当它调用sched_yield()后,他会被放入其所在优先级队列的队尾位置
总的来说,一个具有SCHED_FIFO调度策略的线程会一直运行直到发送I/O请求,或被更高优先级线程抢占,或调用sched_yield()主动让出cpu
(2)SCHED_RR
这种策略的情况与SCHED_FIFO类似,区别是:每一个SCHED_RR策略下的线程都会被分配一个时间片,当时间片耗光时,它会被放入其所在优先级队列的队尾位置。
可以用sched_rr_get_interval()来获取时间片的具体数值。
(3)SCHED_OTHER
其静态优先级必须设置为0,该策略是linux系统调度的默认策略,处于0优先级的这些线程按照所谓的动态优先级(nice值)被调度,且每当一个线程已处于就绪态但被调度器调度无视的时候,其动态优先级会自动增加一个单位,这样能保证这些线程竞争cpu的公平性。
如何设置线程的静态优先级和动态优先级,相关的API如下: