操作系统第三章.docx
第二部分:进程第三章 进程描述和控制3.1.1 背景在给进程下定义之前,首先总结一下第1章和第2章介绍的一些概念:1)一个计算机平台包括一组硬件资源,比如处理器、内存、I/O 模块、定时器和磁盘驱动器等。2)计算机程序是为执行某些任务而开发的。在典型的情况下,它们接受外来的输入,做一些处理之后,输出结果。3)直接根据给定的硬件平台写应用程序效率是低下的,主要原因如下:a)针对相同的平台可以开发出很多应用程序,所以开发出这些应用程序访问计算机资源的通用例程是很有意义的。b)处理器本身只能对多道程序设计提供有限的支持,需要用软件去管理处理器和其他资源同时被多个程序共享。c)如果多个程序在同一时间都是活跃的,那么需要保护每个程序的数据、I/O 使用和其他资源不被其他程序占用。4)开发操作系统是为了给应用程序提供一个方便、安全和一致的接口。操作系统是计算机硬件和应用程序之间的一层软件(如图2.1 所示),对应用程序和工具提供了支持。5)可以把操作系统想象为资源的统一抽象表示,可以被应用程序请求和访问。资源包括内存、网络接口和文件系统等。一旦操作系统为应用程序创建了这些资源的抽象表示,就必须管理它们的使用,例如一个操作系统可以允许资源共享和资源保护。有了应用程序、系统软件和资源的概念,就可以讨论操作系统怎样以一个有序的方式管理应用程序的执行,以达到以下目的:资源对多个应用程序是可用的。物理处理器在多个应用程序间切换以保证所有程序都在执行中。处理器和I/O 设备能得到充分的利用。所有现代操作系统采用的方法都是依据对应于一个或多个进程存在的应用程序执行的一种模型。3.1.2 进程和进程控制块在进程执行时,任意给定一个时间,进程都可以唯一地被表征为以下元素:标识符:跟这个进程相关的唯一标识符,用来区别其他进程。状态:如果进程正在执行,那么进程处于运行态。优先级:相对于其他进程的优先级。程序计数器:程序中即将被执行的下一条指令的地址。内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享内存块的指针。上下文数据:进程执行时处理器的寄存器中的数据。I/O 状态信息:包括显式的I/O 请求、分配给进程的I/O 设备(例如磁带驱动器)和被进程使用的文件列表等。记账信息:可能包括处理器时间总和、使用的时钟数总和、时间限制、记账号等。3.2进程状态eg1:考虑一个非常简单的例子,图3.2 给出了三个进程在内存中的布局,为简化讨论,假设没有使用虚拟内存,因此所有三个进程都由完全载入内存中的程序表示,此外,有一个小的分派器一1使处理器从一个进程切换到另一个进程。图3.3 给出了这三个进程在执行过程早期的轨迹,给出了进程A 和C 中最初执行的12 条指令,进程B 执行4 条指令,假设第4 条指令调用了进程必须等待的I/O 操作。图3.2 在指令周期13 时的执行快照(如图3.4 所示)现在从处理器的角度看这些轨迹。图3.4 给出了最初的52个指令周期中交替的轨迹(为方便起见,指令周期都给出了编号)。在图中,阴影部分代表由分配器执行的代码。在每个实例中由分派器执行的指令顺序是相同的,因为是分派器的同一个功能在执行。假设操作系统仅允许一个进程最多连续执行6 个指令周期,在此之后将被中断,这避免了任何一个进程独占处理器时间。如图3.4 所示,进程A 最初的6 条指令被执行,接下来是一个超时并执行分派器的某些代码,在控制转移给进程B 之前分派器执行了6 条指令二2。在进程B 的4 条指令被执行后,进程B 请求一个它必须等待的I/O 动作,因此,处理器停止执行进程B,并通过分派器转移到进程C。在超时后,处理器返回进程A,当这次处理超时时,进程B 仍然等待那个I/O 操作的完成,因此分派器再次转移到进程C。图3.3 图3.2 中进程的轨迹图3.4 图3.2 中进程的组合轨迹3.2.1 两状态进程模型在任何时刻,一个进程要么正在执行,要么没有执行一个进程可以处于以下两种状态之一:运行态或未运行态,如图3.5a 所示。当操作系统创建一个新进程时,它将该进程以未运行态加入到系统中,操作系统知道这个进程是存在的,并正在等待执行机会。当前正在运行的进程不时地被中断,操作系统中的分派器部分将选择一个新进程运行。前一个进程从运行态转换到未运行态,另外一个进程转换到运行态。图3.5 两状态进程模型3.2.2 进程的创建和终止进程创建通常有4 个事件会导致创建一个进程,如表3.1 所示。在批处理环境中,响应作业提交时会创建进程;在交互环境中,当一个新用户试图登录时会创建进程。不论在哪种情况下,操作系统都负责新进程的创建,操作系统也可能会代表应用程序创建进程。例如,如果用户请求打印一个文件,则操作系统可以创建一个管理打印的进程,进而使请求进程可以继续执行,与完成打印任务的时间无关。表3.1 导致进程创建的原因进程终止表3.2 概括了进程终止的典型原因。任何一个计算机系统都必须为进程提供表示其完成的方法,批处理作业中应该包含一个Halt 指令或用于终止的操作系统显式服务调用来终止。在前一种情况下,Halt 指令将产生一个中断,警告操作系统一个进程已经完成。对交互式应用程序,用户的行为将指出何时进程完成,例如,在分时系统中,当用户退出系统或关闭自己的终端时,该用户的进程将被终止。在个人计算机或工作站中,用户可以结束一个应用程序(如字处理或电子表格)。所有这些行为最终导致发送给操作系统的一个服务请求,以终止发出请求的进程。此外,很多错误和故障条件会导致进程终止。表3.2 列出了一些最常见的识别条件。最后,在有些操作系统中,进程可以被创建它的进程终止,或当父进程终止时而终止。表3.2 导致进程终止的原因3.2.3 五状态模型eg1:运行态:该进程正在执行。在本章中,假设计算机只有一个处理器,因此一次最多只有一个进程处于这个状态。就绪态:进程做好了准备,只要有机会就开始执行。阻塞/等待态一1:进程在某些事件发生前不能执行,如I/O 操作完成。新建态:刚刚创建的进程,操作系统还没有把它加入到可执行进程组中。通常是进程控制块已经创建但还没有加载到内存中的新进程。退出态:操作系统从可执行进程组中释放出的进程,或者是因为它自身停止了,或者是因为某种原因被取消。空新建:创建执行一个程序的新进程。这个事件在表3.1 中所列出的原因下都会发生。新建就绪:操作系统准备好再接纳一个进程时,把一个进程从新建态转换到就绪态。大多数系统基于现有的进程数或分配给现有进程的虚拟内存数量设置一些限制,以确保不会因为活跃进程的数量过多而导致系统的性能下降。就绪运行:需要选择一个新进程运行时,操作系统选择一个处于就绪态的进程,这是调度器或分派器的工作。进程的选择问题将在第四部分探讨。运行退出:如果当前正在运行的进程表示自己已经完成或取消,则它将被操作系统终止,见表3.2。运行就绪:这类转换最常见的原因是,正在运行的进程到达了“允许不中断执行”的最大时间段;实际上所有多道程序操作系统都实行了这类时间限定。这类转换还有很多其他原因,例如操作系统给不同的进程分配不同的优先级,但这不是在所有的操作系统中都实现了的。假设,进程A 在一个给定的优先级运行,且具有更高优先级的进程B 正处于阻塞态。如果操作系统知道进程B 等待的事件已经发生了,则将B 转换到就绪态,然后因为优先级的原因中断进程A 的执行,将处理器分派给进程B,我们说操作系统抢占了进程A。最后一种情况是,进程自愿释放对处理器的控制,例如一个周期性地进行记账和维护的后台进程。运行阻塞:如果进程请求它必须等待的某些事件,则进入阻塞态。对操作系统的请求通常以系统服务调用的形式发出,也就是说,正在运行的程序请求调用操作系统中一部分代码所发生的过程。例如,进程可能请求操作系统的一个服务,但操作系统无法立即予以服务,它也可能请求了一个无法立即得到的资源,如文件或虚拟内存中的共享区域;或者也可能需要进行某种初始化的工作,如I/O 操作所遇到的情况,并且只有在该初始化动作完成后才能继续执行。当进程互相通信,一个进程等待另一个进程提供输入时,或者等待来自另一个进程的信息时,都可能被阻塞。阻塞就绪:当所等待的事件发生时,处于阻塞态的进程转换到就绪态。就绪退出:为了清楚起见,状态图中没有表示这种转换。在某些系统中,父进程可以在任何时刻终止一个子进程。如果一个父进程终止,与该父进程相关的所有子进程都将被终止。阻塞退出:前面一项提供了注释。eg2:再回到前面的简单例子,图3.7 显示了每个进程在状态间的转换,图3.8a 给出了可能实现的排队规则,有两个队列:就绪队列和阻塞队列。进入系统的每个进程被放置在就绪队列中,当操作系统选择另一个进程运行时,将从就绪队列中选择。对于没有优先级的方案,这可以是一个简单的先进先出队列。当一个正在运行的进程被移出处理器时,它根据情况或者被终止,或者被放置在就绪或阻塞队列中。最后,当一个事件发生时,所有位于阻塞队列中等待这个事件的进程都被转换到就绪队列中。3.2.4 被挂起的进程另一种解决方案是交换,包括把内存中某个进程的一部分或全部移到磁盘中。当内存中没有处于就绪状态的进程时,操作系统就把被阻塞的进程换出到磁盘中的“挂起队列”(suspendqueue),这是暂时保存从内存中被“驱逐”出的进程队列,或者说是被挂起的进程队列。操作系统在此之后取出挂起队列中的另一个进程,或者接受一个新进程的请求,将其纳入内存运行。“交换”(swapping)是一个I/O 操作,因而也可能使问题更加恶化。但是由于磁盘I/O 一般是系统中最快的I/O(相对于磁带或打印机I/O),所以交换通常会提高性能。因此,我们需要重新考虑设计方式。这里有两个独立的概念:进程是否在等待一个事件(阻塞与否)以及进程是否已经被换出内存(挂起与否)。为适应这种2×2 的组合,需要4 个状态:就绪态:进程在内存中并可以执行。阻塞态:进程在内存中并等待一个事件。阻塞/挂起态:进程在外存中并等待一个事件。就绪/挂起态:进程在外存中,但是只要被载入内存就可以执行。阻塞阻塞/挂起:如果没有就绪进程,则至少一个阻塞进程被换出,为另一个没有阻塞的进程让出空间。如果操作系统确定当前正在运行的进程,或就绪进程为了维护基本的性能要求而需要更多的内存空间,那么,即使有可用的就绪态进程也可能出现这种转换。阻塞/挂起就绪/挂起:如果等待的事件发生了,则处于阻塞/挂起状态的进程可以转换到就绪/挂起状态。注意,这要求操作系统必须能够得到挂起进程的状态信息。就绪/挂起就绪:如果内存中没有就绪态进程,操作系统需要调入一个进程继续执行。此外,当处于就绪/挂起态的进程比处于就绪态的任何进程的优先级都要高时,也可以进行这种转换。这种情况的产生是由于操作系统设计者规定调入高优先级的进程比减少交换量更重要。就绪就绪/挂起:通常,操作系统更倾向于挂起阻塞态进程而不是就绪态进程,因为就绪态进程可以立即执行,而阻塞态进程占用了内存空间但不能执行。但如果释放内存以得到足够空间的唯一方法是挂起一个就绪态进程,那么这种转换也是必需的。并且,如果操作系统确信高优先级的阻塞态进程很快将会就绪,那么它可能选择挂起一个低优先级的就绪态进程,而不是一个高优先级的阻塞态进程。新建就绪/挂起以及新建就绪:当创建一个新进程时,该进程或者加入到就绪队列,或者加入到就绪/挂起队列中。不论哪种情况,操作系统都必须建立一些表以管理进程,并为进程分配地址空间。操作系统可能更倾向于在初期执行这些辅助工作,这使得它可以维护大量的未阻塞的进程。通过这个策略,内存中经常会没有足够的空间分配给新进程,因此使用了(新建就绪/挂起)转换。另一方面,我们可以证明创建进程的适时(just-in-time)原理,即尽可能推迟创建进程以减少操作系统的开销,并在系统被阻塞态进程阻塞时允许操作系统执行进程创建任务。阻塞/挂起阻塞:这种转换在设计中比较少见,如果一个进程没有准备好执行,并且不在内存中,调入它又有什么意义?但是考虑到下面的情况:一个进程终止,释放了一些内存空间,阻塞/挂起队列中有一个进程比就绪/挂起队列中的任何进程的优先级都要高,并且操作系统有理由相信阻塞进程的事件很快就会发生,这时,把阻塞进程而不是就绪进程调入内存是合理的。运行就绪/挂起:通常当分配给一个运行进程的时间期满时,它将转换到就绪态。但是,如果由于位于阻塞/挂起队列的具有较高优先级的进程变得不再被阻塞,操作系统抢占这个进程,也可以直接把这个运行进程转换到就绪/挂起队形中,并释放一些内存空间。各种状态退出:在典型情况下,一个进程在运行时终止,或者是因为它已经完成,或者是因为出现了一些错误条件。但是,在某些操作系统中,一个进程可以被创建它的进程终止,或当父进程终止时终止。如果允许这样,则进程在任何状态时都可以转换到退出态。挂起进程的特点:1)进程不能立即执行。2)进程可能是或不是正在等待一个事件。如果是,阻塞条件不依赖于挂起条件,阻塞事件的发生不会使进程立即被执行。3)为阻止进程执行,可以通过代理把这个进程置于挂起状态,代理可以是进程自己,也可以是父进程或操作系统。4)除非代理显式地命令系统进行状态转换,否则进程无法从这个状态中转移。表3.3 导致进程挂起的原因:3.3 进程描述这个概念如图3.10 所示。在多道程序设计环境中,在虚拟内存中有许多已经创建了的进程(P1,Pn),每个进程在执行期间,需要访问某些系统资源,包括处理器、I/O 设备和内存。在图中,进程P1 正在运行,该进程至少有一部分在内存中,并且还控制着两个I/O 设备;进程P2 也在内存中,但由于正在等待分配给P1 的I/O 设备而被阻塞;进程Pn 已经被换出,因此是挂起的。3.3.1 操作系统的控制结构内存表内存表用于跟踪内(实)存和外存(虚拟内存)。内存的某些部分为操作系统而保留,剩余部分是进程可以使用的,保存在外存中的进程使用某种类型的虚拟内存或简单的交换机制。内存表必须包括以下信息:分配给进程的内存。分配给进程的外存。内存块或虚拟内存块的任何保护属性,如哪些进程可以访问某些共享内存区域。管理虚拟内存所需要的任何信息。I/O 表操作系统使用I/O 表管理计算机系统中的I/O 设备和通道。在任何给定的时刻,一个I/O 设备或者是可用的,或者已分配给某个特定的进程,如果正在进行I/O 操作,则操作系统需要知道I/O 操作的状态和作为I/O 传送的源和目标的内存单元。在第11 章将详细讲述I/O 管理。文件表操作系统还维护着文件表,这些表提供关于文件是否存在、文件在外存中的位置、当前状态和其他属性的信息。大部分信息(不是全部信息)可能由文件管理系统维护和使用。在这种情况下,操作系统只有一点或者没有关于文件的信息;在其他操作系统中,很多文件管理的细节由操作系统自己管理。进程表最后,操作系统为了管理进程必须维护进程表,本节的剩余部分将着重讲述所需的进程表。在此之前需要先明确两点:首先,尽管图3.11 给出了4 种不同的表,但是这些表必须以某种方式链接起来或交叉引用。内存、I/O 和文件是代表进程而被管理的,因此进程表中必须有对这些资源的直接或间接引用。文件表中的文件可以通过I/O 设备访问,有时它们也位于内存中或虚拟内存中。这些表自身必须可以被操作系统访问到,因此它们受制于内存管理。其次,操作系统最初如何知道创建表?显然,操作系统必须有基本环境的一些信息,如有多少内存空间、I/O 设备是什么以及它们的标识符是什么等。这是一个配置问题,也就是说,当操作系统初始化后,它必须可以使用定义基本环境的某些配置数据,这些数据必须在操作系统之外,通过人的帮助或一些自动配置软件而产生。3.3.2 进程控制结构(1)操作系统在管理和控制进程时,首先必须知道进程的位置,再者,它必须知道在管理时所必需的进程属性(如进程ID、进程状态)。进程位置进程最少必须包括一个或一组被执行的程序一个进程至少包括足够的内存空间,以保存该进程的程序和数据程序的执行通常涉及用于跟踪过程调用和过程间参数传递的栈进程属性与每个进程相关联的还有操作系统用于控制进程的许多属性程序、数据、栈和属性的集合称做进程映像进程映像的位置依赖于使用的内存管理方案进程标识 Each process is assigned a unique numeric identifier每个进程被分配一个唯一的数字标识符 otherwise there must be a mapping that allows the OS to locate the appropriate tables based on the process identifier否则,必须有一个映射,使得操作系统可以根据进程标识符定位相应的表 Memory tables may be organized to provide a map of main memory with anindication of which process is assigned to each region内存表可以组织起来以便提供一个关于内存的映射,指明每个区域分配给了哪个进程 similar references will appear in I/O and file tablesI/O 表和文件表中也会有类似的引用 When processes communicate with one another, the process identifier informs the OS of the destination of a particular communication当进程相互之间进行通信时,进程标识符可用于通知操作系统某一特定通信的目标 Many of the tables controlled by the OS may use process identifiers to cross-reference process tables操作系统控制的许多其他表可以使用进程标识符交叉引用进程表 When processes are allowed to create other processes ,identifiers indicate the parent and descendents of each process当允许进程创建其他进程时,标识符可用于指明每个进程的父进程和后代进程。程序状态信息处理器状态信息包括处理器寄存器的内容。当一个进程正在运行时,其信息当然在寄存器中。当进程被中断时,所有的寄存器信息必须保存起来,使得进程恢复执行时这些信息都可以被恢复。所涉及的寄存器的种类和数目取决于处理器的设计。所有的处理器设计都包括一个或一组通常称做程序状态字(ProgramStatus Word, PSW)的寄存器,它包含状态信息。PSW 通常包含条件码和其他状态信息3.3.2 进程控制结构(2)Role of the Process Control Block进程控制块的作用The most important data structure in an OS进程控制块是操作系统中最重要的数据结构 contains all of the information about a process that is needed by the OS 每个进程控制块包含操作系统所需要的关于进程的所有信息 blocks are read and/or modified by virtually every module in the OS块被读取和/或被操作系统中的几乎每个模块修改 defines the state of the OS资源控制块集合定义操作系统的状态zhengw Operating System Principles 2014/2/25 77 Difficulty is not access, but protection困难的不是访问而是保护 a bug in a single routine could damage process control blocks ,which could destroy the systems ability to manage the affected processes一个例程(如中断处理程序)中有错误,可能会破坏进程控制块,进而破坏了系统对受影响进程的管理能力。 a design change in the structure or semantics of the process control block could affect a number of modules in the OS进程控制块的结构或语义的设计变化可能会影响到操作系统中的许多模块。3.4程控制3.4.1执行模式用户模式 系统模式非特权模式 特权态可称做系统态、控制态或内核态 用户程序通常在该模式下运行 内核态指的是操作系统的内核 特权模式3.4.2进程的创建3.4.3进程切换 中断 陷阱 与当前正在运行的进程无关的某种类型的外部事件相关 1. 与当前正在运行的进程所产生的错误或异常条件相关 时钟中断 I/O 中断 内存失效 2.操作系统确定错误或异常条件是否是致命的 时间片,即进程在被中断前可以执行的最大时间段 当前正在运行的进程被转换到退出态,并发生进程切换 操作系统的动作取决于错误的种类和操作系统的设计模式切换没有未处理的中断 处理器继续取指令周期,即取当前进程中的下一条指令存在一个未处理的中断 1)把程序计数器置成中断处理程序的开始地址。 2)从用户态切换到内核态,使得中断处理代码可以包含有特权的指令。3.5.2在用户进程中执行在较小的机器(PC 机、工作站)的操作系统中,常见的方法实际上是在用户进程的上下文中执行几乎所有操作系统软件。其观点是操作系统从根本上说是用户调用的一组例程,在用户进程环境中执行,用于实现各种功能,如图3.15b 所示。在任何时刻,操作系统管理着n 个进程映像,每个映像不仅包括图3.13 中列出的区域,而且还包括内核程序的程序、数据和栈区域。3.7.1 进程状态UNIX 系统V 使用了一种简单但是功能强大的进程机制,且对用户可见。UNIX 采用图3.15b 中的模型,其中大部分操作系统在用户进程环境中执行。UNIX 使用两类进程,即系统进程和用户进程。系统进程在内核态下运行,执行操作系统代码以实现管理功能和内部处理,如内存空间的分配和进程交换;用户进程在用户态下运行以执行用户程序和实用程序,在内核态下运行以执行属于内核的指令。当产生异常(错误)或发生中断或用户进程发出系统调用时,用户进程可进入内核态。表3.10 UNIX 进程映像表3.11 UNIX 进程表项表3.12 UNIX 的U 区3.7.3 进程控制1)为新进程在进程表中分配一个空项。2)为子进程赋一个唯一的进程标识符。3)做一个父进程上下文的逻辑副本,不包括共享内存区。4)增加父进程拥有的所有文件的计数器,以表示有一个另外的进程现在也拥有这些文件。5)把子进程置为就绪态。6)向父进程返回子进程的进程号;对子进程返回零。为当内核完成这些功能后可以继续下面三种操作之一,它们可以认为是分派器例程的一个部分:在父进程中继续执行。控制返回用户态下父进程进行fork 调用处。处理器控制权交给子进程。子进程开始执行代码,执行点与父进程相同,也就是说在fork调用的返回处。控制转交给另一个进程。父进程和子进程都置于就绪状态。