体系结构
QNX具有实时系统的基本特征
QNX是通过如下两个基本原理实现它独特的高效性、模块化和简易性
QNX的微内核概述
qnx有一个非常高效的微内核,它负责管理一组同时工作的进程。
QNX微内核是个真正的微内核。首先,它非常小;其次,它的两个重要的任务是:
QNX的系统进程包括
除此之外,用户自定义进程(如inetdftp„)、设备驱动(如串、并口)等等。
QNX的微内核体系
QNX微内核负责如下任务
进程间通信IPC
QNX支持三种基本的IPC消息、代理和信号。
1.基于消息(Messages)的IPC
发送者必须得到接收者的应答,否则进程将被阻塞。也就是说,这种通信是同步通信。
函数原型
2.基于代理(proxies)的IPC
代理(proxy)是一种非阻塞性的消息机制,特别适合进行事件通知,发送进程不需要和接收进程进行交互。
使用代理的一些情况
函数原型:
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微内核将对进程作出调度决策
1、进程优先级
QNX下的每一个进程都有一个优先级。QNX微内核调度器通过观察处于READY状态进程的优先级决定下一个要运行的进程;更高的优先级将有优先执行的权利。
设置、获得进程优先级的相关函数:setprio()、getprio()。
2、进程调度方法
为了满足各种应用程序的需要,QNX提供三种调度方式
设置、获得进程调度方法的相关函数:setscheduler()、getscheduler()。
进程管理器
进程管理器的任务:创建新的进程以及管理与该进程相关的最基本的资源,这些服务是通过消息实现的,想创建新进程的进程只要向进程管理器(可以跨网络)发送相关消息即可。
QNX支持三种进程创建函数指令
1、进程状态
QNX进程所有可能的状态:READY、BLOCKED(SEND-blocked、RECEIVE-blocked、
REPLY-blocked、SIGNAL-blocked、SEMAPHORE-blocked)、HELD、WAIT-blocked、
确定进程状态的相关函数
2、进程符号名字(process symbolicnames)
QNX允许应用程序给每一个进程都赋予一个符号名字。这样对查找某一特定 进程提供了极大的方便和灵活性。
符号名字取名约定
本地名字与全局名字的区别:本地名字只是相对本机而言,有可能其他机器上也有相同的名字;而全局名字是整个网络中的唯一标志,网络中不能出现相同名字。
相关函数: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管理如下五种文件的存取操作
Dev管理字符文件的存取操作。
3、管道和FIFO
相关函数:
pipe()、popen()等
mkfifo()、remove()、unlink()等。
4、系统分区
查看分区情况系统命令:fdisk–l
安装和卸载文件系统命令:mount、umount
如:mount –p /dev/hd0 –p /dev/hd1,可能得到的结果:
5、QNX分区的关键组成部分
每个QNX分区的开始都包涵如下几个关键组成部分
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
stty term=qnx
QNX设置、获取终端设备参数的函数:tcgetattr()、tcsetattr()。
QNX设备管理器提供了一组用于管理终端设备的辅助服务:
2. 设备驱动
设备管理器进程Dev管理应用程序进程与终端设备间的数据流。硬件接口是由各个驱动进程管理的。Dev和驱动之间的数据流动是通过一组共享内存队列实现的。
底层设备控制是通过函数ioctl()、qnx_ioctl()实现的。
3. QNX控制台设备
QNX系统控制台是由Dev.con驱动进程管理的。如/dev/con1,/dev/con2。
QNX控制台特定函数
4. QNX串口、并口设备
QNX串口设备是由Dev.ser驱动进程管理的。 如/dev/ser1,/dev/ser2。
QNX并口设备是由Dev.par驱动进程管理的。如/dev/par1,/dev/par2。
网络管理器
网络管理器Net为用户提供了操作系统强大的消息能力的一种无缝扩展。网络管理器直接与微内核进行通信,它通过高效的机器间消息传播增强了QNX消息传递IPC。
QNX网络管理器拥有三个高级特征
1 网络管理器的任务
QNX网络管理器的任务是负责局域网间的消息传递。
相关函数:Send(),Receive(),Reply()。
2 微内核与网络管理器间的接口
微内核和进程管理器是通过一种特殊的非阻塞内存队列来与网络管理器建立接口的。
3 TCP/IP网络通信
8 Photon微图形用户界面
QNX的Photon微内核是以一个非常轻小(仅45K)的进程方式运行的,它是由一组较少的指令实现,外部进程通过使用这些指令来建立视窗系统的高级功能。
Photon支持Unicode多语言
Photon支持动画
Photon支持打印
Photon有丰富的视窗部件库:如PtLabel,PtButton,PtList等
Photon的GUI编程环境为PHAB。