VxWorks的特点主要在于嵌入式和实时性。由于嵌入式的特点,系统内核只有任务管理和简单的内存管理,在此之上可以根据需要配置各种功能模块,包括网络管理、文件系统、虚拟存储器等等。实时性则体现在实时调度算法和实时内核(高效的进程间通讯、内存管理等)。下面对这几个方面进行简要的介绍,着重介绍与UNIX不同之处,并与流行的操作系统Linux、 Windows NT进行比较,在一些应用软件开发需要注意的地方也做了说明。 VxWorks支持POSIX标准,所以POSIX的概念和接口以及一些策略都被支持,但为了提高系统性能,VxWorks另有一套接口及实现策略称为wind内核,下面的讨论主要是针对wind内核而言的,POSIX标准可以参见相关资料。 * 任务在VxWorks中,最小的程序运行单位称为任务(Task)。任务与Linux、 WindowsNT下的进程(Process)有相似也有不同之处。 每个任务包含有一段固定的代码和数据空间,操作系统内核通过任务控制块(Task Control Block)对它的执行、通讯、资源等情况进行控制。任务具有就绪、阻塞、挂起和延迟等状态。当任务被提交之后就进入挂起状态;激活后进入就绪状态,等待系统分配处理器执行;当任务申请已被占用的资源时则进入阻塞,当资源被其他任务释放后回到就绪状态等待调度;延迟是当任务等待定时器完成的状态。从任务的这些概念上看来,任务与进程是相似的。 但是在另一方面,Linux和WindowsNT下的每个进程都各自享有一块独立的线性空间,拥有自己独立的代码段、堆和栈空间,在每个进程看来都是自己独占系统内存,进程中的地址要经过系统进行进程空间到物理存储器的映射后才成为真正的物理地址。 而在VxWorks中,所有任务共同享有物理内存,存在于统一的线性空间中,每个任务没有自己独立的代码段和堆,只有独立的动态栈,任务中的地址即是真正的物理地址。 由于不需要进行地址空间映射,在任务切换时的上下文切换(Context Switch) 时间大为减少,符合实时操作系统要求快速响应的原则。从这个意义上来说, VxWorks的任务更接近Linux和WindowsNT下的线程(Thread)。 VxWorks的代码段与堆共享减少了上下文切换时间,却带来了共享代码的可重入性(Reentrancy)问题。MyFunc函数将被两个任务所调用,当其中包含对全局、静态变量等从堆中分配空间的数据进行访问时,就有可能产生冲突,从而引发错误。在应用软件开发时要加以注意,解决方法是使用局部变量(从栈中分配空间)或使用信号灯对临界代码进行监控。 * 任务调度 VxWorks有两种任务调度策略,优先级抢先调度和时间片轮转调度。这两种调度策略都是系统级的,与POSIX进程级的调度策略不同。即整个系统里要么是优先级抢先调度,要么是时间片轮转调度;而POSIX标准下可以每个进程使用自己的调度策略。系统共有256个优先级。 优先级抢先调度指的是一个优先级较低的任务正在执行中,另一个优先级较高的任务进入就绪状态,则马上进行处理器抢先,执行高优先级任务。直到高优先级释放处理器(完成、挂起、阻塞…)才继续执行低优先级任务。 优先级抢先调度可以保证实时系统的迅速响应特性,但是也带来一个问题:当系统中存在几个相同优先级的任务时,就会使单一任务独占处理器直至完成。所以加入了基于优先级的时间片轮转调度方式。在不同优先级的任务间以抢先方式调度,相同优先级的任务则以时间片进行轮转。 WindowsNT的进程调度是消息驱动的时间片轮转。Linux的进程调度也支持带优先级的时间片轮转,但它是时间片级的抢先,即调度发生在时间片结束时;而VxWorks 是指令级的抢先,即调度发生在当前指令结束时。 在任务调度中,还需要注意的是优先级倒置(Priority Inversion)问题。任务t3获取某种资源S后被高优先级任务t1抢先,在t1执行中也需要申请资源S,于是t1被阻塞, t3继续执行,但t3迅速被另一较高优先级任务t2所抢先,于是t1就必须无限期地等待 t2完成,然后执行t3直至t3释放资源S。 为了解决这个问题,VxWorks引入一种称为优先级继承(Priority Inheritance)的方法。当高优先级任务t1因为t3占用的资源而被阻塞时,t3就具有与t1相同的临时优先级,以保证它不会被t2所抢先,直至t3释放资源后恢复原有的优先级。 * 存储管理在基本的wind内核中,任务直接操作线性物理内存,不存在虚拟存储等复杂的存储管理策略,这主要是从性能来考虑的。不过VxWorks也提供支持POSIX标准的虚拟存储区和共享内存(多处理器间共享)组件。 * 任务间通讯在任务间传递控制信息时,通讯量小,wind内核支持各种UNIX的通用手段:信号灯(semaphore)、消息队列(Message Queue)、管道(Pipe)、信号(Signal)和套接字(Socket)。信号灯主要用于对临界资源访问的同步和互斥;消息队列多用于消息驱动机制;管道是基于文件系统实现的任务间按先进先出方式传送数据的通讯方式;信号相当于软中断;套接字机制主要用于网络通讯。当任务间需要大量交换数据时,由于VxWorks直接操作物理内存,可以直接访问全局存储区,不需要特别的手段,与Linux下的共享存储段申请和WindowsNT中的存储映射文件方式不同。 * 中断在VxWorks下,所有中断服务程序都不属于任何一个任务,并且使用同一个栈进行数据存储,则中断将不会引起上下文切换,以实现高效的中断响应。中断与各任务之间可以通过前面所述的各种手段进行通讯,但要注意对中断服务程序有一些限制,例如不能进行可能导致阻塞的资源申请等等。 * 文件系统 VxWorks支持多种本地文件系统:MS_DosFS、RawFS和RT-11FS,用户可根据具体配置选择;还支持网络文件系统NFS,可以没有局域文件系统。 * 网络支持 Vxworks支持多种物理介质的TCP/IP协议族和几乎所有常用的基于TCP/IP协议的应用层协议如ARP、BOOTP、SLIP和FTP,甚至其启动就是通过BOOTP或FTP方式取得系统映象文件。 * 启动由于VxWorks是一种嵌入式操作系统,它支持多种启动方式:ROM、本地磁盘或网络启动。 以上简单介绍了一些VxWorks的技术特点,要注意这些特点都是跟VxWorks的特性 ----实时性与嵌入式密切相关的。 |