体系结构
QNX具有实时系统的基本特征
- 多任务
- 基于优先级的抢占式调度
- 快速的上下文切换
QNX是通过如下两个基本原理实现它独特的高效性、模块化和简易性
- 微内核(microkernel architecture)
- 基于消息的进程间通信(message-based interprocess communication)
QNX的微内核概述
qnx有一个非常高效的微内核,它负责管理一组同时工作的进程。
QNX微内核是个真正的微内核。首先,它非常小;其次,它的两个重要的任务是:
- 消息传递:处理操作系统所有进程间的消息传递
- 任务调度:当进程的状态改变或者中断发生时进行调度
QNX的系统进程包括
- ProcessManager(Proc)——进程管理器
- FilesystemManager(Fsys)——文件系统管理器
- DeviceManager(Dev)——设备管理器
- NetworkManager(Net)——网络管理器
除此之外,用户自定义进程(如inetdftp„)、设备驱动(如串、并口)等等。
QNX的微内核体系
QNX微内核的“软总线”体系结构(像硬件一样可“热插拔”)
QNX微内核负责如下任务
- 进程间通信(IPC)——微内核监督消息的路由(传递);同时还管理另外两种形式的IPC:代理(proxy)和信号(signal)
- 低级网络通信(low-level network communication)——微内核负责不同节点间消息的分发
- 进程调度(process scheduling)——微内核调度器决定接下去哪一个进程将会执行
- 一级中断处理(first-level interrupt handling)——所有的硬件中断和故障都将在第一时间路由到微内核然后传递到适当的驱动或系统管理器。
进程间通信IPC
QNX支持三种基本的IPC消息、代理和信号。
- 消息(Message)——QNX最基本的IPC,提供进程间同步通信,发送者和接收者有应答
- 代理(proxy)——消息的一种特殊形式,非常适合事件通知,发送者不用和接收者进行交互
- 信号(signal)——IPC的一种传统形式,通常用于支持异步IPC。
1.基于消息(Messages)的IPC
发送者必须得到接收者的应答,否则进程将被阻塞。也就是说,这种通信是同步通信。
函数原型
- Send()——发送消息
- Receive()——接收消息
- Reply()——给发消息者回消息(应答)
2.基于代理(proxies)的IPC
代理(proxy)是一种非阻塞性的消息机制,特别适合进行事件通知,发送进程不需要和接收进程进行交互。
使用代理的一些情况
- 一个进程通知另一个进程某一事件发生
- 一个进程想给另一个进程发送数据,但是并不需要应答
- 中断处理器(interrupthandler)想告诉某一进程有数据需要处理。
函数原型:
- qnx_proxy_attach()——创建proxy
- Trigger()——触发事件。
3.基于信号(signals)的IPC
信号是一种很传统的进程间通信机制,广泛用于各种操作系统。
QNX支持一组非常丰富的POSIX兼容的信号,既有UNIX家族信号,也有QNX特定的信号。
Shell环境下产生信号:kill、slay
进程内产生信号的C函数:kill()、raise()
相关函数:signal()、sigaction()。
4 跨网络的IPC
QNX应用程序可以与其他计算机上的进程进行会话,这种会话就像同一计算机上的不同进程间会话一样。
QNX是通过使用一种称为虚电路(virtualcircuits)的机制实现的。这种机制是由QNX网络管理器完成的。它使得跨网络的消息、代理、信号具有惊人的透明性。
相关函数:qnx_vc_attach()、qnx_name_locate()等。
5.基于信号灯(semaphores)的IPC
信号灯是一种常用的进程间同步机制,它允许某一进程发布(sem_post())和等待(sem_wait())一个信号灯。
进程调度
当发生如下事件时,QNX微内核将对进程作出调度决策
- 一个进程成为非阻塞状态
- 正在执行的进程的时间片(timeslice)用完
- 正在执行的进程被抢占
1、进程优先级
QNX下的每一个进程都有一个优先级。QNX微内核调度器通过观察处于READY状态进程的优先级决定下一个要运行的进程;更高的优先级将有优先执行的权利。
(优先级分为32级,最低为0,最高为31)
设置、获得进程优先级的相关函数:setprio()、getprio()。
2、进程调度方法
为了满足各种应用程序的需要,QNX提供三种调度方式
- 先进先出(FIFO)调度方式
- 循环(round-robin)调度方式
- 自适应(adaptive)调度方式。
设置、获得进程调度方法的相关函数:setscheduler()、getscheduler()。
进程管理器
进程管理器的任务:创建新的进程以及管理与该进程相关的最基本的资源,这些服务是通过消息实现的,想创建新进程的进程只要向进程管理器(可以跨网络)发送相关消息即可。
QNX支持三种进程创建函数指令
- fork():POSIX兼容
- exec():POSIX兼容
- spawn():QNX专有。
1、进程状态
QNX进程所有可能的状态:READY、BLOCKED(SEND-blocked、RECEIVE-blocked、
REPLY-blocked、SIGNAL-blocked、SEMAPHORE-blocked)、HELD、WAIT-blocked、
DEAD。
确定进程状态的相关函数
- Shell环境:ps、sin
- 应用程序:qnx_psinfo()、qnx_osinfo()。
2、进程符号名字(process symbolicnames)
QNX允许应用程序给每一个进程都赋予一个符号名字。这样对查找某一特定 进程提供了极大的方便和灵活性。
符号名字取名约定
- qnx/fsys——本地名字
- company/xyz——本地名字
- /company/xyz——全局名字(系统必须启动nameloc进程)
本地名字与全局名字的区别:本地名字只是相对本机而言,有可能其他机器上也有相同的名字;而全局名字是整个网络中的唯一标志,网络中不能出现相同名字。
相关函数:qnx_name_attach()、qnx_name_locate()等。
3、时钟
QNX的时钟服务完全是基于POSIX标准实现的。
相关函数:timer_create()、timer_settime()、timer_gettime()、timer_delete()、
qnx_ticksize()等。
4、中断处理
QNX中断处理是为计算机硬件中断系统服务的,它对系统硬件作出反应,并管理计算机和外部设备之间的数据传输。
相关函数:qnx_hint_attach()、qnx_hint_detach()。
I/O域名空间
QNX的I/O资源没有嵌入在其微内核中,而是根据需要,在系统运行过程中动态的启动I/O服务进程。由于QNX的文件系统是可选的,因此路径名字空间没有嵌入在文件系统中,这个大多数整体式操作系统(monolithicsystems)有所不同。
举例:
/ 基于磁盘的文件系统Fsys
/dev 字符设备系统(Dev)
/dev/hd0 原始磁盘卷标(Fsys)
/dev/ser1 本地串口
//10/dev/ser1 节点10计算机的串口
//0/dev/ser1 本地串口(QNX约定//0总是指向本地节
//20/usr/test 节点20计算机上的文件test
ls //10/ 查看节点10计算机根目录文件列表
cd //10/mydir 进入节点10计算机的mydir目录
文件系统管理器
QNX文件系统管理器(Fsys)为存取磁盘数据提供了一套标准的方法。Fsys负责处理所有文件操作:open()、close()、read()、write()等。
Fsys管理如下五种文件的存取操作
- 正规文件
- 目录
- 符号链接
- 管道和FIFO
- 块文件
Dev管理字符文件的存取操作。
1、正规文件和目录
2、符号链接
3、管道和FIFO
相关函数:
pipe()、popen()等
mkfifo()、remove()、unlink()等。
4、系统分区
QNX系统下分区的类型及其文件系统
查看分区情况系统命令:fdisk–l
安装和卸载文件系统命令:mount、umount
如:mount –p /dev/hd0 –p /dev/hd1,可能得到的结果:
5、QNX分区的关键组成部分
每个QNX分区的开始都包涵如下几个关键组成部分
- Loader block:磁盘分区的第一个物理块,包涵操作系统,即包含了qnx的boot loader;
- Root block:/、/.inodes、/.boot、/.altboot,其中/.boot、/.altboot包涵操作系统映像,由qnx boot loader载入。
- Bitmap:/.bitmap,该文件记录了磁盘分区情况,反映了磁盘块的使用情况
- Root directory
这些组成部分是由工具dinit产生的。
6、DOS文件系统管理器
DOS文件系统管理器为Dosfsys它将DOS文件系统都管理在/dos目录下,如“/dos/c”。
7、CD-ROM文件系统管理器
CD-ROM文件系统管理器为Iso9660fsys。
8、Flash文件系统管理器
Flash文件系统管理器为Efsys.*。
9、NFS文件系统管理器
NFS文件系统管理器为Socket,它为QNX实现了TCP/IP网络通信协议
Socklet是TCP/IP的一个微缩版本,但是它不支持NFS
10、SMB文件系统管理器
SMB(ServerMessageBlock)文件系统管理器为SMBfsys.*,它实现了文件共享协议。
设备管理器
设备管理器Dev是介于进程与终端设备间的接口。终端设备是以/dev打头的I/O域名空间表示。
如,QNX的一个显示终端,/dev/con1。
1. 设备服务
QNX通过如下函数读取终端设备:read()、write()、open()和close()。
QNX的Shell环境下查询、更改终端设备参数的工具:stty,如:
stty term=vt100</dev/ser1
stty term=qnx</dev/ser1
QNX设置、获取终端设备参数的函数:tcgetattr()、tcsetattr()。
QNX设备管理器提供了一组用于管理终端设备的辅助服务:
- dev_read()或read()和tcsetattr()——读操作
- dev_arm()——当终端读入设备有可用数据时异步通知相关进程
- tcdrain()——等待输出数据传输完毕
- tcsendbread()——在通信通道上发送一个中断break信号
- tcdropline()——断开通信通道
- dev_insert_chars()——插入输入数据
- open()、fcntl()(O_NONBLOCK模式)——执行非阻塞读写。
2. 设备驱动
下图解释了一个QNX的典型的设备子系统
设备管理器进程Dev管理应用程序进程与终端设备间的数据流。硬件接口是由各个驱动进程管理的。Dev和驱动之间的数据流动是通过一组共享内存队列实现的。
底层设备控制是通过函数ioctl()、qnx_ioctl()实现的。
3. QNX控制台设备
QNX系统控制台是由Dev.con驱动进程管理的。如/dev/con1,/dev/con2。
QNX控制台特定函数
- console_read()——从控制台屏幕直接读取数据
- console_write()——向控制台屏幕写入数据
- console_arm()——异步通知重要事件
- console_size()——控制控制台大小;
- console_active()——切换控制台的可见性
4. QNX串口、并口设备
QNX串口设备是由Dev.ser驱动进程管理的。 如/dev/ser1,/dev/ser2。
QNX并口设备是由Dev.par驱动进程管理的。如/dev/par1,/dev/par2。
网络管理器
网络管理器Net为用户提供了操作系统强大的消息能力的一种无缝扩展。网络管理器直接与微内核进行通信,它通过高效的机器间消息传播增强了QNX消息传递IPC。
QNX网络管理器拥有三个高级特征
- 通过使用负载平衡手段提高数据吞吐量
- 通过使用冗余连接性达到容错目的
- QNX网络间的桥接bridge
1 网络管理器的任务
QNX网络管理器的任务是负责局域网间的消息传递。
相关函数:Send(),Receive(),Reply()。
2 微内核与网络管理器间的接口
微内核和进程管理器是通过一种特殊的非阻塞内存队列来与网络管理器建立接口的。
3 TCP/IP网络通信
QNX提供了一组BSD Socket API。
8 Photon微图形用户界面
QNX的Photon微内核是以一个非常轻小(仅45K)的进程方式运行的,它是由一组较少的指令实现,外部进程通过使用这些指令来建立视窗系统的高级功能。
Photon通过创建三维“事件空间”来管理GUI环境。
Photon支持Unicode多语言
Photon支持动画
Photon支持打印
Photon有丰富的视窗部件库:如PtLabel,PtButton,PtList等
Photon的GUI编程环境为PHAB。