QNX微内核介绍

[复制链接]
303|9
手机看帖
扫描二维码
随时随地手机跟帖
keer_zu|  楼主 | 2022-9-19 16:09 | 显示全部楼层 |阅读模式
QNX微内核介绍
QNX采用微内核结构,也就是说,内核非常非常非常小。这样一方面启动速度非常快,另一方面安全性稳定性大大提高。
QNX构架是有一个微型内核,然后又包含许多相关进程。这样的好处是,即使有一个进程出错,也不会影响内核。
各个服务进程以及应用进程之间通过内部进程通信IPC的方式进行沟通,如下图:

137076328239640312.png

Threads run code, Processes own resources

使用特权

评论回复

相关帖子

keer_zu|  楼主 | 2022-9-19 16:12 | 显示全部楼层
1. 进程PID
进程包含自己的一些资源,比如说ID, 内存(代码和数据),计时器,等等…, 并且这些资源是被保护的,也就是说其他进程不能访问

533632824210cb0a.png
进程API

fork(), exec(), spawn(), spawn(), posix_spawn()**

672586328242bb806a.png


fork

使用特权

评论回复
keer_zu|  楼主 | 2022-9-19 16:15 | 显示全部楼层
2. 线程TID

一个线程就是一个执行流或者控制流。
它也有一些属性,比如: 优先级, 调度算法,寄存器集合,CPU掩码(用于多核应用),…

27135632824d5b88ec.png

一个Process里的Threads都有属于自己的内存地址(虚拟地址), 其他资源都是共享的

57487632824ed7806b.png

每一个thread都有一个最大体积,也不是每一个都需要分配物理内存

6880363282522dd404.png


使用特权

评论回复
keer_zu|  楼主 | 2022-9-19 16:17 | 显示全部楼层
线程API

pthread_create() 创建线程, 返回tid,
pthread_attr_init() 设置线程的default值

如果想设置thread优先级和调度算法:

param.sched_priority = 15; %优先级值为15
pthread_attr_setschedparam (&attr, ¶m); %给该thread设定优先级
pthread_attr_setschedpolicy (&attr, SCHED_RR); %设定调度算法为Round-Robin

Process里面,第一个thread就是main thread, 因为它调用了整个process的main()函数. 如果exit()被调用,那么整个process就结束死亡了,所有的相应的资源(内存,channels等)都会被释放或清理

同样的道理,如果在一个thread里, 如果pthread_exit()被调用了,那么thread也就会结束死亡。




使用特权

评论回复
keer_zu|  楼主 | 2022-9-19 16:20 | 显示全部楼层
3. Synchronization
multi-threads引入了新的问题,比如公用内存空间,多个线程同时写入会相互覆盖对方的值,读取时页不知道什么时候时稳定的有效数据.
所以我们需要同步机制 Synchronization来协调管理

3.1 **Mutual exclusion (Mutex) **
Mutual exclusion (缩写Mutex)意味着只有一个thread在某一时间里可以执行某段重要的代码段,或者读写一些特别的数据
一个形象的比喻:
把厕所空间比喻成内存空间,每次只能进去一个人,里面有人的时候,其他人就不能进去了。这代表一个thread使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存. 问题是如何防止别人也同时进去呢?
2648063282610ba62c.png
一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫"互斥锁"(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。
Mutex就是一个process内的对于所有threads来说的全局0/1变量,你要锁的时候就把这个全局变量Mutex设置为1,其他的thread读到这个Mutex的时候就知道你在使用,就停下来等,知道你用完了把Mutex设置回0,然后别的进程才可以进去用
当然一旦锁定了Mutex,该thread的优先级就会上升。因为系统当然希望这个thread赶紧运行完毕,毕竟不能占着茅坑不拉屎。
779296328262e03e28.png
3.2 条件锁 Condvars
光有互斥锁还是不够,最好有一把聪明的互斥锁。比如说,只有满足了某种条件(收到某种信号)的情况下,才能解锁。这样就会更高效的执行程序功能

使用特权

评论回复
keer_zu|  楼主 | 2022-9-19 16:21 | 显示全部楼层
Kernel

核心模块,因为他,系统的各个模块可以协作. 其他程序可以通过kernel call的方式来调用kernel模块,

538966328268e917e2.png

Kernel call 采用抢占方式(pre-emptable) 被调用, 好处是,响应新的事件速度会很快,但是要花更多的事件去回复原来被打断的kernel call.
内核可以提供不同的服务, 比如: 同步, 时钟, 进程间通信,调度 …

99653632826a60a54d.png


使用特权

评论回复
keer_zu|  楼主 | 2022-9-19 16:23 | 显示全部楼层
Kernel 提供的进程间的通信方式
  • Messages 进程间交换信息
  • Pluses 传递通知给进程
  • Signals 中断进程,让它做别的事情
63813632826da9cf48.png
事实上,kernel可以被想象成一个library, 并没有一直不停运行的循环进程. 只有在被调用的时候才运行

使用特权

评论回复
keer_zu|  楼主 | 2022-9-19 16:24 | 显示全部楼层
Process Manager

procnto = Process manager + Micarokernel

3654263282727ba93a.png

Process Manager提供服务包括:

  • 捆绑一组threads一起进入process
  • 内存保护,内存空间管理, QNX使用虚拟内存地址
  • 路径名管理
  • Process创建和结束
931886328273f97a73.png

使用特权

评论回复
keer_zu|  楼主 | 2022-9-19 16:25 | 显示全部楼层
Scheduling 调度

Thread有两个状态: blocked 和 runnable
Thread有优先级: 0-255, kernel总是选择优先级最高的thrad来执行
Thread有属于自己的调度算法: Round-robin(轮询), FIFO …

Round-robin 该术语来源于含义为“带子”的法语词ruban,久而被讹用并成为惯用语。在17、18世纪时法国农民希望以**的方式**国王时,通常君主的反应是将**书中最前面的两至三人逮捕并**,所以很自然地没有人希望自己的名字被列在前面。为了对付这种专制的报复,人们在**书底部把名字签成一个圈(如同一条环状的带子),这样就找不出打头的人,于是只能对所有参与者进行同样的惩罚。


使用特权

评论回复
keer_zu|  楼主 | 2022-9-19 16:25 | 显示全部楼层
Resource Manager
资源管理器,提供POSIX规范的接口来管理资源. 比如open文件,read文件,write文件…

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群:49734243 Email:zukeqiang@gmail.com

1303

主题

12221

帖子

53

粉丝