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运行之前要做以下两件事:

  1. 保存当前thread的寄存器值和环境变量
  2. 加载新thread的寄存器值和环境变量到CPU

kernel决定哪个thread要运行就好比mutex的优先级和等待时长机制

kernel 取决于 priority (优先级)和 scheduling policy (调度策略)

四、prioritization 优先级

注意!0优先级表示idle thread(空转线程) 并且你不可以使用0优先级

如果你想知道系统的优先级最值 可以使用 sched_get_priority_min() & sched_get_priority_max() 他们在头文件中

有两个概念

  1. preemption 先占 表示CPU在运行低优先级thread 而此时有较高优先级thread请求使用CPU kernel 立即决定执行高优先级thread

  2. resumption 恢复 运行完高优先级thread后,继续运行之前的低优先级thread

如果优先级相同。。往下看

五、scheduling policies 调度策略

主要介绍两种常用的策略 FIFO(first-in, first-out)& RR(round robin)

  1. FIFO 先进先出

如果没有比当前thread优先级高的thread 那么当前线程可以一直运行下去直到结束。thread可以主动停止(quit)或自愿放弃CPU 。

自愿放弃CPU可以理解为 thread休眠(go to sleep)或者 封锁信号量 (block on semaphore)。。第二个我也不知道是是啥。。

但是还有一种特殊的函数调用 叫 sched_yield() 它的作用很有意思。。就是让kernel去寻找有没有相同优先级的thread 如果有的话就会让那个thread运行 如果没有它就接着运行 反正不会让低优先级的thread运行

  1. round robin 轮询调度

RR大致于FIFO相同 除了在有相同优先级的情况下它不会一直运行下去 而是交替运行

每次运行的时间由 timeslice 决定 我们可以通过调用 sched_rr_get_interval() 函数设定 timeslice 的值

通常是4ms 但实际上是 ticksize 的4倍 你可以在 ClockPeriod() 中设置它

六、调度规则总结(for a single CPU)

  1. 一次只能运行一个线程
  2. 最高优先级的ready线程会运行
  3. 一个线程会一直运行直到它 block 或者 exit
  4. RR线程会交替运行

七、kernel states (内核状态)

1 running

thread正在运行

2 ready

thread可以马上运行 除了有更高优先级的thread在运行

3 block

有许多情况。。处于block状态的thread kernel不会对其进行调度,就是压根儿不会考虑它

中有对blocking state 的说明

下面从事从学习文档里面摘出来的block states 截图。。。希望有一天可以用到吧
QNX学习笔记2 核心的作用 the kernel's role_第1张图片

你可能感兴趣的:(QNX学习笔记2 核心的作用 the kernel's role)