QNX学习笔记2 核心的作用 the kernel's role
在类比的房子中,可以有多个线程同时运行。但是在真实的操作系统中,尤其是单核CPU,每次只能运行一个程序。
单核CPU (single CPU)
内核(kernel)决定运行哪个线程,一次只能运行一个线程
多核CPU (multiple CPU ——SMP)
SMP 代表 symmetrical multi processor)
反正。。。还是一个CPU只能运行一个线程,只不过有了好多个CPU就能同时运行好多个线程。
kernel as arbiter(仲裁者)
要明白,kernel决定另一个thread运行之前要做以下两件事:
- 保存当前thread的寄存器值和环境变量
- 加载新thread的寄存器值和环境变量到CPU
kernel决定哪个thread要运行就好比mutex的优先级和等待时长机制
kernel 取决于 priority (优先级)和 scheduling policy (调度策略)
prioritization 优先级
注意!0优先级表示idle thread(空转线程) 并且你不可以使用0优先级
如果你想知道系统的优先级最值 可以使用 sched_get_priority_min() & sched_get_priority_max() 他们在<sched.h>头文件中
有两个概念
-
preemption 先占 表示CPU在运行低优先级thread 而此时有较高优先级thread请求使用CPU kernel 立即决定执行高优先级thread
-
resumption 恢复 运行完高优先级thread后,继续运行之前的低优先级thread
如果优先级相同。。往下看
scheduling policies 调度策略
主要介绍两种常用的策略 FIFO(first-in, first-out)& RR(round robin)
- FIFO 先进先出
如果没有比当前thread优先级高的thread 那么当前线程可以一直运行下去直到结束。thread可以主动停止(quit)或自愿放弃CPU 。
自愿放弃CPU可以理解为 thread休眠(go to sleep)或者 封锁信号量 (block on semaphore)。。第二个我也不知道是是啥。。
但是还有一种特殊的函数调用 叫 sched_yield() 它的作用很有意思。。就是让kernel去寻找有没有相同优先级的thread 如果有的话就会让那个thread运行 如果没有它就接着运行 反正不会让低优先级的thread运行
- round robin 轮询调度
RR大致于FIFO相同 除了在有相同优先级的情况下它不会一直运行下去 而是交替运行
每次运行的时间由 timeslice 决定 我们可以通过调用 sched_rr_get_interval() 函数设定 timeslice 的值
通常是4ms 但实际上是 ticksize 的4倍 你可以在 ClockPeriod() 中设置它
调度规则总结(for a single CPU)
- 一次只能运行一个线程
- 最高优先级的ready线程会运行
- 一个线程会一直运行直到它 block 或者 exit
- RR线程会交替运行
kernel states (内核状态)
1 running
thread正在运行
2 ready
thread可以马上运行 除了有更高优先级的thread在运行
3 block
有许多情况。。处于block状态的thread kernel不会对其进行调度,就是压根儿不会考虑它
在<sys/neutrino.h>中有对blocking state 的说明
下面从事从学习文档里面摘出来的block states 截图。。。希望有一天可以用到吧