进程基础整理

来源:互联网 发布:mac文件复制到u盘里 编辑:程序博客网 时间:2024/06/10 16:10

 “A process can be thought of as a program  in execution.”

这是《操作系统概念 影印版 第七版》进程管理(Process Management)这一部分的开篇语——“进程是程序的执行(或进程是用来执行程序的)”。由此可见,进程(Process)和程序(Program)是有着紧密联系的,程序是进程的一种静态描述,系统中运行的每一个程序都是在它的进程中在运行的。

在这里,对进程的介绍也以对程序和进程的区分为开头。

《现代操作系统》中有很好的一个比喻,“想象一位有一手好厨艺的计算机科学家正在为他的女儿烘制生日蛋糕。他有做生日蛋糕的食谱,厨房里有所需的原料:面粉、鸡蛋、糖、香草汁等。在这个比喻中,做蛋糕的食谱就是程序(即用适当形式描述的算法),计算机科学家就是处理器(CPU),而做蛋糕的各种原料就是输入数据。进程就是厨师阅读食谱、取来各种原料以及烘制蛋糕等一系列动作的总和。”这里的关键点是:进程是动态的,程序是静态的,进程虽然是由程序所产生的,但它不是程序。程序只是一个静态的命令集合,不占用系统的运行资源;而进程是随时都可能发生变化的、动态的、使用系统运行资源的,而且如果一个程序被运行的多遍,则算作多个不同的进程。

与每个进程相关的是进程的地址空间(address space),这是从某个最小值存储位置(通常是零)到某个最大值存储位置的列表,进程可以读写这个地址空间。该地址空间中存放有可执行程序、程序的数据以及程序的堆栈。与每个进程相关的还有某些寄存器集合(包括程序计数器、堆栈指针和其他硬件寄存器)以及运行该程序所需要的所有其他信息。进程的映像(image)如下图描述:

 

归结起来,进程具有以下四个要素:

—要有一段程序供该进程运行

—进程专用的系统堆栈空间

—进程控制块(Process Control Block,简称PCB),在Linux中的具体实现是task_struct

—有独立的存储空间

Linux系统中所有的进程都是相互联系的,处理初始化进程外,所有进程都与一个父进程。新进程不是被创建,而是被复制,或是从以前的进程复制而来。Linux系统中的所有进程都是由一个进程号为1的init进程衍生而来,我们在Shell命令行里执行程序所启动的进程则是Shell进程的子进程。所启动的进程可以再去启动自己的子进程,这样就形成了一棵进程树,每个进程对应树中的一个节点,其中init是树的根。(这里说是“复制”,是就系统调用fork的作用而言的,是一种不怎么确切的说法,因为在fork之后一般都会有一个exec系统调用,所以我们在之后说道子进程的产生,都是说成父进程经fork调用创建子进程。)

Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性:

—交互进程:由一个shell启动的进程。可在前台运行,也可在后台运行。

—批处理进程:和终端没有联系,是一个进程序列。

—监控进程(也称守护进程):Linux系统启动时启动的进程,在后台运行。

每个进程在操作系统中的唯一进程标识为进程控制块(Process Control Block,简称PCB)。

在Linux中,每个进程在创建时都会被分配一个数据结构,即PCB。PCB是系统为了管理进程设置的一个专门的数据结构,用它来记录进程的外部特征,描述进程的运动变化过程。系统利用PCB来控制和管理进程,所以PCB是系统感知进程存在的唯一标识。进程与PCB是一一对应的关系。

下图展示了在一个典型系统中的关键字段。第一列中的字段与进程管理有关。其他两列分别与存储管理和文件管理有关。应该注意到进程表中的字段是与系统密切相关的,不过该图给出了所需要信息的大致介绍。


下面对PCB所包含内容做一详细的解释:

—进程标识符(进程ID):每个进程都必须有一个唯一的标识符,是一个数字。

—进程当前的状态:用来说明进程当前所处的状态。为了管理的方便,系统设计时会将相同状态的进程组成一个队列,如就绪队列,等待进程则要根据等待时间的不同组成多个等待队列,如等待打印机队列、等待磁盘I/O完成队列等等。

—进程相应的程序和数据地址,以便把PCB与其进程和数据联系起来。

—进程的资源清单:列出所拥有的除CPU外的资源记录,如拥有的I/O设备,打开的文件列表。

—进程优先级:进程的优先级反映进程的何时会被调度(也可理解为进程的紧迫程度,通常优先级越高的越能够早的得到CPU以执行程序,故可认为优先级越高其进程越紧迫)。

—CPU现场保护区:当进程因某种原因不能继续占用CPU时(如等待I/O的完成),就要释放CPU,这是就要将此进程的所有的状态信息保存起来,将来在得到CPU继续执行时,直接恢复这个进程CPU现场,就好像从未离开过CPU一样。

—进程同步与通信机制:用于实现进程间互斥、同步和通信所需的信号量等。

—进程所在队列PCB的链接字:根据进程所处的现行状态,进程对应的PCB参加到不同的队列中(等待队列,就绪队列...)。PCB链接字指出该进程所在队列中下一个进程PCB的首地址。

—与进程有关的其他信息:如进程记账信息,进程占用CPU的时间,进程组,时间片所对应的报警时间等等。

PCB中包含了很多重要的信息,供系统调用和进程本身的执行使用,其中最重要的某过于进程ID(Process ID)了,进程ID是一个非负整数,在Linux操作系统中唯一的标识一个进程。

在Linux中有一些专用的进程:

进程ID 0 是调度进程,常常被称为交换进程(swapper)。该进程并不执行任何磁盘上的程序,而是作为内核的一部分,因此也被称为系统进程

进程ID 1 通常是init进程,在自举过程结束时由内核调用。init通常读与系统有关的初始话文件(/etc/rc*),并将系统引导到一个状态(如多用户状态)。init进程绝不会终止。它是一个普通的用户进程(与交换进程不同,它不是内核中的系统进程),但是以超级用户特权运行。

可以通过Linux提供的getpid函数调用来返回系统当前进程的进程ID。(注:在同一个系统下多次运行同一个应用程序,每一次运行时所分配的进程ID都是不相同的)

参考资料:

1.《Linux C编程 从初学到精通》

2.《现代操作系统》

3.《操作系统概念 影印版 第七版》


0 0