第3章进程管理 在计算机操作系统中,进程是资源分配的基本单位,同时进程也可作为独立运行的基本单 位,用户可以从进程观点来研究操作系统。显然,进程这一概念在操作系统中极为重要。本章 讨论进程的基本概念、进程控制、进程互斥与同步、进程通信及相关题解。 3.1内容辅导 3.1.1进程的基本概念 1.程序的顺序执行 个程序通常由若干个程序段所组成,它们必须按照某种先后次序来执行,仅当前一个操 作执行完后才能执行后继操作,这类计算过程就是程序的顺序执行过程。程序顺序执行时有如 下特征 (1)顺序性:处理机的操作严格按照程序所规定的顺序执行,即每一操作必须在下一操作 开始之前结束 (2)封闭性:程序运行时独占系统的各种资源,故这些资源的状态(除初始状态外)只有本 程序才能改变。程序一旦开始运行,其执行结果不受外界因素影响 (3)可再现性:只要程序执行时的初始条件和执行环境相同,当程序重复执行时,都将获得 相同的结果。 2.程序的并发执行 所谓程序的并发执行是指若干个程序〈或程序段〉同时在系统中运行,这些程序(或程序 段)的执行在时间上是重叠的,一个程序(或程序段)的执行尚未结束,另一个程序,(或程序段) 的执行已经开始。 程序的并发执行虽然提高了系统吞吐量,但也产生了下述一些与顺序执行不同的新特征 (1)制约性:程序在并发执行时,由于它们共享资源或为完成同一项任务而相互合作 致使并发程序之间形成了相互制约关系。制约关系有两种: ①直接制约关系=进程一进程 ②间接制约关系z进程一资源一进程 (2)失去封闭性:程序在并发执行时,多个程序共享系统中的各种资源,因而这些资源的 状态将由多个程序来改变,致使程序的运行失去封闭性 (3)不可再现性:程序并发执行时,由于失去了封闭性,也将导致失去其可再现性 3.进程的定义及特征 进程是操作系统中最基本、最重要的概念,但直至目前还没有一个统一的定义,这里给出 几种比较容易理解又能反映进程实质的定义 (1)进程是程序的一次执行。 (2)进程是可以和别的计算并发执行的计算。 (3)进程是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的一个独立单 位 (4)进程是一个具有一定功能的程序关于某个数据集合的一次运行活动。 以上进程的定义,尽管各有侧重,但它们在本质上是相同的 进程具有以下几个基本特征 (1)动态性:进程是程序的一次执行过程,因而是动态的。动态特性还表现在它因创建 而产生,由调度而执行,因得不到资源而暂停执行,最后由撤消而消亡 (2)并发性:引入进程的目的就是为了使程序能与其他程序并发执行,以提高资源利用率 (3)独立性:进程是一个能独立运行的基本单位,也是系统进行资源分配和调度的独立单
第 3 章 进程管理 在计算机操作系统中,进程是资源分配的基本单位,同时进程也可作为独立运行的基本单 位,用户可以从进程观点来研究操作系统。显然,进程这一概念在操作系统中极为重要。本章 讨论进程的基本概念、进程控制、进程互斥与同步、进程通信及相关题解。 3.1 内容辅导 3.1.1 进程的基本概念 1.程序的顺序执行 一个程序通常由若干个程序段所组成,它们必须按照某种先后次序来执行,仅当前一个操 作执行完后才能执行后继操作,这类计算过程就是程序的顺序执行过程。程序顺序执行时有如 下特征: (1)顺序性:处理机的操作严格按照程序所规定的顺序执行,即每一操作必须在下一操作 开始之前结束。 (2)封闭性: 程序运行时独占系统的各种资源,故这些资源的状态(除初始状态外)只有本 程序才能改变。程序一旦开始运行,其执行结果不受外界因素影响。 (3)可再现性:只要程序执行时的初始条件和执行环境相同,当程序重复执行时,都将获得 相同的结果。 2.程序的并发执行 所谓程序的并发执行是指若干个程序〈或程序段〉同时在系统中运行,这些程序(或程序 段)的执行在时间上是重叠的,一个程序(或程序段)的执行尚未结束,另一个程序,(或程序段) 的执行已经开始。 程序的并发执行虽然提高了系统吞吐量,但也产生了下述一些与顺序执行不同的新特征: (1) 制约性:程序在并发执行时,由于它们共享资源或为完成同一项任务而相互合作, 致使并发程序之间形成了相互制约关系。制约关系有两种: ①直接制约关系=进程一进程。 ②间接制约关系 z 进程一资源一进程。 (2)失去封闭性:程序在并发执行时,多个程序共享系统中的各种资源,因而这些资源的 状态将由多个程序来改变,致使程序的运行失去封闭性。 (3)不可再现性:程序并发执行时,由于失去了封闭性,也将导致失去其可再现性。 3. 进程的定义及特征 进程是操作系统中最基本、最重要的概念,但直至目前还没有一个统一的定义,这里给出 几种比较容易理解又能反映进程实质的定义: (1)进程是程序的一次执行。 (2)进程是可以和别的计算并发执行的计算。 (3)进程是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的一个独立单 位。 (4)进程是一个具有一定功能的程序关于某个数据集合的一次运行活动。 以上进程的定义,尽管各有侧重,但它们在本质上是相同的。 进程具有以下几个基本特征: (1)动态性:进程是程序的一次执行过程,因而是动态的。动态特性还表现在它因创建 而产生,由调度而执行,因得不到资源而暂停执行,最后由撤消而消亡。 (2)并发性:引入进程的目的就是为了使程序能与其他程序并发执行,以提高资源利用率。 (3)独立性:进程是一个能独立运行的基本单位,也是系统进行资源分配和调度的独立单
(4)异步性:进程以各自独立的、不可预知的速度向前推进 (5)结构特征:为了描述和记录进程的运动变化过程,并使之能正确运行,应为每个进程配 置一个进程控制块。这样,从结构上看,每个进程都由程序段、数据段和进程控制块三部分组 4.进程状态及其变化 进程执行时的间断性,决定了进程可能具有多种状态。事实上,运行中的进程至少具有以 下三种基本状态。 (1)就绪状态进程已获得除处理机以外的所有资源,一旦分到了处理机就可以立即执 行,这时进程所处的状态为就绪状态 2)执行状态执行状态又称运行状态。当一个进程获得必要的资源.并占有处理机,即 在处理机上运行,此时进程所处的状态为执行状态。 (3)阻塞状态阻塞状态又称等待状态。正在执行的进程,由于发生某事件而暂时无法执 行下去(如等待输入/输出完成〉,此时进程所处的状态为阻塞状态 进程并非固定处于某一状态,它随着自身的推进和外界条件的变化而发生变化 5.进程的表示 进程通常有三部分组成:程序数据集合和进程控制块。 (1)程序:描述了进程所要完成的功能 (2)数据集合:程序执行时所需要的数据和工作区。 (3)进程控制块:为了描述和控制进程的运行,系统为每个进程定义了一个数据结构一进 程控制块(PCB)。所谓系统创建一个进程,就是由系统为某个程序(包含数据段)设置一个PCB, 用于对该进程进行控制和管理。进程执行完成时,由系统收回其PCB,该进程便消亡了。系统 将根据PCB而感知进程的存在,故PCB是进程存在的惟一标志 一般来说,根据操作系统的要求不同,进程PCB所包含的内容多少会有些不同,但通常包 括下面所列的内容:进程标识符,进程当前状态,进程队列指针,程序开始地址,迸程优先 级,CP现场保护区,通信信息,家族联系,占有资源清单等。 在一个系统中,通常存在许多进程,为了对它们进行有效管理,应该用适当方法将PCB组 织起来。目前常用链表或表格将PCB组织起来。 3.1.2进程控制 进程控制的职责是对系统中的全部进程实施有效的管理。其功能包括进程的创建、进 程的撤消、进程的阻塞与唤醒等。这些功能一般是由操作系统的内核来实现的。 操作系统的内核是基于硬件的第一次软件扩充。在现代操作系统设计中,往往把一些与硬 件紧密相关的模块或运行频率较高的模块以及为许多模块所公用的一些基本操作安排在靠近 硬件的软件层次中,并使它们常驻内存,以提高操作系统的运行效率 进程控制功能是通过执行各种原语来实现的。所谓原语是由若干条机器指令构成的,用于 完成某一特定功能的一段程序。原语在执行期间不可分割,所以原语操作具有原子性 为了防止操作系统及关键数据如PCB等受到用户程序有意或无意的破坏,通常将处理机 的执行状态分成两种:核心态与用户态 ●核心态又称管态:是操作系统管理程序执行时机器所处的状态。它具有较高的特权, 能执行一切指令,访问所有的寄存器和存储区 用户态又称目态:是用户程序执行时机器所处的状态。这是具有较低特权的执行状态 它只能执行规定的指令,访问指定的寄存器和存储区 1.进程创建
位。 (4)异步性:进程以各自独立的、不可预知的速度向前推进。 (5)结构特征:为了描述和记录进程的运动变化过程,并使之能正确运行,应为每个进程配 置一个进程控制块。这样,从结构上看,每个进程都由程序段、数据段和进程控制块三部分组 成。 4. 进程状态及其变化 进程执行时的间断性,决定了进程可能具有多种状态。事实上,运行中的进程至少具有以 下三种基本状态。 (1)就绪状态 进程已获得除处理机以外的所有资源,一旦分到了处理机就可以立即执 行,这时进程所处的状态为就绪状态。 (2)执行状态 执行状态又称运行状态。当一个进程获得必要的资源.并占有处理机,即 在处理机上运行,此时进程所处的状态为执行状态。 (3)阻塞状态 阻塞状态又称等待状态。正在执行的进程,由于发生某事件而暂时无法执 行下去(如等待输入/输出完成〉,此时进程所处的状态为阻塞状态。 进程并非固定处于某一状态,它随着自身的推进和外界条件的变化而发生变化。 5.进程的表示 进程通常有三部分组成:程序数据集合和进程控制块。 (1)程序 :描述了进程所要完成的功能。 (2)数据集合:程序执行时所需要的数据和工作区。 (3)进程控制块:为了描述和控制进程的运行,系统为每个进程定义了一个数据结构—进 程控制块(PCB)。所谓系统创建一个进程,就是由系统为某个程序(包含数据段)设置一个 PCB, 用于对该进程进行控制和管理。进程执行完成时,由系统收回其 PCB,该进程便消亡了。系统 将根据 PCB 而感知进程的存在,故 PCB 是进程存在的惟一标志。 一般来说,根据操作系统的要求不同,进程 PCB 所包含的内容多少会有些不同,但通常包 括下面所列的内容:进程标识符,进程当前状态,进程队列指针,程序开始地址,迸程优先 级,CPU 现场保护区,通信信息,家族联系,占有资源清单等。 在一个系统中,通常存在许多进程,为了对它们进行有效管理,应该用适当方法将 PCB 组 织起来。目前常用链表或表格将 PCB 组织起来。 3.1.2 进程控制 进程控制的职责是对系统中的全部进程实施有效的管理。其功能包括进程的创建、进 程的撤消、进程的阻塞与唤醒等。这些功能一般是由操作系统的内核来实现的。 操作系统的内核是基于硬件的第一次软件扩充。在现代操作系统设计中,往往把一些与硬 件紧密相关的模块或运行频率较高的模块以及为许多模块所公用的一些基本操作安排在靠近 硬件的软件层次中,并使它们常驻内存,以提高操作系统的运行效率。 进程控制功能是通过执行各种原语来实现的。所谓原语是由若干条机器指令构成的,用于 完成某一特定功能的一段程序。原语在执行期间不可分割,所以原语操作具有原子性。 为了防止操作系统及关键数据如 PCB 等受到用户程序有意或无意的破坏,通常将处理机 的执行状态分成两种:核心态与用户态。 ⚫ 核心态又称管态:是操作系统管理程序执行时机器所处的状态。它具有较高的特权, 能执行一切指令,访问所有的寄存器和存储区。 ⚫ 用户态又称目态:是用户程序执行时机器所处的状态。这是具有较低特权的执行状态, 它只能执行规定的指令,访问指定的寄存器和存储区。 1.进程创建
进程创建是由创建原语实现的。当需要进程时,就可以建立一个新进程。被创建的进程称 为子进程,建立进程的进程称为父进程。 创建原语的主要功能是为被创建进程形成一个PCB,并填入相应的初始值。其主要操作过 程是先向系统申请一个空闲PCB结构,再根据父进程所提供的参数将子进程的PB初始化,并 将此PCB插入就绪队列,最后返回一个进程的标识号。 2.进程撤消 进程撤消是由撤消原语实现的。一个进程在完成其任务后,应予以撤消,以便及时释放它 所占用的各类资源。撤消原语可采用两种撤消策略:一种策略是只撤消一个具有指定标识符的 进程,另一种策略是撤消指定进程及其子孙进程 撤消原语的主要功能是收回被撤消进程占用的所有资源,并撤消它的PCB。其主要操作过 程是先从PCB集合中找到被撤消进程的PCB,若被撤消进程正处于运行状态,则应立即停止该 进程的执行,设置重新调度标志,以便进程撤消后将处理机分给其他进程。对后一种撤消策略, 若被撤消进程有子孙进程,还应将该进程的子孙进程予以撤消。对于被撤消进程所占有的资源, 或者归还给父进程,或者归还给系统。最后撤消它的PCB。 3.进程阻塞与唤醒 阻塞原语的作用是将进程由执行状态转为阻塞状态,而唤醒原语的作用则是将进程由阻 塞状态变为就绪状态。 当一个进程期待的某一事件尚未出现时,该进程调用阻塞原语将自己阻塞起来。阻塞原语 在阻塞一个进程时,由于该进程正处于执行状态,故应先中断处理机和保存该进程的CPU现场 然后将该进程插入到等待该事件的等待队列中。再从就绪队列中选择一个新的进程投入运行。 对处于阻塞状态的进程,当该进程期待的事件出现时,由发现者进程调用唤醒原语将阻塞 的进程唤醒,使其进入就绪状态。 应当注意,一个进程由执行状态转变为阻塞状态,是这个进程自己调用阻塞原语去完成的 而进程由阻塞状态到就绪状态,是另一个发现者进程调用唤醒原语实现的,一般这个发现者进 程与被唤醒进程是合作的并发进程。 3.1.3进程同步 多道程序系统中进程是并发执行的,这些进程之间存在着不同的相互制约关系,为了协调 进程之间的相互制约关系,就需要实现进程的同步。互斥是同步的一种特殊情况。 1.进程同步的基本概念 (1)临界资源和临界区:系统中的多个进程可以共享系统中的各种资源,然而其中许多资 源一次只能为一个进程所使用。我们把一次仅允许一个进程使用的资源称为临界资源。许多 物理设备都属于临界资源,如打印机、绘图机等。除物理设备外,还有许多变量、数据等都可 由若干进程所共享,它们也属于临界资源。在每个进程中,访问临界资源的那段程序称为临界 (2)同步:一个进程到达了某些点后,除非另一进程己完成了某些操作,否则就不得不停下 来等待这些操作的结束,这就是进程间的同步 (3)互斥:两个或两个以上进程,由于不能同时使用同一临界资源,只能一个进程使用完了 另一个进程才能使用,这种现象称为进程互斥 为禁止两个进程同时进入临界区,可采用软件解决方法或一个同步机构来协调它们。但是, 不论是软件算法或同步机构都应遵循下述准则:①空闲让进;②忙则等待:③有限等待;④ 让权等待。 2.信号量和P、V操作 个信号量的建立必须经过说明,即应该准确说明s的意义和初值。每个信号量都有相应 的一个队列,在建立信号量时,队列为空。P、Ⅴ操作为两条原语,信号量的值仅能由P、V操作
进程创建是由创建原语实现的。当需要进程时,就可以建立一个新进程。被创建的进程称 为子进程,建立进程的进程称为父进程。 创建原语的主要功能是为被创建进程形成一个 PCB,并填入相应的初始值。其主要操作过 程是先向系统申请一个空闲 PCB 结构,再根据父进程所提供的参数将子进程的 PCB 初始化,并 将此 PCB 插入就绪队列,最后返回一个进程的标识号。 2. 进程撤消 进程撤消是由撤消原语实现的。一个进程在完成其任务后,应予以撤消,以便及时释放它 所占用的各类资源。撤消原语可采用两种撤消策略:一种策略是只撤消一个具有指定标识符的 进程,另一种策略是撤消指定进程及其子孙进程。 撤消原语的主要功能是收回被撤消进程占用的所有资源,并撤消它的 PCB。其主要操作过 程是先从 PCB 集合中找到被撤消进程的 PCB,若被撤消进程正处于运行状态,则应立即停止该 进程的执行,设置重新调度标志,以便进程撤消后将处理机分给其他进程。对后一种撤消策略, 若被撤消进程有子孙进程,还应将该进程的子孙进程予以撤消。对于被撤消进程所占有的资源, 或者归还给父进程,或者归还给系统。最后撤消它的 PCB。 3.进程阻塞与唤醒 阻塞原语的作用是将进程由执行状态转为阻塞状态,而唤醒原语的作用则是将进程由阻 塞状态变为就绪状态。 当一个进程期待的某一事件尚未出现时,该进程调用阻塞原语将自己阻塞起来。阻塞原语 在阻塞一个进程时,由于该进程正处于执行状态,故应先中断处理机和保存该进程的 CPU 现场, 然后将该进程插入到等待该事件的等待队列中。再从就绪队列中选择一个新的进程投入运行。 对处于阻塞状态的进程,当该进程期待的事件出现时,由发现者进程调用唤醒原语将阻塞 的进程唤醒,使其进入就绪状态。 应当注意,一个进程由执行状态转变为阻塞状态,是这个进程自己调用阻塞原语去完成的, 而进程由阻塞状态到就绪状态,是另一个发现者进程调用唤醒原语实现的,一般这个发现者进 程与被唤醒进程是合作的并发进程。 3.1.3 进程同步 多道程序系统中进程是并发执行的,这些进程之间存在着不同的相互制约关系,为了协调 进程之间的相互制约关系,就需要实现进程的同步。互斥是同步的一种特殊情况。 1.进程同步的基本概念 (1)临界资源和临界区:系统中的多个进程可以共享系统中的各种资源,然而其中许多资 源一次只能为一个进程所使用。我们把一次仅允许一个进程使用的资源称为临界资源。许多 物理设备都属于临界资源,如打印机、绘图机等。除物理设备外,还有许多变量、数据等都可 由若干进程所共享,它们也属于临界资源。在每个进程中,访问临界资源的那段程序称为临界 区。 (2)同步:一个进程到达了某些点后,除非另一进程已完成了某些操作,否则就不得不停下 来等待这些操作的结束,这就是进程间的同步。 (3)互斥:两个或两个以上进程,由于不能同时使用同一临界资源,只能一个进程使用完了, 另一个进程才能使用,这种现象称为进程互斥。 为禁止两个进程同时进入临界区,可采用软件解决方法或一个同步机构来协调它们。但是, 不论是软件算法或同步机构都应遵循下述准则: ①空闲让进;②忙则等待;③有限等待;④ 让权等待。 2.信号量和 P、V 操作 一个信号量的建立必须经过说明,即应该准确说明 s 的意义和初值。每个信号量都有相应 的一个队列,在建立信号量时,队列为空。P、V 操作为两条原语,信号量的值仅能由 P、V 操作
原语来改变。 P、V操作的定义如下: P(s):s=s-1 若S>=0,则进程继续运行。 若S<0,则该进程被阻塞,并将它插入该信号量的等待队列中。 操作:S=S+1 若s>0,则进程继续执行。 若S<=0,则从信号量等待队列中移出第一个进程,使其变为就绪状态,然后再返回原 进程继续执行 3.信号量的应用 利用信号量可以解决进程间的同步和互斥问题,实现进程间的互斥和同步模型如下 1)互斥模型 进程Pl 进程P2 P(S) 其中,信号量的初值:S=1;CS1,CS2分别是进程P1和P2的临界区 (2)同步模型 进程P1 进程P2 LI: P(S 其中,信号量的初值:S=0。 (3)用P、V操作描述前趋关系 若干进程为了完成一个共同任务而并发执行。然而,这些并发进程之间根据逻辑上的需 要,有的操作可以没有时间上的先后次序,即不论谁先做,最后的计算结果都是正确的。但有的 操作有一定的先后次序,也就是说它们必须遵循一定的同步规则,只有这样,并发执行的最后 结果才是正确的。我们可以用本章前面介绍的前趋图来描述进程在执行次序上的先后关系 (4)生产者·消费者问题 生产者-消费者问题是最著名的进程同步问题。它描述了一组生产者向一组消费者提供产 品,它们共享一个有界缓冲区,生产者向其中投放产品,消费者从中取得产品。生产者消费者问 题是许多相互合作进程的一种抽象。例如,在输入时,输入进程是生产者,计算进程是消费者 在输出时,计算进程是生产者,打印进程是消费者。因此,该问题具有很大实用价值。 我们把一个长度为n的有界缓冲区(n)0)与一群生产者进程P1、P2、…、P和一群消费 者进程CI、C2、…、CK联系起来。假定这些生产者和消费者是互相等效的。只要缓冲区未满, 生产者就可以把产品送入缓冲区,类似地,只要缓冲区未空,消费者便可以从缓冲区中取走物 品并消耗它。生产者和消费者的同步关系将禁止生产者向满的缓冲区输送产品,也禁止消费者 从空的缓冲区中提取物品 为解决这一类生产者-消费者问题,应该设置两个同步信号量,一个说明空缓冲单元的数 用 empty表示,其初值为有界缓冲区的大小n,另一个说明满缓冲单元的数目,用fu11表示, 其初值为0。在本例中有P1、P2、…、Pm个生产者和C1、C2、…、CK个消费者,它们在执行 生产活动和消费活动中要对有界缓冲区进行操作。由于有界缓冲区是一个临界资源,必须互斥 使用,所以,另外还需设置一个互斥信号量 mutex,其初值为1。生产者.消费者问题的同步描述 如下 int full /*申满缓冲单元的数目* int empty=n /*空缓冲单元的数目*/
原语来改变。 P、V 操作的定义如下: P(s): s=s-1 若 S>=0,则进程继续运行。 若 S<0,则该进程被阻塞,并将它插入该信号量的等待队列中。 V 操作:S =S+1 若 s >0,则进程继续执行。 若 S<=0,则从信号量等待队列中移出第一个进程,使其变为就绪状态,然后再返回原 进程继续执行。 3.信号量的应用 利用信号量可以解决进程间的同步和互斥问题,实现进程间的互斥和同步模型如下: (1)互斥模型 进程 P1 进程 P2 P(S) P(S) CS1 CS2 V(s) v(s) 其中,信号量的初值:S=1;CS1,CS2 分别是进程 P1 和 P2 的临界区。 (2)同步模型 进程 P1 进程 P2 L1:P(S) L2: V(S) 其中,信号量的初值:S=0。 (3)用 P、V 操作描述前趋关系 若干进程为了完成一个共同任务而并发执行。然而,这些并发进程之间根据逻辑上的需 要,有的操作可以没有时间上的先后次序,即不论谁先做,最后的计算结果都是正确的。但有的 操作有一定的先后次序,也就是说它们必须遵循一定的同步规则,只有这样,并发执行的最后 结果才是正确的。我们可以用本章前面介绍的前趋图来描述进程在执行次序上的先后关系。 (4)生产者·消费者问题 生产者-消费者问题是最著名的进程同步问题。它描述了一组生产者向一组消费者提供产 品,它们共享一个有界缓冲区,生产者向其中投放产品,消费者从中取得产品。生产者消费者问 题是许多相互合作进程的一种抽象。例如,在输入时,输入进程是生产者,计算进程是消费者; 在输出时,计算进程是生产者,打印进程是消费者。因此,该问题具有很大实用价值。 我们把一个长度为 n 的有界缓冲区(n〉O)与一群生产者进程 P1、P2、…、Pm 和一群消费 者进程 CI、C2、…、CK 联系起来。假定这些生产者和消费者是互相等效的。只要缓冲区未满, 生产者就可以把产品送入缓冲区,类似地,只要缓冲区未空,消费者便可以从缓冲区中取走物 品并消耗它。生产者和消费者的同步关系将禁止生产者向满的缓冲区输送产品,也禁止消费者 从空的缓冲区中提取物品。 为解决这一类生产者-消费者问题,应该设置两个同步信号量,一个说明空缓冲单元的数 目,用 empty 表示,其初值为有界缓冲区的大小 n,另一个说明满缓冲单元的数目,用 full 表示, 其初值为 0。在本例中有 P1、P2、…、Pm 个生产者和 C1、C2、…、CK 个消费者,它们在执行 生产活动和消费活动中要对有界缓冲区进行操作。由于有界缓冲区是一个临界资源,必须互斥 使用,所以,另外还需设置一个互斥信号量 mutex,其初值为 1。生产者.消费者问题的同步描述 如下: int full=0; /*申满缓冲单元的数目*/ int empty=n; /*空缓冲单元的数目*/
int mutex=l /*对有界缓冲区进行操作的互斥信号量* mal regin ducer i() /*=1,2,…,m:j=1,2,…,k*/ consumer j() producer() /*=1,2 while(生产未完成) 生产一个产品 p(mutex); 送一个产品到有界缓冲区; V(fu11); consumers() /*j=1,2,…,k*/ while(还要继续消费) 从有界缓冲区中取产品 V(mutex 消费一个产品 (5)读者与写者问题 在计算机系统中,有些文件是可共享的,当若干个并发进程都要访问某个共享文件时,应 区分是读还是写(修改)文件。显然可允许多个进程同时读文件但不允许在进程读文件时让另 一进程去修改文件,或者有进程在修改文件时让另一进程去读,否则会造成读出的文件内容不 正确。尤其是绝对不允许多个进程同时修改同一文件。这样一类问题称为"读者一写者"问题 为了实现读者与写者的同步和互斥,我们设置一个信号量S,用于读者与写者之间或写者 与写者之间的互斥,初值为"1"。用一个变量rc表示当前正在读的读者个数,当进程可以去读 或读结束后都要改变re的值,因此rc又成为若干读进程的共享变量,它们必须互斥地修改 rc。故必须定义另一个用于互斥的信号量Sr,初值也是"1"。读者一写者问题可描述如下 var S, Sr: semaphore: =1, 1 rc: Interger rc Parbegin
int mutex=1; /*对有界缓冲区进行操作的互斥信号量*/ main( ) { Parbegin producer i( ); /*i=1,2,…,m:j=1,2,…,k*/ consumer j( ); parend } produceri( ) /*i=1,2,…,m*/ { while (生产未完成) { 生产一个产品; p(empty); p(mutex); 送一个产品到有界缓冲区; V(mutex); V(full); } } consumerj( ) /*j=1,2,…,k*/ { while (还要继续消费) p(full); p(mutex); 从有界缓冲区中取产品; V〈mutex〉; v(empty); 消费一个产品; } } (5)读者与写者问题 在计算机系统中,有些文件是可共享的,当若干个并发进程都要访问某个共享文件时,应 区分是读还是写(修改)文件。显然可允许多个进程同时读文件但不允许在进程读文件时让另 一进程去修改文件,或者有进程在修改文件时让另一进程去读,否则会造成读出的文件内容不 正确。尤其是绝对不允许多个进程同时修改同一文件。这样一类问题称为"读者一写者"问题。 为了实现读者与写者的同步和互斥,我们设置一个信号量 S,用于读者与写者之间或写者 与写者之间的互斥,初值为"1"。用一个变量 rc 表示当前正在读的读者个数,当进程可以去读 或读结束后都要改变 rc 的值,因此 rc 又成为若干读进程的共享变量,它们必须互斥地修改 rc。故必须定义另一个用于互斥的信号量 Sr,初值也是"1"。读者一写者问题可描述如下: var S,Sr:semaphorep:=1,1; rc:interger; rc:=0; Parbegin