QNX简介合集

QNX是商业类Unix实时操作系统,主要针对嵌入式系统市场。该产品开发于20世纪80年代初,后来改名为QNX软件系统公司。QNX软件系统公司,黑莓公司旗下子公司,是全球领先的创新嵌入式技术供应商,包括中间件、开发工具和操作系统。QNX Neutrino实时操作系统,QNX Momentics工具套件和QNX Aviage中间件系列基于组件的架构共同构成业界可靠性和延展性最强的架构,帮助建立高性能的嵌入式系统。包括思科、戴姆勒、通用电气、洛克希德·马丁和西门子在内的众多全球知名技术领先企业,都将QNX技术应用在网络路由器、车载远程信息处理和信息娱乐系统、工业控制系统、医疗设备、安全防卫系统和其他任务关键性和生命关键型应用中。QNX软件系统公司成立于1980年,总部位于加拿大渥太华,其产品行销全球100多个国家或地区。

QNX是一种商用的遵从POSIX(可移植操作系统接口, Portable Operating System Interface,缩写为POSIX, IEEE为要在各种UNIX操作系统上运行软件,而定义API的一系列互相关联的标准的总称)规范的类Unix实时操作系统,目标市场主要是面向嵌入式系统

QNX采用微内核架构,操作系统中的多数功能是以许多小型的task来执行,它们被称为server。这样的架构使得用户和开发者可以关闭不需要的功能,而不需要改​​变操作系统本身。QNX是一个微内核实时操作系统,其核心仅提供4种服务:进程调度、进程间通信、底层网络通信和中断处理,其进程在独立的地址空间运行。所有其它OS服务,都实现为协作的用户进程,因此QNX核心非常小巧而且运行速度极快。QNX的微内核独立自处于一个被保护的地址空间,驱动程序、网络协议和应用程序处于程序空间中。

微内核架构的优点:(1). 驱动程序、网络协议、文件系统等操作系统模块和内核相互独立,任何模块的故障都不会导致内核的崩溃;(2). 驱动程序、网络协议、文件系统和应用程序都处于程序空间,都调用相同的内核API,开发与调试和应用程序没有区别;(3). 操作系统功能模块可以根据需要动态地加载或卸载,不需要编译内核。在高可靠性要求的情况下,可以编写监视模块,对可靠性要求高的模块进行监视,必要的时候重新启动或重新加载而无须重启系统。高可靠性的内核结构使QNX具备了高可靠性嵌入式操作系统的本质特征。

QNX Neutrino实时操作系统(RTOS):内存受保护的微内核架构。

QNX Neutrino实时操作系统架构如下图所示:

QNX Neutrino RTOS是功能齐全性能可靠的简化版操作系统,可满足最小规格的实时嵌入系统的有限资源要求。其真正的微内核操作系统和模块化架构可使客户以较低的运行总成本创建高度优化的可靠系统。

(1). 该系统建立在真正的微内核架构上。在这种系统中,所有驱动程序、应用程序、协议栈和文件系统都在内核外部内存受保护的安全的用户空间内运行。几乎所有组件在出现故障时都能自动重启而不会影响其他组件或内核。

(2). 该系统采用模块化结构,可允许用户动态升级模块、引入新功能或实施问题修复,而无高增加停机时间和系统中断的成本。

(3). 该系统采用多核技术和内置透明分布处理技术。

(4). 该系统根据POSIX标准设计,只需通过简单地重新编译,就可移植既存代码、开源UNIX、Linux和因特网代码。通过标准应用程序接口,用户能重新使用应用程序代码。

(5). 该系统利用自适应分区技术确保系统资源满足应用要求。

(6). 该系统支持x86、PowerPC和ARM平台。

QNX Momentics工具套件(Tool Suite):基于Eclipse的灵活集成开发环境。

(1). 该工具套件包含用户所需的所有工具,便于迅速创建和优化用于QNX Neutrino实时操作系统的应用程序。从板卡启动到远程诊断,QNX Momentics工具套件为用户提供在整个开发周期内节省时间的工具,而且全部在单独、使用简便的环境中进行。

(2). 用户可选择自己喜欢的编程语言、主机和目标机。利用QNX Momentics工具套件,用户可使用C、C++、嵌入式C++编程;可以在Windows或Linux主机中开发程序;并以ARM、PowerPC和x86处理器为开发目标,所有工具都取自相同的集成开发环境(IDE)。该工具套件还提供极大的灵活性,允许用户同时混用多种编程语言和处理器架构。

(3). 该工具套件提供了大量的优质高效的分析工具,以加快产品交付所有阶段的进展。该工具套件包括许多非侵入式图形分析工具,以帮助用户轻松隔离并呈现资源的使用情况、定位瓶颈并对系统性能进行精确调整,包括应用程序剖析、系统剖析和内存分析。

(4). 该工具套件支持所有QNX Neutrino实时操作系统技术,包括多核技术、扩展网络、闪存文件系统、高级图形和透明分布处理技术等。

(5). 该工具套件中含有经过优化的GCC编译器、GDB调试程序。

 

 

车载电子操作系统是汽车智能化的核心,能够有效分配车机的硬件资源,对车内各种任务功能进行协同管理,并控制各项任务优先级别。常见的车载电子操作系统有:QNXLinux(Android,AaliOS)、Windows CE、iOS等,此外还有一些非主流操作系统如Wind River和micro-ITRON 等。

QNX:黑莓旗下的一款微内核实时操作系统,是全球第一款通过ISO 26262 ASIL levelD安全认证的车载操作系统,目前市场占有率超过50%,已经应用在包括法拉利、劳斯莱斯、布加迪、宝马、奥迪、奔驰等超过40个品牌的6,000多万辆汽车中。

QNX特点是: 稳定性和安全性非常高,实时性也比较好,但缺点是兼容性较差。

QNX是嵌入式分布式操作系统,和微软的Windows2000几乎同步开发,用的是完全不同的架构,安全性能和可靠性确实处于世界一流水准,同级别的商业系统只有Windriver公司产品能与其抗衡。当然这并不是世界上最安全的系统,特殊军用产品系统才是最安全的操作系统,因为它几乎是在不计成本只追求性能的前提下开发的。

 Android:是目前为止基于Linux Kernel开发的最成功的操作系统,全球智能手机市场占有率超过80%。Android系统最大的优势在于兼容性,以及无数与之相匹配的应用。但作为车载操作系统,Android的稳定性和安全性较差。

  WindowsCE:是微软1996年发布的嵌入式操作系统。由于PC时代Windows称霸很多年,应用开发便利,同时提供大量的开发包(Kits)和调试工具(DebugTools),所以WinCE是当时最火的车载操作系统。但随着Linux和Android的冲击,微软在智能手机领域节节败退,已经退出了嵌入式操作系统市场,WinCE 7.0也将停止更新。

QNX简介合集_第1张图片

 AliOS:2014年前后,互联网巨头纷纷推出了自己的“车载操作系统”:苹果的Carplay,谷歌的Android Auto,百度的Carlife,阿里的AliOS以及腾讯的WeLink。但除了AliOS可以算作类Linux的车载操作系统之外,其它产品均是通过MirrorLink、Miracast等通信协议将智能手机映射到车机屏幕上的解决方案,并不是“车载”的操作系统。

  他们核心功能就是建立手机与车机互联,显示的UI界面也不是APP,信息全部来自手机端。AliOS2016年搭载到上汽荣威RX5中,销量非常不错。

  iOS:苹果对车载操作系统的研发还没有对外界披露细节,不过随着QNX前CEO兼创始人DanDodge加入苹果,负责苹果“ProjectTitan”自动汽车项目的研发,期待苹果未来在车载电子操作系统的一鸣惊人。

 根据IHS数据,随着WinCE逐步退出车载操作系统市场,长期来看未来将会是QNX与Linux(Android)两家独大的市场。

  对比车载电子操作系统与智能手机操作系统,智能手机初期在经历过Android、Symbian、Blackberry、Windows Mobile,BADA等竞争之后,最后剩下了Android与iOS,价值巨大。目前车载电子操作系统尚处在初期阶段,竞争对手较多,但智能汽车渗透率还处在比较低的水平,因此车载电子操作系统的价值还远未体现,未来车载操作系统蕴含巨大价值。

 

 

 

一个真正的微内核

QNX 微内核实现四种服务:进程间通信,低层网络通信,进程调度,中断派遣。微内核有少量的与这些服务有关的内核调用。总体上,这些功能粗略的占用了12K的代码,并提供实时执行的功能和性能(参见附录A)。很小的内核可以让有相当数量的片上 cache 的处理器为应用程序提供优异的性能,原因是微内核和系统中断处理的活跃部分可以很容易地放在大小合适的CPU 片上 cache 中。


QNX 微内核。

微内核提供的消息传递设施实现的是阻塞的 Send(), Receive(), 和 Reply()。简介:

(1) 一个进程发出一个向其他进程发出一个 Send(), 此进程将被阻塞,直到目标进程发出一个 Receive() ,处理消息,并发出一个Reply();此进程才被唤醒。

(2)如果一个进程执行一个Receive() ,而此时没有等待处理的消息,此进程将被阻塞,直到其他进程执行一个 Send() 才被唤醒。

(3)因为这些基本操作(或原语)不经排队地直接在进程间拷贝数据,消息传送的性能接近底层硬件的内存带宽。

(4)在 QNX 中所有的系统服务都建立在消息传送的基本操作的基础上。


在这些 IPC 基本操作之上的变体(例如消息队列),业已轻松地作为使用这些低层服务的服务器实现了,用性能上的术语说,这 IPC 的变体是可以与单内核内实现的此类服务相比较的。

进程可以要求这些要求消息以优先级的次序递送(而不是以提交时间为次序),在最高优先级执行的进程阻塞所有其他等待服务的进程。这种消息驱动的优先级机制巧妙的避免了优先级逆转。服务器进程被强制在它所服务的进程的优先级上执行,当然在一个更高的优先级进程在一个繁忙的服务器上阻塞时,服务器进程的优先级将自动的提高到适当级别。作为结果,一个低优先级进程,不能通过调用有更高优先级的服务器进程的服务的方式,来抢占高优先级进程的执行。

译注:“优先级逆转指的是这样一种情形,低优先级的进程拥有高优先级所需要的资源,从而阻塞了高优先级的进程的执行”。


典型的"发送-接受-回应"事务涉及的状态 。

消息基本操作支持多块消息,这样一个从一个进程递送到另一个进程的消息不需要占用一块单一的连续的内存空间。实际上是,发送和接收进程可以指定一个 MX 表用来指示发送和接收的消息驻留在内存中的位置。这样就允许发送头部块和数据块分开的消息,而不用做消耗性能的复制的来生成一个连续的消息。除此之外,如果低层的数据结构是环状缓冲区,一个三部分的消息将被允许一个头和两个在环状缓冲区中区间不连贯的形式,并作为一个单一的原子的消息发送。提供给发送者和接收者的 MX 映射不必相同。


多部分消息通过MX控制结构指定。微内核把它们组合进一个单一的数据流中。

在微内核中直接设计了一个用于网络通信的低层“挂钩”这个挂钩被一个称为网络管理器(在后面描述)的可选的进程所使用。当选了网络管理器时,网络管理器被连接到微内核,并把在局域网上的微内核之间移动消息所需要的设施提供给微内核。通过在这个在系统中最基础的层次上提供网络服务,任何在 OS 体系结构中更高层次上提供的服务都可以被在局域网任何地方的任何进程透明的访问。这种实现的性能是优异的,尤其是跨网络的用户层进程间递送近乎电缆的吞吐率。

QNX 的进程调度基本操作遵循 POSIX 1003.1b 标准的实时规范。QNX 提供了完整的、可抢先的、有优先级的环境切换,调度算法有:时间片轮转、FIFO、自适应调度。

  资源管理和路径名空间管理


为了使微内核提供 POSIX 标准和 UNIX 惯例所定义的功能,可以增加被称为资源管理器的可选的进程。可以从微内核建立一个最小化的系统(比如没有文件系统和设备输入输出系统),包括一个进程管理器,和一系列的应用程序进程。

在 QNX 中第一个和唯一必须的资源管理器是进程管理器(Proc),它提供进程创建,进程记帐,内存管理,进程环境继承(对本地和网络远程进程都是),路径名空间管理。第一级路径名由 Proc 管理的原因是在 QNX中文件系统是可选择的,而不象单体内核系统中文件系统总是存在。无盘和基于ROM 的系统可能不使用文件系统,所以不强制必须包括文件系统。

在其他资源管理器执行之前,Proc “拥有”整个的路径名空间(根目录和其下面的所有东西)。如果没有其他的资源管理器出来提供服务,这基本上是一个空的文件系统。Proc 允许其他资源管理器通过一个标准的 API来接受其想管理的那一部分名字空间(拥有认证域)。Proc 响应并维护一个前缀树(prefix tree)来跟踪这些拥有各种各样的部分名字空间的进程。

当一个文件系统管理器例如 Fsys(POSIX 文件系统管理器)和一个设备管理器例如 Dev 运行了,前缀树看起来可能象下面这样:

  / 基于磁盘的文件系统(Fsys)
/dev 字符设备系统 (Dev)
/dev/hd0 (Fsys)原始磁盘卷
/dev/null 空(Null)设备 (Dev)


当一个进程打开一个文件,open() 库例程首先把文件名发送到 Proc , Proc 会拿前缀树和路径名做比较,把open() 导向合适的资源管理器。在资源管理器的认证域有部分重叠的情况下,将选取路径名的最长的匹配。例如打开 /dev/tty0 最长的匹配发生在 /dev,导致打开指向 Dev 。路径名 /usr/fred 与 / 匹配 ,打开指向 Fsys。

在网络上的每个计算机的进程管理器维护自身的前缀树,在每个节点上的进程可能看到的“网络范围路径名空间”可以是一致的也可以是不同的。以 / 开始的路径名的使用基于本节点的前缀树。也可得到网络上唯一的名字,这样就允许应用程序用此名字指定资源在网络范围路径名空间中的绝对位置。通过使用前缀别名( Proc 管理的在内存中的重映射表),部分名字空间可以映射到网络上其他节点的资源管理器上。例如,一个从 LAN 上引导的无盘工作站希望拥有自己的以其他节点为根的文件系统,它就可以把自己的文件系统的根定义为一个远程的 Fsys 进程的别名。

当上面的别名存在时,对 /dev 的 open() 调用仍然被映射到本地的 Dev 进程来控制本地设备,但所有对文件的 open() 调用被转成一个 open 消息,此消息将被前面指定的远程节点的前缀映射表解析(通常把文件打开指向那个节点的 Fsys 进程)。通过连接到一个通常的根目录,在网络上任何地方的进程可以在一个单一的目录树中访问所有的网络文件系统。可替代的选择是,通过使用“网络绝对路径名”,网络路径名空间也可以作为一系列独立的根文件系统进行维护。

通过在传统的文件名空间上实现单独的认证域,OS 的总体功能中的很多部分可以用运行时可选的方式实现。既然资源管理器进程在内核空间外存在,那么就在运行时被动态的增加和删除,而不需要用重新连接内核来包含不同层次的功能。这种在大小上的灵活性允许 OS 易于按应用程序的需要而放大或缩小。

尽管对把资源管理器提供的服务放置在内核之外的第一印象是低效,但性能结果(参见附录)表明环境切换和 IPC 的性能充分的保持了硬件的原始性能。事实上,QNX 的快速环境切换允许 OS 的功能在协作进程间分配而不为此导致性能损失。这样就明确了这种结构在体系上的优势。

这种分布式名字空间的网络透明性允许远程运行的进程和本地处理器上运行的进程在逻辑上等价。独立管理的路径名空间实现了无缝的混合,也就是对名字空间的行为没有什么“意想不到”的。继承整个父进程的环境,包括打开的文件描述符,环境变量,当前工作路径。即使在分布式网络环境下,进程间通信和 I/O 操作也与 POSIX 1003.1 定义相一致。

Fsys - 文件系统管理
Fsys 是实现文件系统的多种资源管理器中的一种。Fsys 为 QNX 环境提供了一个高性能的 POSIX 兼容的文件系统。它实现了一个磁盘结构,用位图分配空闲空间,实现了延伸块(extent)的链表用来组织磁盘上的数据。这种实现允许系统提供给应用程序层次的的磁盘吞吐率接近硬件的原始能力(参见附录B)。Fsys 对保持文件系统完整性很关键的数据结构实行同步的写磁盘操作,这允许磁盘系统可以在意外的电源失效中幸存下来,在在磁盘上的数据结构中嵌入了特殊标志,令文件系统在灾难性错误事件后也能被重建。

多线程的 Fsys 体系结构允许它处理并行的多路请求,例如在其他线程因为等待物理 I/O 发生而阻塞时,执行ramdisk 和 cache I/O 的线程可以运行。如果设备支持多路等待 I/O 请求,那么这些请求可以由驱动来服务,以驱动认为合适的顺序执行.那么这种并行性也可以延伸到驱动程序,提交的要求可以按任何适当的次序得到服务。进一步,通过 Fsys 层的文件 I/O 请求按延伸块编码,而不是按单独的磁盘块编码。这导致对磁盘驱动器所表达的工作单元自然的映射到磁盘驱动器指定喜欢的 I/O 模式上。结果是得到了现代磁盘驱动器的顺序读写的 I/O 速率,和实质的文件系统性能提高。

从第一眼的印象上,一个消息传递的 OS 中的文件系统应该比单体内核的文件系统需要更多的数据复制。事实上不需要额外的复制。MX 的多块消息基本操作允许 Fsys 把应用在 read() 和 write() 调用中指定的连续的缓冲区映射成在 Fsys 中的非连续的 cache 块。对于一次读磁盘,磁盘驱动程序从磁盘读到多路非连续的 cache 中。 Fsys 接着调用在内核中的 MX 功能自动地把散开的块聚集和复制到应用程序指定的连续的读缓冲区中。结果是,即使在一个消息传递、网络透明的环境内的文件系统操作,也展示出与在单体内核中实现的高速缓存(cache)的文件系统同样数量的数据复制。

在一个无盘的网络连接的机器上,Fsys 进程可以用命令行启动。设备驱动程序也动态的挂接在 Fsys 上,在Fsys 将不再使用的情况下,Fsys 和它的设备驱动程序可以从内存中除去。

注意可得到许多文件系统管理器。例如包括 Dosfsys 来访问 DOS格式化的介质,Iso9660fsys 用于 CDROM,一些嵌入式文件系统用于 Flash-memory 设备,等等。作为运行时应用程序的需要,任何文件系统进程的组合均可以并发的运行。

Dev - 设备管理
设备管理(Dev) 提供了 POSIX 兼容的设备控制而且还带有一些适于实现通信协议的实时扩展。用与 Fsys 类似的方式,Dev进程可以动态的启动和与设备驱动程序挂接上并且如果不再被使用可以从内存中除去。

即使在有非智能 UART 设备的现代硬件上,Dev 可以处理的波特率也高达 115 Kbaud,原因是微内核提供了低时延中断。通过增加智能通信板卡,可以轻易的配置一个高带宽的多线路通信服务器。

有赖于 MX 基本操作,Dev 可以 Receive() 一个应用程序对一个设备作的 write() 直接到一个中断处理程序管理的环状缓冲区中。通过适当的定义 MX 表,接收的数据可以放置在 Dev 管理的环状缓冲区当中。因为写到环状缓冲区可以要求数据被映射到物理上不连贯的(逻辑上连续的)内存区域中,一个有三个表项的 MX 表可以描述环状缓冲区中一个头部和两物理上不连贯的区段。对于 read() 的情况,从设备来的数据流从驱动程序直接进入环状缓冲区,从环状缓冲区直接进入应用程序的 read() 缓冲区,而没用于建立连续的消息的冗余复制。

设备驱动程序支持

不要求设备驱动中断处理程序只能存在于内核空间中,QNX 提供了一个系统调用,用来允许用户进程去连接一个在有足够的权限的用户进程内的中断处理程序,此中断处理程序相应于处理内核中的某个中断向量。连接的这个中断处理程序就可以被内核调用来响应物理中断。通过在用户进程中存在,处理程序可以完全的访问这个有响应中断功能的进程的地址空间。一旦中断处理程序开始运行,它要么可以唤醒与它共享代码的进程要么是简单的返回内核。用于 Dev 的设备驱动程序从下面的行为中获利,使用单独的中断在Dev 管理的缓冲区中积累字符,只在事先定义的"重大事件"发生时唤醒 Dev (例如终端字符计数、行结束条件、或超时)。

通过中断处理程序驻留在内核之外的方式,用户可以在一个运行的系统中动态的增加或删除中断处理程序 (和包含他们的设备驱动程序)。 由内核处理的第一层次的中断处理也照顾了嵌套和共享的中断,而不强加硬件依赖的细节和用户写中断处理程序的复杂性。微内核提供外部的中断处理程序是允许一个资源管理器与单体内核可提供的的性能水平相匹配的基础。

易于扩展

因为设备驱动程序在用户级进程中存在,开发者可以从这个基本的优势中获利:开发 OS 的功能的扩展与开发用户级进程相一致。事实上,在 QNX Software Systems 内部使用的开发工具是运行在全屏幕、源代码级的调试器下的实验性的资源管理器,所以调试象一个新的 Fsys 进程这样的 OS 服务可以免去调试内核这样复杂的过程就能完成。并且因为资源管理器和设备驱动程序可以在需要的时候启动或去除,重新连接内核和重新启动来测试新内核的费力的过程就变的不在是必须的了。

作为 QNX 操作系统易于扩展的例子,象类似于在 [Pike 90]中描述的 /proc 资源管理器这样的服务可以被应用程序级的程序员(而不是内核设计师!)只用几个小时的努力和不到200行的易懂的 C 源程序实现。/proc 有效的把系统资源(一系列的在系统中的活跃的进程)包装起来,并且对于系统把它们表现得就象是在 /proc 的路径名空间中维护的文件和目录。

一个复杂一些的例子,实现了一个类似于在 [Presotto 91] 中描述的客户端网络文件系统的 cache 管理器。这个 cache 把某节点对网络上的远程 Fsys 最近访问的文件块保存在客户端复本中。在 open() 的时候,cache 验证了远程的文件未被更改(更改将使本地的缓存的数据失效)之后提供本地缓存的数据,这样来增强性能。通过提供一个容纳 cache “溢出”的文件系统,一个以慢速串行线路连网的系统仍可以提供合理的远程网络文件系统性能。这样一个服务器只用了1000 行源代码。再者,这是完全在应用程序员的范围内使用标准系统库实现的。

最后,客户的文件系统可以作为使用 Fsys 的裸磁盘块服务的资源管理器来实现,此客户的文件系统可表示为在根文件系统上的子树。一个例子是 PC-DOS 的文件系统 Dosfsys, Dosfsys 接受 /dos 路径名作为认证域并提供目录形式如 /dos/a, /dos/b 等等。这些目录映射到相应的 PC-DOS 介质上,并且Dosfsys 维护进入Dosfsys 认证域的 I/O 请求指示出的在此卷上的裸块。文件的维护可以被映射到所支持的下层文件系统上,而尝试其他的比如 link() 的时候则返回适当的出错信息。

网络服务 - FLEETTM 网络技术
Fault-tolerant 容错
Load-balancing 平衡负载
Efficient 高效
Extensible 可扩展性
Transparent 透明性
象前面曾提到的那样,网络管理器 (Net) 被直接连接进了内核。当一个本地进程调用微内核向其他节点上的进程传送消息的时候,微内核通过这个专用接口把一个指向消息的指针加入一个用于 Net 的队列中。 Net 进程也可以从其他微内核接受消息并把这些消息传给本地微内核。实质上,在网络上的网络管理器把所有局域网上的微内核融合成一个单一的逻辑上的微内核。因为所有的系统服务包括进程创建、调试、文件和设备 I/O 都凭借通过微内核消息传送完成,结果是在网络上的多个计算机的行为就象是一个单一计算机。局域网上的任何进程提供的任何服务均可被网络上的任何进程透明的访问。这是与 TCP/IP 的标志性的差异,TCP/IP 只是明显的提供了一系列服务--典型的终端任务和文件 I/O。作为对比,这个连接成的微内核体系结构允许下面的命令:

ls /usr/danh | grep abc | wc

以每个进程在网络上不同的处理器上运行的方式执行,而 Proc 提供的网络继承的文件描述符导致管道可以在网络上连接和转送数据。这种环境的透明性也给实现分布式应用提供了方便。一个由一系列的协作进程组成的应用可以在一个单一的 CPU 上开发,并在网络(LAN)上分布而不需要更改源代码或二进制代码。

就象 Fsys 和 Dev 可以从命令行启动和停止、它们各自都有一族驱动程序一样,Net 也有一族驱动程序并支持连接多种网络驱动程序。如果 Net 发现在一个节点上连接了多于一个网络驱动器,它在将驱动器之间进行平衡流量负载。这里的平衡负载使用基于介质传输速率和队列深度的算法。可得到用于按用户意愿手动强制网络流量的命令行选项。

在节点间的多条网络路径提供了更好的吞吐量和容错能力。应用程序级的变化不需要用到容错能力,因为容错支持已经存在于本地的网络管理器中了。例如,原子能反应堆监视系统就是用这种技术成功的实现的。

作为另一种途径,廉价的串行链路可被用于在主局域网出错时的后备网络链路。通过做数据压缩、启用客户方的文件系统高速缓存等方法使串行链路以高波特率运行,串行网络的性能可以很快。


图 4.多路物理网络通过逻辑网络融洽共存。

当在局域网上的两个文件服务器进行点到点的高流量传输的时候经常导致局域网的拥塞问题,这样的设施也可以解决这种问题。通过 FLEET 的方式,加入一条专有的链路来连接两个服务器,把流量从主局域网上移到专有链路上。如果两服务器在物理上离的很近,那么象点到点的 SCSI 或总线到总线的 DMA 这样的非常规的局域网技术就成为可行的选择。这种方法可用于实现 CPU/文件服务器组[Presotto 91]。
通过制造使用 backplane (背板)总线的处理器板, FLEET 方式也允许用一个系统的 backplane 总线把多处理器系统构造为一个 VLAN (超局域网)。每个处理器板运行一个包含微内核、Proc、 Net、和 Net.vlan 驱动程序的 QNX OS,其中某个处理器可以同时使用 Net.vlan 驱动程序和 Net.ethernet 驱动程序,而 Net.ethernet 是用来访问一个外部的以太局域网的。通过为这些处理器增加额外的硬件,和适当的 Dev 或 Fsys 进程,这些处理器能变成分布式 I/O 处理器。每个在以太网上的节点可以有效的包含在一个机架上的增补处理器的 VLAN。这就使在每个以太网节点上的运行的一队处理器在这个节点内重新分布并以一个处理器队伍的方式运行。 Ziatech Inc (http://www.ziatech.com/)完成这种技术的一个实现。[Tanenbaum 89]描述的计算服务器也可以用这种硬件很容易的实现。

对于嵌入式应用,一个最小化的 QNX 系统可以被放入小于 256K 的 ROM 中(微内核、Proc 和一些应用程序)。增加一个 Net 进程和一个 Net 驱动程序( 大约 70K)之后,嵌入式系统就可以连接到一个大的网络上,变成一个大局域网的一个无缝的的扩展。这就允许嵌入式系统访问数据库、图形用户界面、局域网网关、和其他的服务。不受嵌入式系统有限的功能的限制,网络链路力图要使局域网提供给在嵌式系统上运行的进程的整个局域网资源的访问。嵌入式系统也可以从网络上引导,进一步的减少对 ROM 的要求。因为系统调试服务是通过运行被调试应用程序所在节点上的 Proc 进程的标准消息实现的,所以可以从在局域网上的其他节点上调试嵌入式系统上的应用程序。

对于主机传输层协议, Net 提供 一个“Clarkson兼容”的原始分组递送服务并可得到网络驱动器。通过以这种方式实现的协议栈,在同一个物理的局域网上的非QNX的机器可以通过协议栈的通信访问多处理器QNX 局域网。在局域网上的 QNX 节点对与外部世界(例如 TCP/IP)表现的就是一个单一的多处理器机器。

FLEET 协议的实现也支持网络桥接,允许分组在通过中介节点转发来把多个 QNX 局域网结合成一个局域网。因为 QNX 在所有基于 IEEE 802的网络上使用同样的分组格式和协议,你可以生成在以太网,令牌环、FDDI 局域网间的网桥。

  可维护性

维护一个单体内核的 OS 的基本问题是所有内核代码在一个公共的、共享的地址空间运行。内核的任何一部分都能破坏其他部分的数据空间的危险是非常现实的和每当连接新驱动程序到内核时必须考虑的。QNX 使用的方式是显式的定义组成 OS 的各部分之间的接口,每个资源管理器,就象每个用户进程一样,在自己的受保护的内存空间运行,所有 OS 模块间的通信通过标准的系统 IPC 服务完成。结果是,任何一个资源管理器产生的错误将被约束在自己的子系统中而不破坏其他的在系统中与其不相关的资源管理器。

因为新的资源管理器和设备驱动程序可以使用与用户进程同样的工具调试和调整,系统开发与应用开发使用同样的手段。这是非常重要的,因为这样就允许通过新方式用更自由的实验来实现 OS 子系统,而不用招致使用有限的工具调试内核带来的巨大工作量。

另一个要点是因为组成 OS 的模块在分开的、受 MMU 保护的地址空间运行,并且这些模块在不同的系统上是以"一致的二进制"方式运行。当在一个新系统配置下使用一个模块的时候,就允许直接适用以前的运行经验和对一个 OS 模块(设备驱动程序、文件系统管理器、内部开发的服务器进程等)获得的可靠的质量控制。相比之下,单体内核要重新连接内核来包含一个可选的 OS 模块,结果是对于不同的配置有完全不同二进制形式。这导致了对过去的 OS 服务的相关的运行经验在新的使用当中的作用的相应减少。因为二进制形式的变更,与迷途的指针错误相连在一起的“运气”和其他编码问题也变更了。曾经是一个不产生任何系统错误的和善的内存重写,在重新连接内核之后就可能导致系统崩溃。

这个问题也适用于嵌入式实时执行者和不实现内核保护的内核中,当增加开发员工的时候,一个开发者的编程错误可以导致系统的行为不容易被作者跟踪,结果是非常费时的调试任务。通过在进程间的内存保护,一个开发者的错误的在 OS 中的直接结果是终止有错误的进程(迷途的指针引用和超出边界的数组访问)。避免了"Finger pointing"并且查找问题的原因可得到立即的回报。当嵌入式系统的开发队伍变得非常大的时候,质量控制与进程模块重用的结合,联合上在调试努力期间增加的生产率,提出一个选择内存保护的微内核操作系统的有说服力的论据。没有进程间的内存保护的大队伍的嵌入式系统开发事实上是难以想象的。

性能

QNX 必然要面对的挑战是使用者的实时应用对性能的需求。尽管一个幽雅的 OS 体系结构是很有意趣的,但学术上的优美不一定带来在商业上成功的 OS ,因为它在性能上要超过传统的单体内核的系统。许多微内核系统的一个设计目标就是与单体内核的系统在性能上相匹敌 [Guillemont 91]。但是仅仅在性能水平上可匹敌将不能提供给 OS 使用者以使用基于微内核系统的在技术上的显著利益。

QNX 把完全的硬件性能提供给应用程序层(超出了单体内核系统的性能),开发出许多体系结构上的变革。这些增强的前提是不能对实时系统的性能进行让步。即使最初的研究指出增加的消息传送的模型的共性是要比单体内核有更大的开销,这里有一些结构上的想法用来更正这些误解。两个对全面的系统性能有显著贡献的概念是在资源管理器内直接支持中断处理,和多部分消息原语。从以性能为目标中解放出来,就可以凭借内核体系结构而致力于有更大的意义的系统健壮性和对管理更大编程队伍的努力。

附录 B是关于 QNX 4.24 版本的性能的简述。

  结论


通过在实现和分析 QNX 微内核体系结构时所获得的经验,可以明确微内核体系结构保持高效的同时可以比单体内核提供更强的功能,而仍然为应用程序提供兼容的 API。现存的应用程序的源代码可继续工作而不须更改,而且开发 OS 扩展变得更加容易。 OS 平台的灵活性也铺就了改变 OS 特征的更加多样和容易的实验道路。就象 RISC 处理器的体系结构上的变革产生了在计算机硬件性能上飞跃,微内核的 OS 体系结构也将在操作系统技术上建立一个新的性能和功能标准的文艺复兴一样的变革。

 

QNX是一个微内核实时操作系统,其核心仅提供4种服务:进程调度、进程间通信、底层网络通信和中断处理,其进程在独立的地址空间运行。所有其它OS服务,都实现为协作的用户进程,因此QNX核心非常小巧(QNX4.x大约为12Kb)而且运行速度极快。

 

 

LynxOS目前还不是一个微内核结构的操作系统,但它计划使用所谓的“Galaxy”技术将其从大型集成化内核改造成微内核,这一技术将在LynxOS 3.0中引入。新的28Kb微内核提供以下服务:核心启动和停止、底层内存管理、出错处理、中断处理、多任务、底层同步和互斥支持。

 

 

* RT-Linux实现了一个小的实时核心,仅支持底层任务创建、中断服务例程的装入、底层任务通信队列、中断服务例程(ISR)和Linux进程。原来的非实时Linux核心作为一个可抢先的任务运行于这个小核心之上,所有的任务都在核心地址空间运行。它不同于微内核和大型内核,属于实时EXE (realtime executive)体系结构。其可靠性和可维护性对电信服务系统来说都不够理想。

 

KURT-Linux核心包括两个部分:内核和实时模块。内核负责实时事件的调度,实时模块为用户进程提供特定的实时服务。它不属于微内核结构。

 

  1. 什么是QNX
  2. QNX与目前的AUTOSAR RTAOS
  3. 进程与线程(重点)

 

 

1.什么是QNX

   笔者从百度百科上copy了一份简短的介绍:QNX操作系统是由加拿大QSSL公司(QNX Software System Ltd.)开发的分布式实时操作系统。该操作系统既能运行于以Intel X86、Pentium等CPU为核心硬件环境下,也能运行于以PowerPC、MIPS等CPU为核心的硬件环境。QNX操作系统符合POSIX基本标准和实时标准,使其应用可以方便的进行移植。

   对于笔者来说之前看到这些关键字就头大,于是为了不让大家头大,我把加粗的关键字一一解释一遍:

分布式:简单理解就是假设在一个局域网中的计算机,大家都装了QNX,那么运行在某台机子上的软件(进程)可以跟其他机子上的软件进行通信(QNX的通信机制使得这种通信跟本机进程通信一样简单),并且使用其他计算机上的硬件资源。这样对于一些大型的项目,如果本地的计算资源不够,那么就可以将一些运算放到其他机子上去跑,廉价的机子一起组成一个超级计算机。

实时:实时性有两个方面,第一在规定时间完成指定功能,第二处理外部异步事件的能力(处理中断的能力)。

POSIX写内核的一个标准,比如说我要建立一个线程,我写内核的时候用了函数sky_create_thread(),我老大写的话可能是Lei_create_thread(),我老大的老大可能写成Jian_create_thread().没有规矩写出来的东西就乱七八糟的,POSIX就是定义这些标准的。QNX在满足这些标准的同时还加了一些自己的东西。所以综合起来是它还是满足POSIX标准的。码字太难,图片来凑:

 

 

2.QNX与目前的AUTOSAR RTAOS

QNX和RTAOS的差别,对于笔者来说最直接的区别就是,一个是加拿大的黑莓公司的,一个是ETAS的(查了下ETAS,貌似是博世的一个子公司)。其他区别的话,还记得笔者在第一文中的写的一段关于MMU的黑体吗?相比于RTAOS,由于MMU的使用,QNX更凸显进程和线程的概念,而RTAOS,软件直接运行在内存上(也可以说LMA和VMA是相同的,虚拟内存地址和加载内存地址),没有MMU,所以还是主要凸显Task的概念。大家现在简单理解就将RTAOS的task理解为QNX中的线程吧。比如rtaos下cpu0 5ms的task,就简单的理解为QNX下一个5ms运行一次的线程。(目前笔者觉得严格意义上这样理解不合理,但是又觉得他们有很多共同之处

 

3.进程与线程

对于进程核线程,老鸟不以为然,“草鸟”一脸懵逼。笔者懵逼状态百度了以下得到了以下两个答案:

进程:操作系统进行资源分配的基本单位。

线程:操作系统进行调度的基本单位。

网上找不到的答案,那就在看本教材来理解下:

我们先摒弃目前我们用hex刷到ECU,然后在上电运行的概念。想象下我们在windows下,在D盘存了个exe程序,双击以下它就运行起来了。但是这个exe文件存在了D盘,CPU不可能直接到D盘这个exe文件去一个个取指令执行吧?CPU肯定是直接跟内存打交道的,跟硬盘打交道是外设驱动的事情。所以整个执行过程简单理解下就是:

exe加载到内存,CPU从内存取exe里面的指令,然后执行。那么执行这个exe就需要分配内存等资源的对吧(分配的是虚拟内存,不是物理内存,虚拟内存到物理内存的映射由MMU实现),那么第一句话就解释了,分配这些运行所需要的资源是以进程为单位分配的目前笔者对于进程的理解就是一个存在硬盘上的可执行程序(当然这个可执行程序内还可能建立子进程,这些子进程也需要分配运行资源,大家对这个理解先持保留态度,笔者目前还没有找到更好的理解进程形象生动的例子)

从上面可以看出来进程用来分配资源,那么当一个进程切换到另一个进程运行的时候,操作系统内部关于这些进程管理(资源)有关的变量是不是都得切换?这种进程的上下文切换太庞大,耗时也太多,于是线程就来了。线程就是为了解决这个庞大的上下文切换,在进程中建立很多线程来执行。进程分配的资源线程可以共享,线程切换的时候,切换的只是线程相关的变量,这样速度和切换的时候操作系统占用的CPU资源就减少了。所以第二个问题也就解释清楚了。线程是操作系统调度的基本单位

 

讲了这么多太抽象,讲个特别简单的例子来说吧,400张图片来看看我,我老大,我老大的老大谁最帅的问题

 

单进程单线程的写法:

Int main(intargc, char* argv[])

{

     for( i=0, i<400, i++)

  {

  calculate();

  }

}

假设硬件上是4核系统,那么上面这个代码就只用了一个核,计算出来的结果耗时太多,可能系统最终计算出来,但是计算了这么长时间怎么能保证在这个时间段没超过我?

来个实时性强的,单进程多线程写法:

这样写建立四个线程,建立之后由操作系统去分配硬件资源,这样计算出来耗时肯定比第一种少。

 

当然多线程并发执行的话,对我们写的函数要求就更高了,因为多个核同时调用一个函数就要求你写的函数时re-entry的。怎么编写re-entry函数,各位小伙伴就自行百度吧。

 

你可能感兴趣的:(汽车电子,qnx)