QNX是一个实时的、嵌入式的、微内核的、基于优先级的、消息传递的、抢占式多任务、多用户、具有容错能力的分布式网络操作系统。多年来,QNX实时系统以其高度可靠的实时性获得了业界的广泛认可,成为X86平台上最好的嵌入式实时操作系统之一。
QNX实时操作诞生于1951,最初名为QUNIX(Quich UNIX),后来由于版权问题,更名为QNX。多年来一直推陈出新,目前己推出6.6版。QNX的体系结构是真正的微内核体系结构,QNX有一个非常小的微内核(约为12K),其核心仅提供4种基本服务:进程调度、进程间通信、底层网络通信和中断处理,这些基本进程在独立的地址空间运行,并通过消息传输机制与系统其他各模块进行通信。这一机制使得QNX能够胜任对实时性要求很高的系统。如今,QNX广泛地应用于那些以实时性和网络灵活性为首要要求的应用领域。大量已安装的QNX系统证明微内核技术不仅技术上可行,而且满足各领域对系统稳定性的要求,如过程控制、医疗器械、财政事务处理、数据通信等多个领域。
QNX的嵌入式应用程序也是很理想的。应用程序运行在用户空间,它和内核代码位于不同的内存空间,保障了系统的稳定性。消息传输机制构成了虚拟的软总线(Soft Bus),使得用户可以动态地添加或删除各服务模块。因此它可以被裁减得很小且能提供多任务处理、线程池机制、驱动优先的进程安排。
它遵循POSIX.1 和POSIX.2 部分遵循POSIX.1b标准。这不仅意味着代码可移植性,还意味着任何程序员如果具有UNIX、Linux或其它POSIX经验,即使不了解嵌入式实时操作系统,也可以轻松地在QNX的环境下进行研发。QNX的高效率、模块性和简易化,主要通过两个基本原则来实现:微内核结构和基于消息的进程间通信(IPC)。
1.QNX的Neutrino微内核
一个微内核操作系统由一个极微小的内核构成,它为一组相互协作的进程提供最低限度的服务,进而由这些进程实现高级的系统功能。微内核本身缺少诸如文件系统、设备驱动之类的服务,但是这些服务由那些可选择的系统进程提供。设计微内核操作系统不是仅仅为了将系统自身缩小,它实质上改变了系统功能实现方式,微内核的关键是内核模块化。这种模块化的设计使得操作系统的扩展变得更加容易,同时增强了系统的鲁棒性。模块化思想是一种现代设计方法思想。
微内核提供的进程间通讯服务主要用来将微内核和服务进程捆绑在一起,因此这些服务的性能和灵活性决定了系统的性能。如果不考虑进程间通讯服务,从提供的服务和实时性方面来说,微内核和实时程序大体上差不多。微内核和一般的应用程序的差别在于,如何使用进程进程间通信最快的方式
间通信扩展内核的功能和其提供服务的进程的功能。这两个功能由一组微内核管理下的相互协作的进程实现,而用户自定义的进程可以作为扩展系统功能的进程;因此,系统本身极具开放性,也容易扩展。此外,用户自定义的扩展进程不会影响系统的稳定性。
QNX操作系统由Neutrino内核管理下的一组相互协作的进程构成。如图2所示,该结构是一个同级结构,不是等级结构;相互协作间的进程的地位是平等的,并且通过内核管理。微内核扮演的角是“软件总线”,可以实现用户根据需求动态的“插入”或“拔出”系统组件的要求。内核是操作系统的核心,它不同于系统其它线程,它本身并不参与系统调度;处理器仅在内核调用、响应中断、底层网络通信和进程间通信的时候才执行内核代码。
除了微内核提供的四种基本系统服务外,其它系统服务都由标准用户进程提供。一个配置良好的系统需要包含资源管理器、文件系统管理器、字符设备管理器、用户图形接口、基本网络管理器、TCP/IP等服务。从本质上来说,系统进程和用户进程已经是很难区分了,因为用户自定义的系统扩展的服务和应用程序使用了相同的接口和微内核服务,只不过扩展的系统服务满足POSXI标准。从用户角度看来,扩展的系统模块就像系统内核一样向应用程序提供核心服务。由此可见,QNX的特殊微内核体系结构赋予了系统独特的可扩展性。多数高级的
系统服务都由标准的系统进程提供,因此很容易增加系统的服务。例如QNX系统的驱动程序就可以作为一个标准的进程启动和结束。开发驱动程序可以像开发任何应用程序一样进行开发和调试,将新的驱动程序加入系统中就像安装应用程序一样,这些都不会影响系统的其它组件。
图3.5 QNX的体系结构
2.基于消息的进程间通信
进程间通信是微内核各个模块得以协调工作的关键,不仅如此,当多个用户线程同时运行时,特别是在实时多任务环境下,操作系统必须提供线程间通讯的机制。进程间通讯(IPC)也是设计合作进程的应用软件的关键。系统为程序员提供一个简单而且强大的IPC功能,可以大大简化程序开发的工作量。QNX是同类嵌入式系统中首先采用消息传递技术作为IPC基本方式的商业嵌入式操作系统。该系统的强大功能和结构简单性要归功于整个系统整合了消息传递机制。
在QNX里,一个消息是在进程间传递的小小数据包。系统并没有定义消息的内容,也没有赋予其任何特殊的含义,只是让消息的发送者和接收者能理解消息内数据的含义。消息传递不仅允许进程间相互传递数据,而且为多进程同步提供了方法。当发送、接收和应答消息的事件发生时,进程本身的状态也发生了变化,这些状态变化影响着进程的运行,主要是运行状态。一旦内核知道进程的状态和优先级,就可以根据这些状态对所有的进程进行高效的调度,以使CPU的资源得到高效的利用。
实时程序和任务需要很高的可靠性和实时性,所以应用程序的设计采用了进程和线程模型。应用程序由一些进程组成,这些进程需要一种可靠的进程间通讯方式。Neutrino的消息传递
方式可以帮助提高应用程序的可靠性。QNX微内核提供的消息传递的实现方式是阻塞方式的send()、Receive()和Reply():
(l)一个进程向其他进程发送消息,需要启动一个send(),此进程将被阻塞,直到目标进程使用Receive()接受信息,处理消息,并使用Reply()发送一个反馈信息,此进程才被唤醒。
(2)如果一个进程执行一个Receive(),而此时没有接收到需要的消息,此进程将被阻塞,直到其他进程执行一个相关的send()才被唤醒。
(3)因为这些基本操作(或原语)不经排队直接在进程间拷贝数据,消息传送的性能接近底层硬件的内存带宽。
(4)在QNX中所有的系统服务都建立在消息传送基本操作的基础上。
在QNX中,进程可以要求这些请求消息以优先级的次序递送(而不是以提交时间为次序),高优先级进程将阻塞低低优先级的进程。这种消息驱动的优先级机制巧妙的避免了优先级逆转(优先级逆转指的是这样一种情形,低优先级的进程拥有高优先级所需要的资源从而阻塞了高优先级的进程的执行)。例如,一个进程正在使用某项临界资源,这时有一个更高优先级的进
程也要使用这个资源,因为是临界资源,所以高优先级的进程被堵塞,遇到这种情况系统会自动将占用临界资源的低优先级进程的优先级提高到适当级别,使其与被堵塞的高优先级的进程优先级别相近或相等,这样原先低优先级的进程可以很快的执行完,然后释放临界资源,消除低优先级的进程对高优先级进程的堵塞。
消息传输支持多块消息,这样一个在进程间传递的消息不需要占用一块单一的连续的内存空间。实际上是,发送和接收进程可以指定一个MX表用来指示发送和接收的消息驻留在内存中的位置,这样就允许发送消息的头部和数据分别位于不同的块中,这些消息块的首尾地址被记录在MX中,这样来生成一个连续的消息,提高了消息传递的灵活性和实时性。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。