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() 他们在<sched.h>头文件中

有两个概念

  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不会对其进行调度,就是压根儿不会考虑它

在<sys/neutrino.h>中有对blocking state 的说明

下面从事从学习文档里面摘出来的block states 截图。。。希望有一天可以用到吧
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值