进程

进程是现代操作系统的核心概念,它用来描述程序的执行过程,是实现多任务操作系统的基础。操作系统的其他所有内容都是围绕着进程展开的。

1.1.1程序的顺序执行与并发执行

1.程序的顺序执行

如果程序的个操作步骤之间是以序执行的,程序与程序之间是串行执行的,这种执行程序的方式就称为顺序执行。顺序执行是单道程序系统中的程序的运行方式。
程序的顺序执行具有如下特点:
(1)顺序性:CPU严格按照程序规定的顺序执行,只有当一个操作结束后,下一个操作才能执行。多个程序要运行时,只有当一个程序全部执行结束后另一个程序
才能开始。
(2)封闭性:程序在封闭的环境中运行,即程序运行时独占全部系统资源,只有程序本身才能改变程序的运行环境。因而程序的执行过程不受外界因素的影响,结
果只取决于程序自身。
(3)可再现性:程序执行的结果与运行的时间和速度无关,结果总是可再现的,即无论何时重复执行该程序都会得到同样的结果。
这种执行程序的方式简单,且便于调试。但由于顺序程序在运行时独占全部系统资源,因而系统资源利用率很低。DOS程序就是采用顺序方式执行的。

2.程序的并发执行

单道程序、封闭式运行是早期操作系统的标志,而多道程序并发运行是现代操作系统的基本特征。由于同时有多个程序在系统中运行,是系统资源得到充分的利用,系统效率大大提高。
程序的并发执行是指若干个程序或程序段同时运行。它们的执行在时间上是重叠的。程序的并发执行有以下特点:
(1)间断性:并发程序之间因竞争资源而相互制约,导致程序运行过程的间断。
(2)没有封闭性:当多个程序共享资源时,一个程序的运行受其他程序的影响,其运行过程和结果不完全由自身决定。
(3)不可再现性:由于没有了封闭性,并发程序的执行结果与执行的时机以及执行的速度有关,结果往往不可再现。
可以看出,并发执行程序虽然可以提高系统的资源利用率和吞吐量,但程序的行为变得复杂和不确定。这使得程序难以调试,若处理不当还会带来许多潜在问题。

3.并发执行的潜在问题

程序在并发执行时会导致执行结果的不可再现性,这是多道程序系统必须解决的问题。

1.1.2进程的概念

1.进程

进程(process)是一个可并发执行的程序在一个数据集上的一次运行。简单地说,进程就是程序的一次运行。
进程与程序的概念及相互关联又相互区别。程序是进程的一个组成部分,是进程的执行文本,而进程是程序的执行过程。对进程而言,程序是静态的指令的集合,可以永久存在;而进程是个动态的过程实体,动态地产生、发展和消失。
此外,进程和程序之间也不是一一对应的关系,表现在:
(1)一个进程可以顺序执行多个程序
(2)一个程序可以对应多个程序。程序的每次运行就对应了一个不同的进程。一个程序还可以同时对应多个进程。

2.进程的特性

(1)动态性:进程由“创建“而产生,由“撤销“而消亡,因“调度“而运行,因“等待“而停顿。进程从创建到消失的全过程称为进程的生命周期。
(2)并发性:在同一时间段内有多个进程在系统中活动。它们宏观上是在并发运行,而微观上是在交替运行。
(3)独立性:进程是可以独立运行的基本单位,是操作系统分配资源和调度管理的基本对象。因此,每个进程都独立地拥有各种必要的资源,独立地占有CPU运行。
(4)异步性:每个进程都独立地执行,各自按照不可预知的速度向前推进。进程之间的协调运行由操作系统负责。

3.进程的基本状态

进程有3个基本状态,即:
(1)就绪态:进程已经分配到了除CPU之外的所有资源,这时的进程状态称为就绪状态。系统中通常会有多个进程处于就绪态,它们排成一个就绪队列。
(2)运行态:进程已经获得CPU,正在运行。在单CPU系统中,任何时刻只能有一个进程处于运行态。
(3)等待态:进程因某种资源不能满足,或希望的某个事件尚未发生而暂停执行时,则称它处于等待态。系统中通常会有多个进程处于等待态,它们排成一个等待队列。

4.进程状态的转换

进程

1.1.3进程控制块

进程由程序、数据和进程数据块3个基本部分组成。程序是进程执行的可执行代码,数据是进程所处理的对象,进程控制块用于记录有关进程的各种信息。它们存在于内存,其内容会随着执行过程的进展而不断变化。在某个时刻的进程的执行内容(指代码和数据)称为进程映像(process image)。进程映像可以看作是进程的剧本,决定了进程推进的路线和行为。进程控制块则是进程的档案。系统中的每个进程都是唯一的。即使两个进程执行的是统一映像,它们也都有各自的进程控制块,因此是不同的进程。
进程控制块(Process Control Block,PCB)是为管理进程设置的一个数据结构,用于记录进程的相关信息。当创建一个进程时,系统为它生成PCB;进程完成后,撤销它的PCB。因此,PCB是进程的代表,PCB存在则进程就存在,PCB消失则进程也就结束了。在进程的生存期中,系统通过PCB来感知进程,了解它的活动情况,通过它对进程实施控制和调度。
PCB记录了有关进程的所有信息,主要包括以下4方面的内容:
(1)进程描述信息
用于记录一个进程的标识信息和身份特征,如家族关系和归属关系等。通过这些信息可以识别该进程,了解进程的权限,以及确定这个进程与其他进程之间的关系。系统为每个进程分配了一个唯一的整数作为进程标识号PID,这是最重要的标识信息。系统通过PID来标识各个进程。
(2)进程控制与调度信息
进程的运行需要由系统进行控制和调度。进程控制块记录了进程的当前状态、调度策略、优先级、时间片等信息。系统依据这些信息实施进程的控制与调度。
(3)资源信息
进程的运行需要占用一些系统资源,必要的资源包括进程的地址空间、要访问的文件和设备,以及要处理的信号等。进程是系统分配资源的基本单位。系统将分配给进程的资源信息记录在进程的PCB中。通过这些信息,进程就可以访问分配的各种资源。
(4)现场信息
进程现场也称为进程上下文(process context),包括CPU的各个寄存器的值。这些值刻画了进程的运行状态和环境。退出CPU的进程必须保存好这些现场信息,以便在下次被调度时继续运行。当进程被重新调度运行时,系统用进程PCB中的现场信息恢复CPU现场。现场一旦恢复,下一个指令周期CPU将精确地接着进程上次运行的断点处继续执行下去。

1.1.4Linux系统中的进程

Linux系统中,进程也称为任务(task),两者的概念是相同的。

1.Linux进程的状态

进程
可执行态:包含了运行和就绪两种状态。均已具备运行条件。
睡眠态:即等待态。进程在等待某个事件或资源。睡眠态又分为可中断的和不可中断的两种。他们的区别在于,在睡眠过程中,不可中断状态的进程会忽略信号,而处于中断状态的进程如果收到信号会被唤醒而进入可执行状态,待处理完信号后进入睡眠状态。
暂停态:处于暂停态的进程是由运行态转换而来,等待某种特殊处理。当进程收到一个暂停信号时则进入暂停态,等待恢复运行的信号。
僵死态:进程运行结束或因某些原因被终止时,它将释放除CPU外的所有资源。这种占有PCB但已经无法运行的进程就处于僵死状态。

2.Linux的进程描述符

Linux系统用task_struct结构来记录进程的信息,称为进程描述符,也就是通常所说的PCB。系统中每创建一个新的进程,就给它分配一个task_struct结构,并填入进程的控制信息。task_struct中的字段较多,主要包括以下内容:

  • 进程标识号(pid):标识该进程的一个整数。
  • 归属关系(uid、gid):进程的属主和属组的标识号。
  • 家族关系(parent、children、sibling):指向父进程、子进程及兄弟进程的指针。
  • 链接关系(tasks、run_list):将进程链入进程链表和可执行队列的指针。
  • 状态(state):进程当前的状态。
  • 调度信息(police、prio、time_slice):调度使用的调度策略、优先级和时间片等。
  • 记时信息(start_time、utime、stime):进程建立的时间以及占用CPU的时间。
  • 定时器(real_timer):用于设定时间。时间到时,系统会发定时信号通知进程。
  • 通信信息(signal、sighand):进程收到的信号以及使用的信号处理程序。
  • 退出码(exit_code):进程运行结束后的退出代码,供父进程查询使用。
  • 文件系统信息(fs、files):包括根目录、当前目录、打开的文件等信息。
  • 地址空间信息(mm):进程的内存地址空间,存放进程的代码、数据和堆栈。
  • 硬件现场信息(thread):进程切换时保存的CPU寄存器的内容。
  • 运行信息(thread_info):有关进程运行环境、状况的基本信息。

3.查看进程的信息

ps(process status)
-e 显示所有进程
-t tty 显示终端tty上的进程
-f 以全格式显示
-o 以用户定义的格式显示
a 显示所有终端上的所有进程
u 以面向用户的格式显示
x 显示所有不控制终端的进程
-C cmd 显示命令名为cmd的进程
n 显示PID为n的进程