1.进程的定义
1.1进程和进程控制块
- 由一组执行的指令、一个当前状态和一组相关的系统资源表征的活动单元。
也可把进程视为由一组元素组成的实体,进程的两个基本元素是程序代码( program code,可
能被执行相同程序的其他进程共享)和与代码相关联的数据集( set of data)。假设处理器开始执行
这个程序代码,并且我们把这个执行实体称为进程。
进程控制块(PCB)
- 标识符:与进程相关的唯一标识答,用来区分其他进程
- 状态:若进程正在执行,则进程处于运行态。
- 优先级:相对于其他进程的优先顺序。
- 程序计数器:程序中即将执行的下一条指令的地址
- 内存指针:包括程序代码和进程相关数据的指针,以及与其他进程共享内存块的指针
- 上下文数据:进程执行时处理器的寄存器中的数据。
- I/O 状态信息:包括显式IO请求、分配给进程的IO设备(如磁带驱动器)和被进程使
用的文件列表等。 - 记账信息:包括处理器时间总和、使用的时钟数总和、时间限制、记账号等。
上述列表信息存放在一个称为进程控制块( PCB)的数据结构中,控制块由操作系统创建和管理。
中断实现
进程控制块是操作系统为支持多进程并提供多重处理技术的关键工具。进程中断时,操作系统会把程序计数器和处理器寄存器(上下文数据)保存到进程控制块中的相应位置,进程状态相应地改为其他值,如阻塞态或就绪态(后面将讲述)。现代操作系统可以随意将其他进程置为运行态,并把它的程序计数器和进程上下文数据加载到处理器寄存器中,进而执行这一进程。
因此,我们可以说进程由程序代码和相关数据及进程控制块组成。单处理器计算机在任何时刻最多都只能执行一个进程,而正在运行的进程的状态为运行态。
1.2进程状态
列出为进程执行的指令序列,可描述单个进程的行为,这样的序列称为进程轨迹( trace)。给出各个进程轨迹的交替方式,就可描述处理器的行为。
两状态进程模型
进程可处于以下两种状态之一:运行态或未运行态。
必须用某种方式来表示每个进程,以便使得操作系统能够跟踪到它,即必须有一些与进程相关的信息,包括进程在内存中的当前状态和位置,即进程控制块。未运行进程必须位于某种类型的队列中,并等待执行时机。
图中给出了一个结构,该结构中有一个队列,队列中的每项都指向某个特定进程的指针,或队列可以由数据块构成的链表组成,每个数据块表示一个进程。
我们可以用这个排队图来描述分派器的行为**。被中断的进程转移到等待进程队列中**,或在 (离开系统)。在任何情形下,分派器均从队列中选择个进程来执行。
进程的创建和终止
进程的创建
进程的创建将一个新进程添加到正被管理的进程集时,操作系统需要建立用于管理该进程的数据结构(见1.3节),并在内存中给它分配地址空间,这些行为构成了一个新进程的创建过程。
- 创建进程的原因
事件 | 说明 |
---|---|
新的批处理作业 | 批处理作业控制流通常会提供给操作系统,当操作系统准备接收新工作时,读取下一个作业 |
交互登录 | 终端用户登录到系统 |
为提供服务而由操作系统创建 | 操作系统可以创建一个进程,代表用户程序执行一个功能,使用户无须等待(如控制打印的进程) |
由现有进程派生 | 基于模块化的考虑或开发并行性,用户程序可以指示创建多个进程 |
当操作系统为另一个进程的显式请求创建一个进程时,这个动作就称为进程派生
当一个进程派生另一个进程时,前一个称为父进程,被派生的进程称为子进程。典型情况下,相关进程需要相互之间的通信和合作。
进程的终止
进程终止的典型原因有正常完成、超过时限、无可用内存、算术错误、父进程终止、父进程请求等等。任何一个计算机系统都必须为进程提供表示其完成的方法,批处理作业中应包含一个Halt指令或其他操作系统显式服务调用来终止。在有些操作系统中,进程可被创建它的进程终止,或在父进程终止时而终止。
五状态进程模型
- 运行态:进程正在执行。本章中假设计算机只有一个处理器,因此一次最多只有一个进程
处于这一状态。 - 就绪态:进程做好了准备,只要有机会就开始执行。
- 阻塞/等待态:进程在某些事件发生前不能执行,如IO操作完成。
- 新建态:刚刚创建的进程,操作系统还未把它加入可执行进程组,它通常是进程控制块已经创建但还未加载到内存中的新进程
- 退出态:操作系统从可执行进程组中释放出的进程,要么它自身已停止,要么它因某种原因被取消
状态转化
- 运行→就绪:正在运行的进程已到达“允许不中断执行”的最大时间段。这类转换还有很多其他原因,例如因为优先级的原因中断进程A的行,将处理器分派给进程B,此时我们说操作系统抢占了进程A。最后一种情况是,进程自愿释放对处理器的控制,
后台进程。 - 运行→阻塞:进程请求其必须等待的某些事件时,则进入阻塞态。例如,进程可能请求操作系统的一个服务,但操作系统无法立即予以服务;也可能请求一个**无法立即得到的资源,**如文件或虚存中的共享区域:还有可能需要进行某种初始化的工作,如IO操作所遇到的情况等。
- 就绪一退出:为清楚起见,状态图中未表示这种转换。在某些系统中,父进程可在任何时刻终止一个子进程。如果父进程终止,那么与该父进程相关的所有子进程都将被终止
- 阻塞→退出:前一项给出了注。
- 在多阻塞队列模型中,因相同事件原因的阻塞态进程被放在一个队列中,相应队列中的所有讲程都将转换到就绪态
五状态进程模型
回忆可知,机器变得复杂的原因是,I/O活动远慢于计算速度,这使得单道程序系统中的处理器大多时间处于空闲状态。解决方案之二是交换,即把内存中某个进程的一部分或全部移到磁盘中。当内存中不存在就绪态的进程时,操作系统就把被阻塞的进程换出到磁盘中的挂起队列,即临时从内存中“踢出”的进程队列。操作系统此后要么从挂起队列中取出另一个进程,要么接受一个新进程的请求,将其放入内存运行
- 就绪态:进程已在内存中并可以执行。
- 阻塞态:进程已在内存中并等待一个事件。
- 阻塞/挂起态:进程己在外存中并等待一个事件。
- 就绪桂起态:进程已在外存中,但只要载入内存就可执行。
下面总结挂起进程的概念。首先,挂起进程具有如下特点:
- 该进程不能立即执行。
- 该进程可能在也可能不在等待一个事件。若在等待一个事件,那么阻塞条件不依赖于挂起
条件,阻塞事件的发生不会使进程立即执行。 - 为阻止该进程执行,可通过代理使其置于挂起态,代理可以是进程本身,也可以是父进程或操作系统
- 除非代理显式地命令系统进行状态转换,否则该进程无法从这一状态转移。
挂起的原因有很多,比如:交换(释放内存)、其他OS原因(避免死锁等)、交互式用户请求(用户操作)、定时(周期进行的程序)、父进程请求(子进程出错),但以上所有情形挂起进程的活动都是由最初请求挂起操作的代理请求的
1.3进程描述
操作系统为了管理进程和资源,必须掌握每个进程和资源的当前状态。普遍采用的方法是,操作系统构造并维护其管理的每个实体的信息表。即操作系统维护的4种不同类型的表:内存、I/O、文件和进程。
- 内存表:用于跟踪内存和外存。内存的某些部分为操作系统保留,剩余部分供进程使用,外存中保存的进程使用某种虚存或简单的交换机制。
- IO表 :管理计算机系统中的IO设备和通道。在任意给定时刻,某个IO设备要么可用,要么已分配给特定的进程。正在进行IO操作时,操作系统需要知道IO操作的状态,以及作为IO传送的源与目标的内存单元。
- 文件表:文件表提供关于文件是否存在、文件在外存中的位置,当前状态和其他属性的信息。大部分信息(非全部信息)可能由文件管理系统维护和使用。此时操作系统仅有少许或没有关于文件的信息;在其他操作系统中,文件管理的许多细节由操作系统本身管理。
- 进程表 :管理进程的表,接下来会主要学习进程表。
进程控制结构
- 操作系统在管理和控制进程时,首先要知道进程的位置,其次要知道进程的属性(如进程ID、进程状态)。
进程位置在处理进程位置和属性问题前,首先要解决一个更基本的问题:*进程的物理表示是什么?*进程最少必须包括一个或一组被执行的程序,而与这些程序相关联的是局部变量、全局变量和任何已定义常量的数据单元。因此,一个进程至少应有足够的内存空间来保存其的程序和数据;此外,程序的执行通常涉及用于跟踪过程调用和过程间参数传递的栈。最后,还有与每个进程相关的许多属性,以便操作系统控制该进程。通常,属性称为进程控制块。程序、数据、栈和进程控制块的集合称为进程映像。
进程控制块信息分为三类:进程标志信息、处理器状态信息、进程控制信息
- 进程标准信息 : 对于每一个进程来说,操作系统都给其分配了一个唯一的进程标志符(PID),对于进程标志信息除了自身的进程标志符外还有父进程的标识符以及用户的标识符
- 处理器状态信息:运行进程时,进程的信息会出现在寄存器中,但中断进程时,需要把这些寄存器的信息都保存下来,以便于之后回复之前的工作状态,数据类型主要分为:用户可见寄存器、控制和中泰寄存器和栈指针
- 进程控制信息:它是操作系统控制和协调各种活动进程所需的额外信息。如:调度和状态信息、数据结构、进程间通信、进程特权、存储管理资源所有权和使用情况等。
每个进程映像都由进程控制块、用户栈、进程专用地址空间(程序、数据)以及与其他进程共享的其他地址空间组成。
- 进程控制块的作用
进程控制块是操作系统中最重要的数据结构。每个进程控制块都包含操作系统所需进程的所有信息。实际上,操作系统中的每个模块,包括那些涉及调度、资源分配、中断处理、性能监控和分析的模块,都能读取和修改它们。我们可以说资源控制块集合定义了操作系统的状态。
1.4进程控制
执行模式
非特权模式通常称为用户模式,因为用户程序通常在该模式下运行:特权模式称为系统模式、控制模式或内核模式,内核模式指的是操作系统的内核,它是操作系统中包含重要系统功能的部分。
使用两种模式的原因是保护操作系统和重要的操作系统表(如进程控制块)不受用户程序的干扰。在内核模式下,软件会完全控制处理器及其所有指令、寄存器和内存。为安全起见,这种级别的控制对用户程序而言没有必要。
进程创建
- 为新进程分配一个唯一的进程标识符。
- 为进程分配空间。这包括进程映像中的所有元素。
- 初始化进程控制块。
- 设置正确的链接。(调度队列维护链表)
- 创建或扩充其他数据结构。
进程切换
何时切换进程?
首先考虑系统中断。实际上,大多数操作系统都会区分两种系统中断:一种称为中断,另一种称为陷阱。前者与当前正运行进程无关的某种外部事件相关;后者与当前正运行进程产生的错误或异常条件相关。
机制 | 原因 | 用途 |
---|---|---|
中断 | 来自当前执行指令的外部 | 对异步外部事件的反应 |
陷阱 | 与当前执行指令相关 | 处理一个错退成一个呈常条件 |
系统调用 | 显式请求 | 调用操作系统函数 |
- 常见中断:时钟中断、I/O中断、内存失效
对于陷阱,操作系统则确定錯误或异常条件是否致命。致命时,当前正运行进程置为退出态,并切换进程;不致命时,操作系统的动作将取决于错误的性质和操作系统的设计,操作系统可能会尝试恢复程序,或简单地通知用户。操作系统可能会切换进程,或继续当前运行的进程。
最后,操作系统可被来自正执行程序的系统调用激活。例如,正运行用户进程执行了一个请求IO操作的指令(如打开文件),这时该调用会转移到作为操作系统代码一部分的一个例程。使用系统调用时会将用户进程置为阻塞态。
模式切换
回忆可知,在中断阶段,处理器会根据出现的中断信号来检査中断是否出现。无中断出现时,处理器会继续取指阶段,并在当前进程中取当前程序的下一条指令:出现中断时,处理器会做如下工作:
- 将程序计数器置为中断处理程序的开始地址。
- 从用户模式切换到内核模式,以便中断处理代码包含特权指令
现在的问题是,保存的上下文包括哪些内容?答案是,它必须保存称为处理器状态信息的进程控制块部分,包括程序计数器、其他处理器寄存器和栈信息
进程切换
模式切换可在不改变运行态进程的状杰的情况下出现。此时保存上下文并在以后恢复上下文仅需很少的开销。但是,若当前正运行进程将转换为另一状态(就绪、阻塞等),则操作系统必须使环境产生实质性的变化。完整的进程切换步骤如下:
- 保存处理器的上下文,包括程序计数器和其他寄存器。
- 更新当前处于运行态进程的进程控制块,包括进程的状态、退出运行态的原因和记账信息
- 把该进程的进程控制块移到相应的队列(就绪、挂起)。
- 选择另一个进程执行。
- 更新所选进程的进程控制块,包括把进程的状态改为运行态
- 更新内存管理数据结构。是否需要更新取决于管理地址转换的方式。
- 载入程序计数器和其他寄存器先前的值,将处理器的上下文恢复为所选进程上次退出运行态时的上下文。
1.5操作系统的执行
- 无进程内核 :中断时,保存进程上下分,控制权转给内核,处理后恢复被中断进程。
- 在用户进程内运行:保存模式上下分,并切换内核模式,并不需要切换进程,只是在同一进程切换模式
- 基于进程的操作系统:把操作系统作为一组系统进程来实现
1.6 UNIX 进程管理
- 被抢占:内核->用户时,内核抢占了用户进程,并切换了其他的进程