第2章进程管理
    2.1进程的概念和特征
    -、进程的概念
    在多道程序环境下,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性及不可再现性的特征。为此引入了进程(Process)的概念,以便
    更好地描述和控制程序的并发执行,实现操作系统的并发性和共享性(最基本的两个特性)。
    为了使参与并发执行的程序(含数据)能独立地运行,必须为之配置一^专门的数据结构,称为进程控制块(Process Control Block, PCB)。系统利
    用PCB来描述进程的基本情况和运行状态,进而控制和管理进程。相应地,由程序段、相关数据段和PCB三部分构成了进程映像(进程实体)。所谓创建进
    程,实质上是创建进程映像中的PCB;而撤销进程,实质上是撤销进程的PCB。值得注意的是,进程映像是静态的,进程则是动态的。
    引入进程实体的概念后,我们可以把传统操作系统中的进程定义为:“进程是进程实体的运行过程,是系统进行资源分配和调度(一个进程被调度是指
    操作系统决定让这个进程上CPU运行)的一个独立单位。”
    这里说的系统资源,指处理机、存储器和其他设备服务于某个进程的“时间”,例如把处理机资源理解为处理机的时间片才是准确的。因为进程是这些
    资源分配和调度的独立单位,即“时间片”分配的独立单位,这就决定了进程一定是一个动态的、过程性的概念。
    二、进程的组成
    进程是一个独立的运行单位,也是操作系统进行资源分配和调度的基本单位。它由以下三部分组成,其中最核心的是进程控制块(PCB)。进程的组成
    更确切的说应该是进程实体(进程映像)的组成。
    1. ★进程控制块
    进程创建时,操作系统为它新建一个PCB,该结构之后常驻内存,任意时刻都可以存取,并在进程结束时删除。PCB是进程实体的一部分,是进程存在
    的唯一标志。
    进程执行时,系统通过其PCB了解进程的现行状态信息,以便对其进行控制和管理;进程结束时,系统收回其PCB,该进程随之消亡。操作系统通过
    PCB表来管理和控制进程。
    当操作系统欲调度某进程运行时,要从该进程的PCB中查出其现行状态及优先级;在调度到某进程后,要根据其PCB中所保存的处理机状态信息,设置
    该进程恢复运行的现场,并根据其PCB中的程序和数据的内存始址,找到其程序和数据;进程在运行过程中,当需要和与之合作的进程实现同步、通信或访
    问文件时,也需要访问PCB;当进程由于某种原因而暂停运行时,又需将其断点的处理机环境保存在PCB中。可见,在进程的整个生命期中,系统总是通过
    PCB对进程进行控制的,亦即系统唯有通过进程的PCB才能感知到该进程的存在。PCB主要包括:
    (1) 进程描述信息
    进程标识符(PID):标志各个进程,每个进程都有一个唯一的标识号,当进程被创建时,操作系统会为该进程分配一个唯一的、不重复的HD。
    用户标识符(UID):进程归属的用户,用户标识符主要为共享和保护服务。
    (2) 进程控制和管理信息
    进程当前状态:描述进程的状态信息(就绪态/阻塞态/运行态……),作为处理机分配调度的依据。
    进程优先级:描述进程抢占处理机的优先级,优先级高的进程可优先获得处理机。
    可用于实现操作系统对进程的控制、调度。
    (3) 资源分配清单
    用于说明有关内存地址空间或虚拟地址空间的状况,所打开文件的列表和所使用的输入/输出设备信息(正在使用哪些文件、正在使用哪些内存区
    域、正在使用哪些I/O设备)。可用于实现操作系统对资源的管理。
    (4) 处理机相关信息
    主要指处理机中各寄存器的值(如PSW、PC等等各种寄存器的值,用于实现进程切换),当进程被切换时,处理机状态信息都必须保存在相应的
    PCB中,以便在该进程重新执行时,能从断点继续执行。
    2. 程序段
    程序段就是能被进程调度程序调度到CPU执行的程序代码段。注意,程序可被多个进程共享,即多个进程可以运行同一个程序。
    3. 数据段
    一个进程的数据段,可以是进程对应的程序加工处理的原始数据,也可以是程序执行时产生的中间或最终结果。
    Mpcb是给操作系统用的。程序段、数据段是给进程自己用的。
    三、进程的特征
    进程是由多道程序的并发执行而引出的,它和程序是两个截然不同的概念,程序是静态的,进程是动态的。进程的基本特征是对比单个程序的顺序执行
    提出的,也是对进程管理提出的基本要求。
    1. 动态性。进程是程序的一次执行,它有着创建、活动、暂停、终止等过程,具有一定的生命周期,是动态地产生、变化和消亡的。动态性是进程最基本
    的特征。
    2. 并发性。指多个进程实体同时存于内存中,能在一段时间内同时运行。并发性是进程的重要特征,同时也是操作系统的重要特征。弓I入进程的目的就是
    使程序能与其他进程的程序并发执行,以提高资源利用率。
    3. 独立性。指进程实体是一个能独立运行、独立获得资源和独立接受调度的基本单位。凡未建立PCB的程序,都不能作为一个独立的单位参与运行。
    4. 异步性。由于进程的相互制约,使得进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。异步性会导致执行结果的不可再现性,
    为此在操作系统中必须配置相应的进程同步机制。
    5. 结构性。每个进程都配置一个PCB对其进行描述。从结构上看,进程实体是由程序段、数据段和进程控制块三部分组成的。
    四、进程的组织
    在一个系统中,通常存在着许多进程的PCB,有的处于就绪态,有的处于阻塞态,而且阻塞的原因各不相同。为了方便进程的调度和管理,需要将各进
    程的PCB用适当的方法组织起来。目前,常用的组织方式有链接方式和索引方式两种。
    链接方式将同一状态的PCB链接成一个队列,不同状态对应不同的队列,也可把处于阻塞态的进程的PCB,根据其阻塞原因的不同,排成多个阻塞队
    列,操作系统持有指向各个队列的指针。
    进程的组织一一链接方式
    索引方式将同一状态的进程组织在一个索引表中,索弓I表的表项指向相应的PCB,不同状态对应不同的索引表,如就绪索引表和阻塞索引表等,操作系
    统持有指向各个队列的指针。
    注:进程的组成讨论的是一个进程内部由哪些部分构成的问题,而进程的组织讨论的是多个进程之间的组织方式问题。
    五、进程的状态与转换
    进程在其生命周期内,由于系统中各进程之间的相互制约关系及系统的运行环境的变化,使得进程的状态也在不断地发生变化(一个进程会经历若干不
    同状态)。通常进程有以下5种状态,前3种是进程的基本状态。
    1. ★运行态。进程正在处理机上运行。在单处理机环境下,每个时刻最多只有一个进程处于运行态;多核CPU情况下,可能有多个进程处于运行态。
    2. ★就绪态。进程获得了除处理机外的一切所需资源,一旦得到处理机,便可立即运行。系统中处于就绪状态的进程可能有多个,通常将它们排成一个队
    列,称为就绪队列。
    3. ★阻塞态,又称等待态。进程正在等待某一事件而暂停运行,如等待某资源为可用(不包括处理机)或等待输入/输出完成。即使处理机空闲,该进程
    也不能运行。(如:等待操作系统分配打印机、等待读磁盘操作的结果。CPU是计算机中最昂贵的部件,为了提高CPU的利用率,需要先将其他进程需
    要的资源分配到位,才能得到CPU的服务)
    4. 创建态,又称新建态。进程正在被创建,尚未转到就绪态。创建进程通常需要多个步骤:首先申请一个空白的PCB,并向PCB中填写一些控制和管理进
    程的信息;然后由系统为该进程分配运行时所必需的资源;最后把该进程转入就绪态。
    5. 结束态,又称终止态。进程正从系统中消失,可能是进程正常结束或其他原因中断退出运行。进程需要结束运行时,系统首先必须将该进程置为结束
    态,然后进一步处理资源释放和回收等工作。

    •区别就绪态和等待态。就绪态是指进程仅缺少处理机,只要获得处理机资源就立即运行;而等待态是指进程需要其他资源(除了处理机)或等待某一事
    件。之所以把处理机和其他资源划分开,是因为在分时系统的时间片轮转机制中,每个进程分到的时间片是若干毫秒。也就是说,进程得到处理机的时
    间很短且非常频繁,进程在运行过程中实际上是频繁地转换到就绪态的;而其他资源(如外设)的使用和分配或某一事件的发生(如I◦操作的完成)对
    应的时间相对来说很长,进程转换到等待态的次数也相对较少。这样来看,就绪态和等待态是进程生命周期中两个完全不同的状态,显然需要加以区
    分。
    .进程PCB中,会有一个变量state来表示进程的当前状态。如:1表示创建态、2表示就绪态、3表示运行态…为了对同一个状态下的各个进程进行统一的
    管理,操作系统会将各个进程的PCB组织起来。
    5种进程状态的转换如图:
    • ★就绪态—运行态:处于就绪态的进程被调度后,获得处理机资源(分派处理机时间片),于是进程由就绪态转换为运行态。
    • ★运行态-就绪态:处于运行态的进程在时间片用完后,不得不让出处理机,从而进程由运行态转换为就绪态。此外,在可剥夺的操作系统中,当有更
    高优先级的进程就绪时,调度程序将正在执行的进程转换为就绪态,让更高优先级的进程执行。
    • ★运行态-阻塞态:进程请求某一资源(如外设)的使用和分配或等待某一事件的发生(如I/O操作的完成)时,它就从运行态转换为阻塞态。进程以系
    统调用的形式请求操作系统提供服务,这是一种特殊的、由运行用户态程序调用操作系统内核过程的形式。
    • ★阻塞态-就绪态:进程等待的事件到来时,如I/O操作结束或中断结束时,中断处理程序必须把相应进程的状态由阻塞态转换为就绪态。

    • 一个进程从运行态变成阻塞态是主动的行为,而从阻塞态变成就绪态是被动的行为,需要其他相关进程的协助。
    六、进程的控制
    进程控制的主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能。在操作系统中,一般把进
    程控制用的程序段称为原语,原语的特点是执行期间不允许中断,它是一个不可分割的基本单位。
    思考:为何进程控制(状态转换)的过程要“一气呵成” ?
    •如果不能“一气呵成”,就有可能导致操作系统中的某些关键数据结构信息不统一的情况,这会影响操作系统进行别的管理工作。
    1.进程的创建
    允许一个进程创建另一个进程。此时创建者称为父进程,被创建的进程称为子进程。子进程可以继承父进程所拥有的资源。当子进程被撤销时,应将其
    从父进程那里获得的资源归还给父进程。此外,在撤销父进程时,必须同时撤销其所有的子进程。
    创建原语(创建态-就绪态,操作系统创建一个新进程的过程):
    (1) 申请空白PCB。为新进程分配一^唯一的进程标识号,并申请一个空白的PCB (PCB是有限的)。若PCB申请失败,则创建失败。
    (2) 为賺程分配资源。为新进程的程序和数据及用户栈分配必要的内存空间(在PCB中体现)。若资源不足(如内存空间),则并不是创建失败,而是
    处于阻塞态,等待内存资源。
    (3) 初始化PCB。主要包括初始化标志信息、初始化处理机状态信息和初始化处理机控制信息,以及设置进程的优先级等。
    (4)将PCB插入就绪队列。若进程就绪队列能够接纳新进程,则将新进程插入就绪队列,等待被调度运行。
    引起进程创建的事件主要有:
    (1) 终端用户登录系统。分时系统中,用户登录成功,系统会建立为其建立一个新的进程。
    (2) 作业调度。多道批处理系统中,有新的作业放入内存时,会为其建立一个新的进程。
    (3) 系统提供服务。用户向操作系统提出某些请求时,会新建一个进程处理该请求。
    (4) 用户程序的应用请求。由用户进程主动请求创建一个子进程。
    2. 进程的终止
    撤销原语(就绪态/阻塞态/运行态->终止态4无,操作系统终止进程的过程):
    (1) 根据被终止进程的标识符,检索PCB,从中读出该进程的状态。
    (2) 若被终止进程处于执行状态,立即终止该进程的执行,将处理机资源分配给其他进程。
    (3) 若该进程还有子孙进程,则应将其所有子孙进程终止。
    (4) 将该进程所拥有的全部资源归还给其父进程或操作系统。
    (5) 将该PCB从所在队列(链表)中删除。
    引起进程终止的事件主要有:
    (1) 正常结束。进程自己请求终止(exit系统调用,表示进程的任务已完成并准备退出运行)。
    (2) 异常结束。表示进程在运行时,发生了某种异常事件,使程序无法继续运行,如存储区越界、保护错、非法指令、特权指令错、运行超时、算术运算
    错、I/O故障等。
    (3) 外界干预。指进程应外界的请求而终止运行,如操作员(Ctrl+Alt+delete,用户选择杀掉进程)或操作系统干预、父进程请求和父进程终止。
    3. 进程的阻塞和唤醒(阻塞原语唤醒原语必须成对使用)
    阻塞原语(运行态-阻塞态):
    (1) 找到将要被阻塞进程的标识号对应的PCB。
    (2) 若该进程为运行态,保护进程运行现场,将PCB状态信息设置为阻塞态,暂时停止进程运行。
    (3) 把该PCB插入相应事件的等待队列,将处理机资源调度给其他就绪进程。
    引起进程阻塞的事件主要有:
    正在执行的进程,需要等待系统分配某种资源、需要等待相互合作的其他进程完成工作,由于期待的某些事件未发生,如请求系统资源失败、等待某种
    操作的完成、新数据尚未到达或无新工作可做等,由系统自动执行阻塞原语,使自己由运行态变为阻塞态。进程的阻塞是进程自身的一种主动行为,也因此
    只有处于运行态的进程(获得CPU),才可能将其转为阻塞态。
    唤醒原语(阻塞态〜就绪态):
    (1) 在该事件的等待队列中找到相应进程的PCB。
    (2) 将PCB从等待队列中移除,并置其状态为就绪态。
    (3) 把该PCB插入就绪队列,等待调度程序调度。
    引起进程喚醒的事件:
    当被阻塞进程所期待的事件发生时,如它所启动的I◦操作已完成或其所期待的数据已到达,由有关进程(比如,释放该I◦设备的进程,或提供数据的
    进程)调用唤醒原语,将等待该事件的进程唤醒。
    阻塞原语和唤醒原语是一对作用刚好相反的原语,必须成对使用(因何事阻塞,就应由何事唤醒)。阻塞原语是由被阻塞进程自我调用实现的,而唤醒
    原语则是由一个与被唤醒进程合作或被其他相关的进程调用实现的。
    4. 进程切换
    进程切换是指处理机从一个进程的运行转到另一个进程上运行,在这个过程中,进程的运行环境产生了实质性的变化。
    切换原语:
    (1) 保存处理机上下文,包括程序计数器和其他寄存器。
    (2) 更新PCB信息。
    (3) 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
    (4) 选择另一个进程执行,并更新其PCBO
    (5) 更新内存管理的数据结构。
    (6) 恢复处理机上下文。
    引起进程切换的事件:
    (1) 当前进程时间片到。
    (2) 有更高优先级的到达。
    (3) 当前进程主动阻塞。
    (4) 当前进程终止。
    •对于通常的进程而言,其创建、撤销及要求由系统设备完成的I/O操作,都是利用系统调用而进入内核,再由内核中的相应处理程序予以完成的。进程
    切换同样是在内核的支持下实现的,因此可以说,任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的。
    •进程切换与处理机模式切换是不同的。模式切换时,处理机逻辑上可能还在同一进程中运行。若进程因中断或异常进入核心态运行,执行完后又回到用
    户态刚被中断的程序运行,则操作系统只需恢复进程进入内核时所保存的CPU现场,而无须改变当前进程的环境信息。但若要切换进程,当前运行进程
    改变了,则当前进程的环境信息也需要改变。
    • “调度”和“切换”的区别。调度是指决定资源分配给哪个进程的行为,是一种决策行为;切换是指实际分配的行为,是执行行为。1来说,先有资
    源的调度,然后才有进程的切换。
    进程控制会导致进程状态的转换。无论哪个进程控制原语,要做的无非三类事情:
    1.更新PCB中的信息(改进程状态state或保存/恢复运行环境)。
    2022/6/13 21:11
    a. 所有的进程控制原语一定都会修改进程状态标志。
    b. 剥夺当前运行进程的CPU使用权必然需要保存其运行环境。
    c. 某进程开始运行前必然要恢复期运行环境。
    2. 将PCB插入合适的队列。
    3. 分配/回收资源。
    七、进程的通信
    进程通信是指进程之间的信息交换。进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。为了保证安全,-
    个进程不能直接访问另一个进程的地址空间。但是进程之间的信息交换又是必须实现的。为了保证进程间的安全通信,操作系统提供了一些方法。PV操作
    是低级通信方式,高级通信方式是指以较高的效率传输大量数据的通信方式。高级通信方法主要有以下三类:
    1.共享存储
    在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行写/读操作实现进程之间的信息交换。
    两个进程对共享空间的访问必须是互斥的(互斥访问通过操作系统提供的工具实现),操作系统只负责提供共享空间和同步互斥工具(如P、V操
    作),而数据交换则由用户自己安排读/写指令完成。共享存储又分为两种:低级方式的共享是基于数据结构的共享;高级方式的共享则是基于存储区的共
    享。
    置D用户进程空间一般都是独立的,进程运行期间一般不能访问其他进程的空间,要想让两个用户进程共享空间,必须通过特殊的系统调用实现,而进程内
    的线程是自然共享进程空间的。
    2.消息传递
    在消息传递系统中,进程间的数据交换是以格式化的消息(Message)为单位的。若通信的进程之间不存在可直接访问的共享空间,则必须利用操作系
    统提供的消息传递方法实现进程通信。进程通过系统提供的发送消息和接收消息两个原语进行数据交换。
    (1) 直接通信方式。发送进程直接把消息发送给接收进程,并将它挂在接收进程的消息缓冲队列上,接收进程从消息缓冲队列中取得消息。
    (2) 间接通信方式。发送进程把消息发送到某个中间实体(信箱),因此也称“信箱通信方式”,接收进程从中间实体取得消息。该通信方式广泛应用于
    计算机网络中,相应的通信系统称为电子邮件系统。
    管道通信是消息传递的一种特殊方式。所谓“管道”,是指用于连接一个读进程和一个写进程以实现它们之间的通信的一个共享文件,又名pipe文
    件。向管道供享文件)提供输入的发送进程(即写进程),以字符流形式将大量的数缓冲区据送入(写)管道;而接收管道输出的接收进程脚读进程测从管道中
    接收(读)数据。为了协调双方的通信,管道机制必须提供以下三方面的协调能力:互斥、同步和管道通信确定对方的存在。从本质上说,管道也是一种文
    件,但它又和一般的文件有所不同,管道可以克服使用文件进行通信的两个问题,具体表现如下:
    (1) 限制管道的大小。实际上,管道是一个固定大小的缓冲区。使用单个固定缓冲区也会带来问题,数据以字符流的形式写入管道,当管道写满时,写进
    程的write()系统调用将被阻塞,等待读进程将数据取走。当读进程将数据全部取走后,管道变空,此时读进程的read()系统调用将被阻塞。
    (2) 读进程也可能工作得比写进程快。当所有当前进程数据已被读取时,管道变空。当这种情况发生时,一个随后的read()调用将默认地被阻塞,等待某
    些数据被写入,这解决了read()调用返回文件结束的问题。
    go从管道读数据是一次性操作,数据一旦被读取,它就从管道中被抛弃,释放空间以便写更多的数据,这就意味着读进程最多只能有一个,否则可能会有
    读错数据的情况。管道只能采用半双工通信,即某一时刻只能单向传输。要实现父子进程双方互动通信,需要定义两个管道。管道可以理解为共享存储的优
    化和发展,因为在共享存储中,若某进程要访问共享存储空间,则必须没有其他进程在该共享存储空间中进行写操作,否则访问行为就会被阻塞。而管道通
    信中,存储空间进化成了缓冲区,缓冲区只允许一边写入、另一边读出,因此只要缓冲区中有数据,进程就能从缓冲区中读出,而不必担心会因为其他进程
    在其中进行写操作而遭到阻塞,因为写进程会先把缓冲区写满,然后才让读进程读,当缓冲区中还有数据时,写进程不会往缓冲区写数据。