操作系统精髓与设计原理(原书第6版) 第三章 进程描述和控制 学习笔记(1)

                                    第三章 进程描述和控制

 


操作系统需要满足的需求大都涉及到进程。例如:

操作系统必须交替执行多个进程,在合理的响应时间范围内使处理器的利用率最大。

操作系统必须按照特定的策略给进程分配资源,同时避免死锁。

操作系统可以支持进程间的通信和用户创建进程,它们对构造应用程序很有帮助。


3.1 什么是进程


1 引入进程的背景

  1. 一个计算机平台包括一 组硬件资源,比如处理器处理器,内存,I/O模块,定时器和磁盘驱动器等。
  2. 计算机程序是为了执行某些任务而开发的。
  3. 直接根据给定的硬件平台写应用程序效率是低下的,主要原因如下:

            a)针对相同的平台可以开发出很多应用程序,所以开发出这些应用程序访问计算机资源的通用例程是很有意义的。

            b)处理器本身只能对多道程序设计提供有限的支持。需要用软件去管理处理器和其他资源同时被多个程序共享。

            c)如果多个程序在同一时间都是活跃的,那么需要保护每个程序的数据、I/O使用和其他资源不被其他程序占用。

    4.  开发操作系统是为了给应用程序提供一个方便 、安全和一致的接口。 操作系统是计算机硬件和应用程序之间的一层软件,对应用程序和工具提供了支持。

    5. 可以把操作系统想像为资源的同意抽象表示,可以被应用程序请求和访问。资源包括内存,网络接口和文件等。一旦操作系统为应用程序创建了这些资源的抽象表示,就必须管理他们的使用。

2 操作系统的目标:

     ●资源对多个应用程序是可用的。

     ●物理处理器在多个应用程序件切换以保证所有程序都在执行中。

     ●处理器和I/O设备都能得到充分的利用。

3 进程的两个基本元素:程序代码和数据集

4 进程控制块由操作系统创建和管理,含有进程相关的许多重要信息(包括标识符、状态、优先级、程序计数器、内存指针、上下文数据、I/O状态信息、记账信息)。通过这些信息就可以中断一个进程的执行,并且在后边恢复执行进程时就好像没有中断过一样。进程控制块如下图所示:

      标识符:和该进程相关的唯一标识符,用来区别其他进程。

      内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享内存块的指针。

     上下文数据:进程执行时处理器的寄存器中的数据。

      I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表等。

     记账信息:可能包括处理器时间总和、使用的时钟数总和,时间限制、记账号等。

 


3.2 进程状态


1 在每个实例中由分配器执行的指令顺序是相同的,因为是分配器的同一个功能在调用。

2 两状态进程模型:

        两状态:运行态或未运行态。当操作系统创建一个新进程的时候。他将以未运行态加入系统,并等待执行机会。若当前正在执行的进程被中断,操作系统的分配器部分会选择一个新的进程运行。此时新创建的进程状态为运行态,之前运行的进程转到未运行态。

 进程模型如下图所示:

   

        结构中有一个队列,队列中每一项都指向某个特定进程的指针,或队列可以由数据块构成的链表组成,每个数据块表示一个进程。

        被中断的进程转移到等待队列中,或者如果进程已经结束或取消,则被销毁(离开系统)。任何一种情况,分派器都会选择一个新进程来执行。

3 当一个新进程添加到那些正在被管理的进程集合中去时,操作系统需要建立用于管理该进程的数据结构,并在内存中给他分配地址空间。

4 通常由4个事件导致创建一个进程,如下表所示:无论下表哪种情况,操作系统都负责进程的创建,操作系统也可能代表应用程序创建进程。

5 进程派生:当操作系统为另一个进程的显示请求创建一个进程时,这个东欧工作称为进程派生。当一个进程派生另一个进程时,一个称为父进程,另一个称为子进程。

6 一个应用程序进程可以产生另一个进程,以接受应用程序产生的数据,并将数据组织成适合以后分析的格式,新进程与应用程序并行的运行,并当得到新的数据时被激活。

7 下表概括了进程结束的典型原因:

8 在有些操作系统中,进程可以被创建它的进程终止,或当父进程终止时而终止。

9 轮转:依次给队列中的每个进程一定的执行时间,然后进程返回队列。(阻塞情况除外)

9 五状态模型:新建,就绪,运行,阻塞,退出。

       新建态:刚刚创建的进程,操作系统还没有把他加入到 可执行进程组中。通常是进程控制块已经创建但还没有加载到内存中的新进程。

       就绪态:进程做好了准备,只要有机会就会开始执行。

       阻塞/等待态:进程在某些事情发生前不能执行,如I/O操作。

       当进程处于新建态时,程序保留在外存中,通常时磁盘中。(基于性能或内存局限性的原因,限制系统中的进程数量)。此时操作系统所需要的关于进程的信息保存在内存中的进程表中,单进程本身还未进入内存,没有为其相关数据分配空间。

        进程退出也分两步。第一步进程自然结束或者出现不可恢复的错误,或者因为被取消执行时,进程被终止,转换到退出态(此时与进程执行的相关表和其他信息临时被操作系统保留下来,这也给辅助程序或支持程序提供了提取所需信息的时间)。第二步是辅助程序或支持程序提取完所需信息之后,操作系统就不再需要保留任何与该进程相关的数据,该进程从系统中删除

五状态模型具体如下:

        新建->就绪:操作系统准备好接纳一个新的进程。

        就绪->运行:调度器/分派器选择一个就绪态的进程开始执行。

        运行->就绪:(1)正在运行的程序达到了“允许不中断执行”的最大时间段。(2)例如进程A正在运行,比他更高优先级的B正在阻塞。如果操作系统知道了B在等待的事情了,则将B转为运行态,因为优先级原因A被中断。(3)进程自愿放弃对处理器的控制,例如一个周期性的记账和维护的后台进程。

        运行->阻塞:如果进程请求它必须等待的某些事情,则进入阻塞态。可能情况有:(1)进程可能请求操作系统的一个服务,但操作系统无法给予服务。(2)它可能请求了一个无法立即得到的资源(例如文件或虚拟内存中的共享区域)。(3)可能需要进行某种初始化工作,并且在该初始化工作完成后才能继续执行(例如I/O操作遇到的情况)。(4)进程互相通信时,一个进程等待另一个进程提供输入时,或者等待来自另一个进程的信息时。

        阻塞->就绪:当等待的事情发生了就转为就绪。

        就绪->退出:父进程终止(在任何时刻都可以)了,则与之相关的所有子进程也被终止了。

10 排队模型

第一种:有两个队列:就绪对列和阻塞队列。

    进入系统的每个进程被放在就绪队列中。

    当一个正在运行的进程移出处理器时,它根据情况或者被终止,或者被放置在就绪或阻塞队列中。

第二种:有一个就绪队列和多个阻塞队列。

    当一个事件发生时,操作系统需要扫描整个阻塞队列,搜索那些等待该事件的进程。

    可以一个事件对应一个阻塞队列,当该事件发生时,相应队列中的所有进程都转换到就绪态,效率提升很多。

 

改进点:如果按照优先级方案分配进程,维护多个就绪队列(每个优先级一个队列)效率更高,操作系统可以很容易的确定哪个就绪进程具有最高的优先级且等待时间最长。

11 处理器比I/O速度快得多,所以内存中可能出现所有得进程都在等待I/O。即使是多道处理程序,大多数时候处理器仍然处于空闲状态。解决该问题的方法有2种:扩充内存、交换。

    扩充内存:扩充内存适应更多的进程。此方法的缺陷:(1)价格问题;(2)程序对内存空间需求的增长速度比内存价格下降的速度快。所以更大的内存往往导致更大的进程而不是更多的进程。

    交换:把内存中某个进程的部分或全部移到磁盘中。当内存种没有处于就绪状态的进程时,操作系统把阻塞的进程换出到磁盘中的“挂起队列”,这是暂时保存从内存中被“驱逐”的进程队列。操作系统在此之后取出挂起队列中的另一个进程,或者接受一个新进程的请求,将其纳入内存运行。

    交换是一个I/O操作。可能会使问题更加恶劣化。但是由于磁盘I/O一般是最快的I/O,所以交换通常会提高性能。

12 引入挂起态的进程状态转换:

就绪态:进程在内存中并可以执行。

阻塞态:进程在内存中并等待一个事件。

阻塞/挂起态:进程在外存中并等待一个事情。

就绪/挂起态:进程在外存中,但只要被载入内存即可执行。

重要的转换:

阻塞->阻塞/挂起: 如果没有就绪进程,则至少一个阻塞进程被换出,为另一个没有阻寒的进程让出空间。就绪进程为了维护基本的性能要求而需要更多的内存空间,即使有可用的就绪态进程也可能出现这这种转换。

阻塞/挂起->就绪/挂起:等待的事件发生了。这要求操作系统能够得到挂起进程的状态信息。

就绪/挂起->就绪:如果内存中没有就绪态进程,操作系统需要调入一个进程继续执行。此外,当处于就绪/挂起态的进程比处于就绪态的任何进程的优先级都要高时,也可以进行这种转换。这种情况的产生是由于操作系统设计者规定调入高优先级的进程比减少交换量更重要。

就绪->就绪/挂起:通常,操作系统更倾向于挂起阻塞态进程而不是就绪态进程,因为就绪态进程可以立即执行,而阻塞态进程占用了内存空间但不能执行。但如果释放内存以得到足够空间的唯一方法是挂起一个就绪态进程,那么这种转换也是必需的。并且,如果操作系统确信高优先级的阻塞态进程很快将会就绪,那么它可能选择挂起一个低优先级的就绪态进程,而不是一个高优先级的阻塞态进程。

还需要考虑的几种其他转换有:

新建->就绪/挂起:

新建->就绪:当创建一个新进程时,该进程或者加入到就绪队列,或者加入到就绪/挂起队列中。不论哪种情况,操作系统都必须建立一些表以管理进程,并为进程分配地址空间。操作系统可能更倾向于在初期执行这些辅助工作,这使得它可以维护大量的未阻塞的进程。通过这个策略,内存中经常会没有足够的空间分配给新进程,因此使用了(新建->就绪/挂起)转换。另一方面,我们可以证明创建进程的适时(just-in-time )原理,即尽可能推迟创建进程以减少操作系统的开销,并在系统被阻塞态进程阻塞时允许操作系统执行进程创建任务。

阻塞/挂起->阻塞:考虑到一个进程终止,释放了一些内存空间,阻塞/桂起队列中有一个进程比就绪/挂起队列中的任何进程的优先级都要高.并且操作系统有理由相信阻塞进程的事件很快就会发生,这时,把阻塞进程而不是就绪进程调人内存是合理的。

运行->就绪/挂起:通常当分配给一个运行进程的时间期满时,它将转换到就绪态, 但是,如果由于位于阻寨/挂起队列的具有较高优先级的进程变得不再被阻塞.操作系统抢占这个进程,也可以直接把这个运行进程转换到就绪/挂起队列中,并释放些内存空间。

各种状态->退出:在典型情况下,一个进程在运行时终止,或者是因为它已经完成,或是因为出现了一些错误条件。 但是,在某些操作系统中,一个进程可以被创建它的进程终止,或当父进程终止时终止。如果允许这样,任何状态的进程都可以转换到退出态。

13 挂起程序的特点:

  1. 进程不能立即执行。
  2. 进程可能是或不是正在等待一个事件。如果是,阻塞条件不依赖于挂起条件,阻塞事件的发生不会使进程立即被执行。
  3. 为阻止进程执行,可以通过代理把这个进程置于挂起状态,代理可以是进程自己,也可以是父进程或操作系统。
  4. 除非代理显示的命令系统进行状态转换,否则进程无法从这个状态中转移。

14 进程挂起的原因:


3.3 进程描述


1 操作系统看作是管理系统资源的实体。正如下图中,在多道程序设计环境中,在虚拟内存中有许多已经创建了的进程(P1, .. Pn。), 每个进程在执行期间,需要访问某些系统资源,包括处理器、IO设备和内存。进程P1正在运行,该进程至少有一部分在内存中,并且还控制着两个I/0设备:进程P2也在内存中,但由于正在等待分配给P1的I/O设备而被阻塞;进程Pn已经被换出,因此是挂起的。

2 操作系统必须构造并维护它所管理的每个实体的信息表。正如下图中:操作系统构造并维护4种不同类型的表:内存、文件、I/O和进程。

内存表:用于跟踪内存和外存。它必须包括以下信息:●分配给进程的内存、●分配给进程的外存、●内存块或者虚拟内存块的任何保护属性、●管理虚拟内存所需要的任何信息。

I/O:管理计算机系统的I/O设备和通道。

文件表:大部分信息(不是全部信息)可能由文件管理系统维护和使用。这些信息包括:文件是否存在、文件在外存中的位置、当前状态和其他属性的信息。

进程表:管理进程。

这四种不同类型的表必须以某种方式链接起来或者交叉起来使用。内存、I/O和文件是代表进程而被管理的,因此进程表中必须有对这些资源的直接或间接引用。文件表中的文件可以通过I/O设备访问,有时候他们也位于内存中或虚拟内存中。这些表自身可以被操作系统访问到,因此他们受制于内存管理。

3 进程映像:程序、数据、栈和属性的集合。进程映像的位置依赖于使用的内存管理方案。

4进程控制块中的信息可以分为3类:●进程标识信息,●处理器状态信息,●进程控制信息。

5 标识符:每个进程都分配了一个唯一的数字标识符。进程标识符可以简单的表示为主进程表中的一个索引,否则必须要有一个映射,使得操作系统可以根据进程标识符定位相应的表。

       当进程相互之间进行通信时,标识符可用于通知操作系统某一特定通信的目标;当允许进程创建其他进程时,标识符可用于指明每个进程的父进程和子进程。

       进程还分配了一个用户标识符,用来标明拥有该进程的用户。

6 处理器状态信息包括处理器寄存器的内容。

       寄存器组包括寄存器、控制和状态寄存器和栈指针。

7 进程控制信息:操作系统控制和协调各种活动进程所需要的额外信息。

8 每个进程映像包括一个进程控制块,用户栈,进程的专用地址空间以及与别的进程共享的任何其他地址空间。

9 Pentium EFLAGS寄存器:

10 关于操作系统保护存在的两个问题:(进程控制块的作用)

●一个例程(如中断处理程序)中有错误,可能会破坏进程控制块,进而破坏了系统对受影响进程的管理能力。

●进程控制块的结构或语义的设计变化可能会影响到操作系统中的许多模块。

这些问题可以通过要求操作系统中的所有例程都通过一个处理例程来专门处理,处理例程的任务仅仅是保护进程控制块,它是读写这些块的唯一的仲裁程序,使用这类进程,需要权衡性能问题和对系统软件剩余部分正确性的信任程度。


(3.4-3.7见下一篇)
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值