在类比的房子中,可以有多个线程同时运行。但是在真实的操作系统中,尤其是单核CPU,每次只能运行一个程序。
内核(kernel)决定运行哪个线程,一次只能运行一个线程
SMP 代表 symmetrical multi processor)
反正。。。还是一个CPU只能运行一个线程,只不过有了好多个CPU就能同时运行好多个线程。
要明白,kernel决定另一个thread运行之前要做以下两件事:
kernel决定哪个thread要运行就好比mutex的优先级和等待时长机制
kernel 取决于 priority (优先级)和 scheduling policy (调度策略)
注意!0优先级表示idle thread(空转线程) 并且你不可以使用0优先级
如果你想知道系统的优先级最值 可以使用 sched_get_priority_min() & sched_get_priority_max() 他们在
有两个概念
preemption 先占 表示CPU在运行低优先级thread 而此时有较高优先级thread请求使用CPU kernel 立即决定执行高优先级thread
resumption 恢复 运行完高优先级thread后,继续运行之前的低优先级thread
如果优先级相同。。往下看
主要介绍两种常用的策略 FIFO(first-in, first-out)& RR(round robin)
如果没有比当前thread优先级高的thread 那么当前线程可以一直运行下去直到结束。thread可以主动停止(quit)或自愿放弃CPU 。
自愿放弃CPU可以理解为 thread休眠(go to sleep)或者 封锁信号量 (block on semaphore)。。第二个我也不知道是是啥。。
但是还有一种特殊的函数调用 叫 sched_yield() 它的作用很有意思。。就是让kernel去寻找有没有相同优先级的thread 如果有的话就会让那个thread运行 如果没有它就接着运行 反正不会让低优先级的thread运行
RR大致于FIFO相同 除了在有相同优先级的情况下它不会一直运行下去 而是交替运行
每次运行的时间由 timeslice 决定 我们可以通过调用 sched_rr_get_interval() 函数设定 timeslice 的值
通常是4ms 但实际上是 ticksize 的4倍 你可以在 ClockPeriod() 中设置它
thread正在运行
thread可以马上运行 除了有更高优先级的thread在运行
有许多情况。。处于block状态的thread kernel不会对其进行调度,就是压根儿不会考虑它
在