目录
嵌入式操作系统分类
1、按软件结构分类
任务管理
1、多道程序
2、进程
3、线程
4、任务
嵌入式操作系统分类
1、按软件结构分类
按照软件的体系结构,可以把嵌入式操作系统分为三大类:单体结构、分层结构和微内核结构。它们之间的差别主要表现在两个方面:
一是内核的设计,即在内核中包含了哪些功能组件;
二是在系统中集成了哪些其他的系统软件(如设备驱动程序和中间件)。
1)单体结构
在单体结构的操作系统中,中间件和设备驱动程序通常就集成在系统内核当中。整个系统通常只有一个可执行文件,里面包含了所有的功能组件(如图4-10 所示)。系统的结构就是无结构,整个操作系统由--组功能模块组成,这些功能模块之间可以相互调用。例如,嵌入式Linux操作系统、Jbed RTOS、μC/OS-II和PDOS都属于单体内核系统。
单体结构的优点:性能较好,系统的各个模块之间可以相互调用,通信开销比较小。
单体结构的缺点:操作系统具有体积庞大、高度集成和相互关联等特点,因而在系统剪裁、修改和调试等方面都较为困难。2)分层结构
在分层结构中,一个操作系统被划分为若千个层次,各个层次之间的调用关系是单
向的,即某一层上的代码只能调用比它低层的代码。与单体结构相似,分层结构的操作
系统也是只有一个大的可执行文件,其中包含有设备驱动程序和中间件。由于采用了层
次结构,所以系统的开发和维护都较为简单。但是,这种结构要求在每个层次上都要提
供一组API接口函数,这就会带来额外的开销,从而影响到系统的规模和性能。图4-11
所示为MS-DOS的结构,这是一个有代表性的、良好组织的分层结构。
3)微内核结构微内核结构或者客户-服务器结构的操作系统是指在内核中将操作系统的大部分功
能都剥离出去,只保留最核心的功能单元(如进程管理和存储管理),微内核结构的特点
就是内核非常小,大部分的系统功能都位于内核之外,例如设备驱动程序,所有的设备
驱动程序都被置于内核之外,如图4-12所示。在微内核操作系统中,新的功能组件可以被动态地添加进来,所以它具有易于扩展、
调试方便等特点。另外,由于大部分的系统功能被放置在内核之外,而且客户单元和服
务器单元的内存地址空间是相互独立的,因此系统的安全性更高。它还有一个优点就是
移植方便。但是,与其他类型的操作系统相比(如单体内核),微内核操作系统的运行速
度可能会慢一些,这是因为核内组件与核外组件之间的通信方式是消息传递,而不是直
接的函数调用。另外,由于它们的内存地址空间是相互独立的,所以在切换的时候,也
会增加额外的开销。许多嵌入式操作系统采用的都是微内核的方式,如OS-9、CExecutive、
VxWorks、CMX-RTX、 Nucleus Plus和QNX等。
任务管理
1、多道程序
嵌入式操作系统可以分为两种类型:单道程序设计和多道程序设计。
单道程序设计:在操作系统当中,在任何时候只能有-一个程序在运行。
多道程序设计:在操作系统当中,允许多个程序同时存在并运行。
在现代操作系统当中,为了提高系统资源的利用率,普遍采用多道程序技术。
2、进程
进程:
一个进程就是一个正在运行的程序。 一般来说, 一个进程至少应该包括以下几个方面的内容。
●相应的程序:进程是一个正在运行的程序,需要有相应程序的代码和数据。
● CPU上下文:指程序在运行时,CPU 中各种寄存器的当前值,包括:
程序计数器:用于记录将要取出的指令的地址;
程序状态字:用于记录处理器的运行状态信息;
通用寄存器:用于存放数据或地址;
段寄存器:用于存放程序中各个段的地址; 栈指针寄存器,用于记录栈顶的当前位置。
●一组系统资源:包括操作系统用来管理进程的数据结构、进程的内存地址空间、 进程正在使用的文件等。
进程有动态性、独立性和并发行三个特性。
(1)动态性。进程是一个正在运行的程序,而程序的运行状态是在不断地变化的。 例如,当一个程序在运行的时候,每执行完一条指令,PC 寄存器的值就会增加,指向下 一条即将执行的指令。而CPU 中用来存放数据和地址的那些通用寄存器,它们的值肯定也不断地变化。另外,堆和栈的内容也在不断地变化,每当发生一次函数调用时,就会在栈中分配一块空间,用来存放此次函数调用的参数和局部变量。而当函数调用结束后,这块栈空间就会被释放掉。
(2)独立性。 一个进程是一个独立的实体,是计算机系统资源的使用单位。每个进
程都有自己的运行上下文和内部状态,在它运行的时候独立于其他的进程。
(3)并发性。从宏观上来看,在系统中同时有多个进程存在,它们相互独立地运行。图4-14表示四个进程 A 、B 、C 、D 在系统中并发地运行。从中可以看出,虽然从宏观上来说,这四个进程都是在系统中运行,但从微观上来看,在任何一个特定的时刻,只有一个进程在 CPU 上运行。从时间上来看,开始是进程 A 在运行,然后是进程 B 在运行,然后是程 C 和进程 D 。接下来又轮到了进程 A 去运行。因此,在单 CPU 的情 形下,所谓的并发性,指的是宏观上并发运行,而微观上还是顺序运行,各个进程轮流去使用CPU 资源。
在具体实现上,以 CPU中的程序计数器 PC 为例,真正物理上的 PC 寄存器只有一 个。当四个进程在轮流执行时,PC 取值的运动轨迹是先在进程 A 内部流动,然后再到进 程 B 的内部流动,再到进程C 和 D 。从进程的独立性角度来说,每个进程都有“自己” 独立的 PC 寄存器,即逻辑上的 PC 寄存器,它们的取值相互独立、互不影响。所谓的逻辑 PC, 其实就是一个内存变量。例如,在图4-14中,当进程 A 要执行的时候,就把A 的逻辑 PC 的值拷贝到物理PC 中,然后开始运行。当轮到B 运行的时候,先把物理 PC 的当前值保存到 A 的逻辑 PC 中,然后再把B 的逻辑PC 的值装入到物理PC 中,即可运行。这样就实现了各个进程的轮流运行。
3、线程
线程:是CPU调度的最小单位(程序执行流的最小单元),它被包含在进程之中,是进程中的实际运作单元。一条线程是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
线程的组成:线程ID、当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单元,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现处间断性。
线程也有就绪、阻塞和运行三种基本状态。
就绪状态:是指线程具备运行的所有条件,逻辑上可以运行,在等待处理机;
运行状态:是指线程占有处理机正在运行;
阻塞状态:是指线程在等待一个事件(如某个信号量),逻辑上不可执行。
每一个程序都至少有一个线程,若程序只有一个线程,那就是程序本身。
线程和进程的关系:进程有独立的地址空间,线程没有单独的地址空间(同一进程内的线程共享进程的地址空间)。
举例说明线程:
假设,一个文本程序,需要接受键盘输入,将内容显示在屏幕上,还需要保存信息到硬盘中。若只有一个进程,势必造成同一时间只能干一样事的尴尬(当保存时,就不能通过键盘输入内容)。若有多个进程,每个进程负责一个任务,进程A负责接收键盘输入的任务,进程B负责将内容显示在屏幕上的任务,进程C负责保存内容到硬盘中的任务。这里进程A,B,C间的协作涉及到了进程通信问题,而且有共同都需要拥有的东西——-文本内容,不停的切换造成性能上的损失。若有一种机制,可以使任务A,B,C共享资源,这样上下文切换所需要保存和恢复的内容就少了,同时又可以减少通信所带来的性能损耗,那就好了。这种机制就是线程。
4、任务
在许多嵌入式操作系统中,并没有使用“进程”或“线程”这两个术语,而是把能 够独立运行的实体称为“任务”。
VxWorks 的“任务”就是线程,类似的系统还有μC/OS-Ⅱ、Jbed 等。当然,也有一 些嵌入式操作系统,如一些 嵌入式 Linux 系统,其任务指的是进程 。为了方便起见,在 本书中将按照惯例统一使用“任务”这个名词术语,并在需要的时候指明其是进程还是线程。