1.1 进程
进程是现代操作系统的核心概念,它用来描述程序的执行过程,是实现多任务操作系统的基础。进程管理的功能是跟踪和控制所有进程的活动,为它们分配和调度CPU,协调进程的运行步调。进程管理的目标是最大限度地发挥CPU的处理能力,提高进程的运行效率。
1.1.1 程序的顺序执行和并发执行
程序的顺序执行:程序各操作步骤之间是依序执行的,程序与程序之间是串行执行的。它的特点是:顺序性、封闭性、可再现性。总体来说,这种执行方式简单,便于调试,但运行时独占系统全部资源,因而利用率低。DOS程序即是采用这种方式。
程序的并发执行:若干个程序或程序段同时运行,它们在执行时间上是重叠的。它的特点是:间断性、非封闭性、不可再现性。可以看出,并发执行程序可以提高系统的资源利用率和吞吐量,但程序的行为变得复杂和不确定。
程序的并发执行:若干个程序或程序段同时运行,它们在执行时间上是重叠的。它的特点是:间断性、非封闭性、不可再现性。可以看出,并发执行程序可以提高系统的资源利用率和吞吐量,但程序的行为变得复杂和不确定。
并发执行的潜在问题:由于并发程序执行时会导致执行结果的不可再现性,这是多道程序系统必须解决的问题。具体例子可参见(停车场使用程序控制电子公告牌来显示空闲车位数)。根本原因在于,当多个程序在访问共享资源时的操作是交叉执行的,容易造成对资源的实行错误。
1.1.2 进程的概念
多道程序并发显著提高了系统的效率,但同时也使程序的执行过程变得复杂与不确定。为了更好地研究、描述和控制并发程序的执行过程,操作系统引入了进程的概念,它对理解操作系统的并发性有着极为重要的意义。
- 进程
进程和程序既相互关联又有区别。可以类比胶片和电影的关系。具体来说,程序是进程的组成部分(另有数据集),是进程的执行文本,而进程是程序的执行过程;程序是静态的,进程是动态地产生、发展和消失;一个进程可以顺序执行多个程序,一个程序也可以对应多个进程。
2. 进程的特性
进程有几个基本特性:
动态性:进程由“创建”而产生,“撤销”而消亡,因”调度“而运行,因”等待“而停顿。进程从创建到消失的全过程称为进程的生命周期。
并发性:同一时间段有多个进程在系统中运行。宏观上并发,微观上交替。
独立性:进程是独立运行的基本单位,是系统分配资源和调度管理的基本对象。因此,进程独立拥有必要资源,独立占有CPU运行。
异步性:每个进程独立运行,进程之间由系统协调调度。
3. 进程的基本状态
进程个数一般多于CPU,故须轮流占用CPU。通常采用状态刻画进程各个时期的动态行为特征。它有3个基本状态:
就绪态:进程已分配得到除CPU外所需的所有资源,一旦获得CPU可以立马执行。通常会有多个进程处于此状态,构成就绪队列。
运行态:进程正在运行,在单核系统中,任何时刻只有一个进程处于此态。
等待态:进程因资源不足,或触发事件未发生而暂停。通常有多个进程处于此态,按等待事件分类,排成多个等待队列。
4. 进程状态的转换
进程诞生之初是处于就绪态,在其生命周期之间进行状态转移,最后在运行状态结束。引发状态转换的原因如下:
运行态—>等待态:因等待某事件无法执行,例如申请某资源,恰好被占用。
等待态—>就绪态:所需资源得到满足。
运行态—>就绪态:进程时间片用完,或被高优先级进程打断。
就绪态—>运行态:被进程调度程序选中,掌控CPU。
1.1.3 进程控制块
进程由程序、数据和进程控制块3个基本部分组成。程序是进程执行的可执行代码,数据是进程处理的对象,进程控制快记录进程的各种信息。它们存在于内存,随进程发展而变化。在某个时刻的进程的执行内容(代码和数据)称为进程映象。进程控制块是为管理进程而设置的一个数据结构,系统通过PCB来感知进程,对进城实施控制和调度。PCB主要包括4方面内容:
- 进程描述信息:进程的标识信息和身份特征,记录进程的权限,及和其它进程的关系,最重要的是进程标识号PID。
- 进程控制和调度信息:进程的当前状态、调度策略、优先级、时间片等信息。
- 资源信息:系统分配给进程的资源,包括地址空间、要访问的文件和设备,以及处理的信号等。
- 现场信息:也称进程上下文,包括CPU各寄存器的值,刻画了进程的运行状态和环境。
1.1.4 Linux系统中的进程
在Linux系统中,进程也称为任务。进程状态有多种,其中有5中基本状态:运行、就绪、可中断睡眠、不可中断睡眠、暂停和僵死。具体可参见下图
Linux系统采用task_struct结构来记录进程的信息,称为进程描述符,也即PCB,具体可参见 Linux进程管理之task_struct结构体(上)和 Linux进程管理之task_struct结构体(下)。
查看进程的信息命令是ps(process status)命令,几乎可查看进程PCB的所有信息。
1.1.5 小结
本节总结了进程的基本概念,特点,基本状态及它们之间的相互转换。此外,还有进程描述符的结构,需要仔细研究一下。