|
知识路径: > 嵌入式系统软件基础知识 > 嵌入式操作系统基础知识 > 处理器管理 > 分区、进程、线程、任务的概念 >
|
被考次数:27次
被考频率:高频率
总体答错率:52%  
知识难度系数:
|
由 软考在线 用户真实做题大数据统计生成
|
相关知识点:38个
|
|
|
|
在多道系统当中,允许多个程序同时存在,各个程序之间是并发执行的,它们共享系统的资源。CPU需要在各个运行的程序之间来回地切换,不断地从一个程序切换到另一个程序,这样一来,仅仅依靠静态的“程序”这个概念,要想正确地描述这些多道的并发活动过程就变得非常的困难,因此引入“进程”“线程”“任务”等概念。
|
|
|
|
简单而言,一个进程就是一个正在运行的程序。一般来说,一个进程至少应该包括以下几个方面的内容。
|
|
|
.相应的程序:进程既然是一个正在运行的程序,当然需要有相应程序的代码和数据。
|
|
|
.CPU上下文:指程序在运行时,CPU中各种寄存器的当前值,包括:程序计数器,用于记录将要取出的指令的地址;程序状态字,用于记录处理器的运行状态信息;通用寄存器,用于存放数据或地址;段寄存器,用于存放程序中各个段的地址;栈指针寄存器,用于记录栈顶的当前位置。
|
|
|
.一组系统资源:包括操作系统用来管理进程的数据结构、进程的内存地址空间、进程正在使用的文件等。
|
|
|
|
(1)动态性。进程是一个正在运行的程序,而程序的运行状态是在不断地变化的。例如,当一个程序在运行的时候,每执行完一条指令,PC寄存器的值就会增加,指向下一条即将执行的指令。而CPU中用来存放数据和地址的那些通用寄存器,它们的值肯定也不断地变化。另外,堆和栈的内容也在不断地变化,每当发生一次函数调用时,就会在栈中分配一块空间,用来存放此次函数调用的参数和局部变量。而当函数调用结束后,这块栈空间就会被释放掉。
|
|
|
(2)独立性。一个进程是一个独立的实体,是计算机系统资源的使用单位。每个进程都有自己的运行上下文和内部状态,在它运行的时候独立于其他的进程。
|
|
|
(3)并发性。从宏观上来看,在系统中同时有多个进程存在,它们相互独立地运行。
|
|
|
下图表示四个进程A、B、C、D在系统中并发地运行。从中可以看出,虽然从宏观上来说,这四个进程都是在系统中运行,但从微观上来看,在任何一个特定的时刻,只有一个进程在CPU上运行。从时间上来看,开始是进程A在运行,然后是进程B在运行,然后是进程C和进程D。接下来又轮到了进程A去运行。因此,在单CPU的情形下,所谓的并发性,指的是宏观上并发运行,而微观上还是顺序运行,各个进程轮流去使用CPU资源。
|
|
|
|
|
在具体实现上,以CPU中的程序计数器PC为例,真正物理上的PC寄存器只有一个。当四个进程在轮流执行时,PC取值的运动轨迹是先在进程A内部流动,然后再到进程B的内部流动,再到进程C和D。从进程的独立性角度来说,每个进程都有“自己”独立的PC寄存器,即逻辑上的PC寄存器,它们的取值相互独立、互不影响。所谓的逻辑PC,其实就是一个内存变量。例如,在上图中,当进程A要执行的时候,就把A的逻辑PC的值拷贝到物理PC中,然后开始运行。当轮到B运行的时候,先把物理PC的当前值保存到A的逻辑PC中,然后再把B的逻辑PC的值装入到物理PC中,即可运行。这样就实现了各个进程的轮流运行。
|
|
|
|
在20世纪80年代中期,人们提出了更小的能独立运行的基本单位,也就是“线程”。
|
|
|
所谓线程,就是进程当中的一条执行流程(见下图),这样做的好处是:
|
|
|
|
|
.在一个进程当中,或者说在一个资源平台上,可以同时存在多个线程。如下图所示,在这个例子当中,一个进程包含有三个线程。
|
|
|
|
|
.可以用线程来作为CPU的基本调度单位,使得各个线程之间可以并发地执行。
|
|
|
.对于同一个进程当中的各个线程来说,由于它们是运行在相同的资源平台上,因此它们可以共享该进程的各种资源,如内存地址空间、代码、数据、文件等等,这就使得线程之间的通信与交流变得非常方便。
|
|
|
既然线程是代码在进程的资源平台上的一条执行流程,那么是不是进程的所有资源都能够共享呢?答案是否定的。对于同一个进程的各个线程,它们可以共享该进程的大部分资源,但也有一小部分的资源是不能共享的,每个线程都必须拥有各自独立的一份。这些资源包括CPU运行上下文(如程序寄存器、状态寄存器、通用寄存器和栈指针等)和栈。
|
|
|
|
在许多嵌入式操作系统中,并没有使用“进程”或“线程”这两个术语,而是把能够独立运行的实体称为“任务”,那么这里所说的任务到底是进程还是线程呢?对于不同的系统,这个问题有不同的回答。
|
|
|
VxWorks的“任务”就是线程,类似的系统还有μC/OS-II、Jbed等。当然,也有一些嵌入式操作系统,如一些嵌入式Linux系统,其任务指的是进程。为了方便起见,在本书中将按照惯例统一使用“任务”这个名词术语,并在需要的时候指明其是进程还是线程。
|
|
|