说起Blackberry的QNX操作系统, 想必大家都听说过,但到底为什么QNX能如此有名?难道微软的Windows和Linux都不能与之抗衡?
QNX采用微内核结构,也就是说,内核非常非常非常小。这样一方面启动速度非常快,另一方面安全性稳定性大大提高。
QNX构架是有一个微型内核,然后又包含许多相关进程。这样的好处是,即使有一个进程出错,也不会影响内核。
各个服务进程以及应用进程之间通过内部进程通信IPC的方式进行沟通,如下图:
那什么是进程(pid)呢?如下图:
进程包含自己的一些资源,比如说ID, 内存(代码和数据),计时器,等等…, 并且这些资源是被保护的,也就是说其他进程不能访问。
线程是什么?
一个线程就是一个执行流或者控制流。
它也有一些属性,比如:优先级, 调度算法,寄存器集合,CPU掩码(用于多核应用),等……
而所有的这些属性都会作用在正在运行的代码上。
1 Kernel
顾名思义,核心模块。因为它,系统的各个模块可以协作
其他程序可以通过kernel call的方式来调用核心模块,来执行kernel的代码
大部分的子系统,包括用户应用软件,互相通信都是通过kernel call的方式
kernel call是采用抢占的方式(pre-emptable)被调用的。好处是,响应新的事件速度会很快,不好是要花更多的时间去恢复到原来被打断的kernel call。
内核可以提供不同的服务,比如: 同步,时钟,进程间通信,调度等等
kernel提供的进程之间的通信种类有三种:
a. Messages, 进程间交换信息
b. Pulses,传递通知给进程
c. Signals, 中断进程,并让它做点别的事情
事实上,kernel可以被想象成一个library, 并没有一直不停运行的循环进程(no while(1)). 只有在被调用的时候才运行。
2 Process Manager
procnto = Process manager + Micarokernel
Process Manager提供服务包括:
a. 捆绑一组threads一起进入process
b. 内存保护,内存空间管理,QNX使用虚拟内存地址
c. 路径名管理
d. process创建和结束
e. 一个idle线程在cpu上运行,当cpu空闲的时候
3 Scheduling
Thread都有两个状态: blocked和runnable。
Thread都有优先级(0-255),kernel总是选择优先级最高的thread来执行。
Thread都有属于自己的调度算法,(Round-robin, FIFO等等)
Round-robin 该术语来源于含义为“带子”的法语词ruban,久而被讹用并成为惯用语。在17、18世纪时法国农民希望以请愿的方式抗议国王时,通常君主的反应是将请愿书中最前面的两至三人逮捕并处决,所以很自然地没有人希望自己的名字被列在前面。为了对付这种专制的报复,人们在请愿书底部把名字签成一个圈(如同一条环状的带子),这样就找不出打头的人,于是只能对所有参与者进行同样的惩罚。
4 Resource manager
资源管理,顾名思义,就是提供POSIX规范的接口来管理资源。比如open文件、read文件、写文件…
5 总结
稍微总结一下:
—QNX是一个微核架构
—进程拥有自己的资源,线程以及代码
—QNX采用抢占式调度策略
版权声明:本文为知乎博主「强大的宇宙」原创文章
原文始发于微信公众号(Vehicle攻城狮):漫谈QNX(1)–架构