计算机操作系统-进程的描述和控制

前趋图和程序执行

在早期未配置OS的系统和单道批处理系统中,程序的执行方式是顺序执行,即在内存中仅装入一道用户程序,由它独占系统中的所有资源,只有在一个用户程序执行完成后,才允许装入另一个程序并执行。可见,这种方式浪费资源**、系统运行效率低

为了更好的描述程序的顺序和并发执行情况,我们先介绍用户描述程序执行先后顺序的前趋图。

1. 前趋图

前趋图,是指一个有向无环图,可记为DAG,它用于描述进程之间执行的先后顺序。图中的每个结点可用来表示一个进程或程序段,乃至一条语句,结点间的有向边则表示两个结点之间存在的偏序或前趋关系。
在这里插入图片描述
注意,前趋图是不允许有环的,例如图b中,S2执行的前提是S3执行,而S3执行的前提是S2执行,这种关系是不可能实现的。

2. 程序顺序执行

通常,一个应用程序由若干个程序段组成,每一个程序段完成特定的功能,它们在执行时,都需要按照某种先后次序顺序执行,仅当前一程序段执行完后,才运行后一程序段。

下面是程序顺序执行的前趋图:

3. 程序顺序执行时的特征

  • 顺序性:处理机严格地按照程序所规定的顺序执行;
  • 封闭性:程序运行时独占全机资源,资源的状态(除初始状态外)只有本程序才能改变它,程序一旦开始执行,其执行结果不受外界因素影响
  • 可再现性:指只要程序执行时的环境和初始条件相同,当程序重复执行时,都可获得相同的结果。即不论是从头到尾不停顿执行,还是“走走停停”的执行,最终结果都一致。

4. 程序的并发执行

我们通过一个常见的例子来说明程序的顺序执行和并发执行。在上图图中的输入程序、计算程序和打印程序三者之间,存在着Ii→Ci→Pi这样的前趋关系,以至对一个作业的输入、计算和打印三个程序段必须顺序执行。但若是对一批作业进行处理时,每道作业的输入、计算和打印程序段的执行情况如下所示。

程序并发执行的前趋图:
在这里插入图片描述
由图2-3可以看出,存在前趋关系Ii→Ci,Ii→Ii+1,Ci→Pi,Ci→Ci+1,Pi→Pi+1,而Ii+1和Ci及Pi-1是重叠的,即在Pi-1和Ci以及Ii+1之间不存在前趋关系,可以并发执行。

对于具有下述四条语句的程序段:

S1: a :=x+2 S2: b :=y+4   S3: c :=a+b S4: d :=c+b

可画出下图所示的前趋关系。可以看出:S3必须在a和b被赋值后方能执行;S4必须在S3之后执行;但S1和S2则可以并发执行,因为它们彼此互不依赖
在这里插入图片描述

5. 程序并发执行时的特征

  • 间断性:程序再并发执行时,因为它们共享系统资源,顾再对相同资源的需求时这些并发执行的程序形成了相互制约的关系。
  • 失去封闭性:对于并发执行的程序来说,系统中的资源被他们共享,顾对应资源也会因为其中某一程序进行改变,导致另外一程序必然会受其影响,顾屎去了封闭性。
  • 不可再现性:程序并发执行时失去了封闭性,顾必然也会失去可再现性。例如两个循环程序A和B,其中有一个共同变量C,A中循环一次对C加一,B中循环一次对C减一,这样最终的结果具有多种情况,顾失去了可再现性。

进程的描述

1. 进程的定义

在多道程序环境下,程序的执行属于并发执行,此时它们将失去其封闭性,并具有间断性,以及其运行结果不可再现性的特征。由此,决定了通常的程序是不能参与并发执行的,否则,程序的运行也就失去了意义。为了能使程序并发执行,并且可以对并发执行的程序加以描述和控制,人们引入了“进程”的概念。

为了使参与并发执行的每个程序(含数据)都能独立地运行,在操作系统中必须为之配置一个专门的数据结构,称为进程控制块(Process Control Block, PCB)。系统利用PCB来描述进程的基本情况和活动过程,进而控制和管理进程

  • 所谓创建进程,实质上是创建进程实体中的PCB
  • 撤销进程实质上是撤销进程的PCB

这样,由程序段、数据段和PCB三部分便构成了进程实体
在这里插入图片描述

对于进程的定义,从不同角度上有不同的定义,比较经典的定义有:

  • 进程是程序的一次执行
  • 进程是一个程序及其数据在处理及上顺序执行时所发生的活动
  • 进程是具有独立功能的程序在一个数据集合上运行的过程,他是系统进行资源分配和调度的一个独立单位

引入了进程实体概念后,我们可以这样定义:

  • 进程是进程实体的运行过程,是系统进行资源分配和调度的一个单位。

2. 进程的特征

进程和程序是两个截然不同的概念,除了进程具有程序所没有的PCB结构外,还具有下面一些特征:

  • 动态性:程序是静态的。进程是动态的,它由创建而产生,由调度而执行,由撤销而消亡。可见,进程具有一定的生命性而程序只是一组有序指令的集合,其本身不具有活动的含义,因而使静态的。
  • 并发性:多个进程同存于内存中,且能在一段时间内同时运行
  • 独立性:进程是一个能独立运行、独立获得资源和独立接受调度的基本单位。凡未建立PCB的程序都不能作为一个独立的单位参与运行
  • 异步性:进程是按异步方式运行的,即按各自独立的、不可预知的速度向前推进。

进程的基本状态及转换

1.进程的三种基本状态

由于多个进程在并发执行时共享系统资源,致使它们在运行过程中呈现间断性的运行规律,所以进程在其生命周期内可能具有多种状态。一般而言,每一个进程至少应处于以下三种基本状态之一:

  • 就绪(Ready)状态:指进程已经处于准备好运行的状态。
  • 执行(Running)状态:指进程已经获得CPU,其程序正在执行的状态。
  • 阻塞(Block)状态:指正在执行的程序因某种事件(I/O请求、申请缓冲区失败等)而无法继续执行时的状态。

下图为进程的三种基本状态及其转换
进程的三种基本状态及其转换

下面放两道考研真题便于大家检验和思考:

例:下列选项中,会导致进程从执行态变为就绪态的事件是( )。(2015年考研统考真题)
A. 执行P操作
B. 申请内存失败
C. 启动I/O设备
D. 被高优先级进程抢占

例:下列选项中,可能导致当前进程P阻塞的事件是( )。(2018年考研统考真题)
A. 进程P申请临界资源
B. 进程P从磁盘读数据
C. 系统将CPU分配给高优先权的进程
D. 上述答案都对

请大家仔细阅读进程的三种基本状态的定义进行解题哦!

2.创建状态和终止状态

创建状态进程是由创建而产生。一般要通过多个步骤才能完成:首先申请一个空白PCB,并向PCB中填写用于控制和管理进程的信息;然后为该进程分配运行时所必须的资源;最后,把该进程转入就绪状态并插入就绪队列之中。引入创建状态是为了保证进程的调度必须在创建工程之后,保证了对进程控制块PCB操作下完整性

如果进程所需的资源尚不能得到满足,比如系统尚无足够的内存使进程无法装入其中,此时创建工作尚未完成,进程不能被调度运行,此时进程所处的状态称为创建状态。

终止状态:当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,它将进入终止状态。

进程的终止也要通过两个步骤:首先,是等待操作系统进行善后处理,最后将其PCB清零,并将PCB空间返还系统

进入终止态的进程以后不能再执行,但在OS中依然保留一个记录,供其他进程收集。一旦其他进程完成了对其信息的提取之后,OS将删除该进程,即将其PCB清零,并将该空白PCB返还系统。

在这里插入图片描述

3.挂起操作和进程状态的转换

在许多系统中,为了系统和用户观察和分析进程的需要,还引入了一个对进程重要的操作:挂起操作。该操作用于某个进程时,该进程将会被挂起,如果程序正在进行,它将暂停执行,若处于就绪状态,则此程序将暂时不接受调度。

3.1 引入挂起原语操作后三个进程状态的转换

  • 活动就绪→静止就绪:当进程处于就绪状态时且未被挂起,此时状态为活动就绪状态,表示为Readya;当挂起原语Suspend将该进程挂起后,此时状态为静止就绪状态。表示为Readys
  • 活动阻塞→静止阻塞:当进程处于阻塞状态时且未被挂起,此时状态为活动阻塞状态,表示为Blockeda;当挂起原语Suspend将该进程挂起后,此时状态为静止阻塞状态。表示为Blockeds,当处于该状态的进程所期待的事件出现后,将由Blockeds变为Readys状态
  • 静止就绪→活动就绪:处于Readys状态的进程若用激活原语Active激活后,状态变为Readya状态
  • 静止阻塞→活动阻塞:处于Blockeds状态的进程若用激活原语Active激活后,状态变为Blockeda状态
    在这里插入图片描述

进程管理中的数据结构

1.操作系统中用于管理控制的数据结构

在计算机系统中,对于每个资源和每个进程都设置了一个数据结构,用于表征其实体,我们称之为资源信息表或进程信息表,其中包含了资源或进程的标识、描述、状态等信息以及一批指针。通过这些指针,可以将同类资源或进程的信息表,或者同一进程所占用的资源信息表分类链接成不同的队列,便于操作系统进行查找。

OS管理的这些数据结构一般分为以下四类:内存表设备表文件表和用于进程管理的进程表,通常进程表又被称为进程控制块PCB
在这里插入图片描述

2. 进程控制块PCB的作用

  • 作为独立运行基本单位的标志:当一个程序配置了PCB后,表明它已经是一个能够在多道程序环境下独立运行的基本单位,事实上,PCB已经成为进程存在系统的唯一标志
  • 实现间断性运行:在多道程序环境中,程序总是走走停停的运行,当程序因某事件处于阻塞状态时,它必须保留运行时的CPU现场信息,这些信息存放在PCB中,供该进程再次被调度执行时CPU使用。
  • 提供进程管理所需要的信息:在进程的生命周期中,操作系统总是根据PCB实施对进程的控制和管理。
  • 提供进程调度所需要的信息:只有处于就绪状态的进程才被调度执行,PCB中就储存了进程的状态信息
  • 实现与其它进程的同步与通信:在PCB中具有用于实现进程通信的区域或通信队列指针

3. 进程控制块中的信息

在进程控制块中,主要包括下述四个方面的信息。

3.1进程标识符

进程标识符用于唯一地标识一个进程。一个进程通常有两种标识符:

  • 外部标识符:为了方便用户(进程)对进程的访问
  • 内部标识符:为了系统对进程的访问

3.2处理机状态

处理机状态信息也称为处理机的上下文,主要是由处理机的各种寄存器中的内容组成的。包括:

  1. 通用寄存器
  2. 指令计数器
  3. 程序状态字PSW
  4. 用户栈指针

3.3进程调度信息

在OS进行调度时,必须了解进程的状态及有关进程调度的信息,这些信息包括:

  1. 进程状态;
  2. 进程优先级;
  3. 进程调度所需的其它信息;
  4. 事件:是指进程由执行态转为阻塞态所等待发生的事情。

3.4进程控制信息

指用于进程控制所必须的信息,它包括:

  1. 程序和数据的地址
  2. 进程同步和通信机制
  3. 资源清单
  4. 链接指针

4.进程控制块的组织方式

4.1 线性方式

线性方式,即将系统中所有的PCB都组织在一张线性表中,将该表的首址存放在内存的一个专用区域中。该方式实现简单、开销小,但每次查找时都需要扫描整张表,因此适合进程数目不多的系统。
在这里插入图片描述

4.2 链接方式

链接方式,即把具有相同状态进程的PCB分别通过PCB中的链接字链接成一个队列。这样,可以形成就绪队列、若干个阻塞队列和空白队列等。
在这里插入图片描述

4.3 索引方式

索引方式,即系统根据所有进程状态的不同,建立几张索引表,例如,就绪索引表、阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中。在每个索引表的表目中,记录具有相应状态的某个PCB在PCB表中的地址。

在这里插入图片描述

进程同步(重要)

在OS中引入进程后,一方面可以使系统中的多道程序并发执行,这不仅能有效地改善资源利用率,还可显著地提高系统的吞吐量。

但另一方面却使系统变得更加复杂。如果不能采取有效的措施,对多个进程的运行进行妥善的管理,必然会因为这些进程对系统资源的无序争夺给系统造成混乱。致使每次处理的结果存在着不确定性,即显现出其不可再现性

1.进程同步的概念

进程同步:对多个相关进程在执行次序上进行协调、使并发执行的诸进程之间能按照一定的规则共享系统资源,并能很好地相互合作,从而使程序的执行具有可再现性。

两种形式的制约关系:

  • 间接相互制约关系:多个程序并发执行时,共享系统资源,如I/O设备、CPU等等,使这些程序在执行过程中相互制约的关系叫间接相互制约关系
  • 直接相互制约关系:为了完成某个任务而建立了两个或多个进程,这些进程之间相互合作,这些进程之间的制约关系就叫直接相互制约关系,并且他们之间的制约来源于相互合作。

1.1 临界资源:

上一章操作系统概念中我们曾经介绍过,许多硬件资源如打印机、 磁带机等,都属于临界资源,诸进程间应采取互斥方式,实现对这种资源的共享。不论是硬件临界资源还是软件临界资源,多个进程都必须互斥地对它进行访问。

1.2 临界区:

人们把在每个进程中访问临界资源的那段代码称为临界区(critical section)。可把一个访问临界资源的循环进程描述为:

while(TURE){
	进入区     //就是程序对资源的申请,如若批准,则“上锁”,其他进程此时禁止访问
	临界区	  //执行操作
	退出区     // “解锁”
	剩余区     //其他处理          
	} 

1.3 同步机制应遵循的规则

所有同步机制都应遵循下述四条准则:

  • 空闲让进
  • 忙则等待
  • 有限等待
  • 让权等待:若进程不能进入自己临界区,则立即释放处理机,以免程序进入“忙等”状态

2. 硬件同步机制

虽然可以利用软件方法解决诸进程互斥进入临界区的问题,但有一定难度,并且存在很大的局限性,因而现在已很少采用。

相应地,目前许多计算机已提供了一些特殊的硬件指令,允许对一个字中的内容进行检测和修正,或者是对两个字的内容进行交换等。可利用这些特殊的指令来解决临界区问题。

2.1 硬件同步的基本思想

在对临界区进行管理时,可以将标志看做一把锁,“锁开”进入,“锁关”等待,初始时锁是打开的。

每个要进入临界区的进程必须先对锁进行测试,当锁未开时,则必须等待,直至锁被打开。反之,当锁是打开的时候,则应立即把其锁上,以阻止其它进程进入临界区。

显然,为防止多个进程同时测试到锁为打开的情况,测试和关锁操作必须是连续的,不允许分开进行。

2.2 关中断

关中断是实现互斥的最简单的方法之一。

在进入锁测试之前关闭中断,直到完成锁测试并上锁之后才能打开中断。这样,进程在临界区执行期间,计算机系统不响应中断,从而不会引发调度,也就不会发生进程或线程切换。

由此,保证了对锁的测试和关锁操作的连续性和完整性,有效地保证了互斥。

2.3 利用Test-and-Set指令实现互斥

借助硬件指令——“测试并建立”指令TS以实现互斥的方法。在许多计算机中都提供了这种指令。TS指令描述如下:

Boolean TS(Boolean *lock){
	Boolean old;
	old=*lock;
	*lock=TRUE;
	return old;
	}

利用TS指令实现互斥的循环进程结构可描述如下:

do{
	...
	while TS(&lock);  //  进入区 ,循环测试
	critical  section;
	lock=FALSE;  
	remainder section;
}while(TRUE);

用TS管理临界区时,会初始化一个布尔变量lock,初值为false,表示该资源空闲,进入临界区时,TS指令测试lock,如果为false,则将lock设为True,并且允许访问临界区。

2.3 利用Swap指令实现进程互斥

该指令称为对换指令,在Intel 80x86中又称为XCHG指令,用于交换两个字的内容。

Void swap(Boolean *a, Boolean *b){
	Boolean temp;
	 temp=*a;
	 *a=*b;
	 *b=temp;
}

利用Swap指令实现进程互斥的循环进程可描述如下:

do{
	key=TRUE;
	do{
	swap(&lock, &key);
	}while(key!=FALSE);
	临界区操作;
	lock=FALSE;
	...
}while(TRUE);

实现方式就是利用一个局部变量key,更新交换lock的值。

2.4 硬件方法的优缺点

优点:适用于任意数目的进程;简单、容易验证其正确性
确点:会让程序处于“忙等”,未实现“让权等待”,浪费处理机时间;可能产生“饥饿”现象;可能死锁。

3. 信号量机制(重要!)

3.1 整形信号量

最初由Dijkstra把整型信号量定义为一个用于表示资源数目的整型量S,除初始化外,仅能通过两个标准的原子操作**Wait(S)Signal(S)**来访问。这两个操作被分别称为P、V操作。

wait(s){
	while(s<0);  //若资源数<0,则一直等待,不满足让权等待!!!
	s--;     //若资源>0,则减一
}
signal(s){
	s++; //使用完资源后释放。
}

**Wait(S)Signal(S)**是两个原子操作,要么全部执行要么不执行,它们执行时是不可被中断的。

3.2 记录行信号量

在整型信号量机制中的Wait操作,只要信号量S≤0,就会不断地测试。因此,该机制并未遵循“让权等待”的准则,而是使进程处于“忙等”的状态。
记录型信号量机制则是一种不存在“忙等”现象的进程同步机制。但在采取了“让权等待”的策略后,又会出现多个进程等待访问同一临界资源的情况。为此,在信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表指针list,用于链接上述的所有等待进程。

typedef struct{
	int value;
	struct process_control_block *list; //阻塞队列
}
wait(semaphore s){
	s->value--;
	if (s->value < 0)
		block(s->list);    //若分配资源后value小于0,则代表原资源<=0,顾阻塞该进程。加入阻塞队列
}
signal(semaphore s){
	s->value++;
	if (s->value <= 0)
		wakeup(s->list);    //若释放资源后value<=0,则代表还有申请该进程的资源正在阻塞队列中,顾唤醒链表头部进程变为就绪状态。
}

3.3 AND型信号量

AND型信号量的基本思想:将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,待进程使用完后再一起释放。只要尚有一个资源未能分配给进程,其他所有可能为之分配的资源也不分配给它。

即:要么把它请求的资源全部分配到进程,要么一个也不分配。

3.4 信号量集

在前面所述的记录型信号量机制中,Wait(S)或Signal(S)操作仅能对信号量施以加1减1操作,意味着每次只能对某类临界资源进行一个单位的申请或释放。当一次需要N个单位时,便要进行N次Wait(S)操作,这显然是低效的,甚至会增加死锁的概率。此外,在有些情况下,为确保系统的安全性,当所申请的资源数量低于某一下限值时,还必须进行管制,不予以分配。因此,当进程申请某类临界资源时,在每次分配之前,都必须测试资源的数量,判断是否大于可分配的下限值,决定是否予以分配。

4. 信号量的应用

4.1 利用信号量实现进程互斥

为使多个进程能互斥地访问某临界资源,只需为该资源设置一互斥信号量mutex,并设其初始值为1,然后将各进程访问该资源的临界区CS置于**Wait(mutex)Signal(mutex)**操作之间即可。

Semaphore mutex=1;
PA(){
	while(1){
		Wait(mutex);
		临界区;
		Signal(mutex);
		剩余区;
		}
	}
PB(){
	while(1){
		Wait(mutex);
		临界区;
		Signal(mutex);
		剩余区;
		}
	}

注意!Wait(mutex)和Signal(mutex)必须成对的出现,缺少Wait(mutex)容易造成系统的紊乱,不能保证互斥访问,缺少Signal(mutex)会使资源永远不被释放

4.2 利用信号量实现前趋关系

设有两个并发执行的进程P1和P2。P1中有语句S1;P2中有语句S2。我们希望在S1执行后再执行S2。为实现这种前趋关系,只需使进程P1和P2共享一个公用信号量S,并赋予其初值为0,将Signal(S)操作放在语句S1后面,而在S2语句前面插入Wait(S)操作,即在进程P1中,用S1;Signal(S);在进程P2中,用Wait(S);S2;例如想要保证S1 -> S2,S1 -> S3的关系,代码如下:

p1{
	S1;
	signal(a);
	signal(b);
}

p2{
	wait(a);
	S2;
}

p3{	
	wait(b);
	S3;
}

给出一道例题帮助大家消化:
在这里插入图片描述

经典进程同步问题题(重要!!!)

生产者-消费者问题

问题描述:若干进程通过有限的共享缓冲区交换数据。其中,"生产者"进程不断写入,而"消费者"进程不断读出;共享缓冲区共有N个;任何时刻只能有一个进程可对共享缓冲区进行操作。

任何时刻只能有一个进程可对共享缓冲区进行操作,可知使用共享缓冲区的生产者与生产者之间、生产者与消费者之间以及消费者与消费者之间存在互斥关系。

缓冲区不满,生产者才能写入;缓冲区不空,消费者才能读出,可知生产者与消费者之间存在同步关系。

解决:
在这里插入图片描述

读者-写者问题

问题描述:对共享资源的读写操作,任一时刻“写者”最多只允许一个,而“读者”则允许多个,要求:

  • “读-写” 互斥;
  • “写-写” 互斥;
  • “读-读” 允许。

解决:
设置如下信号量: Wmutex表示“允许写”,初值是1; Rmutex表示对Rcount的互斥操作,初值是1。 公共变量Rcount表示“正在读”的进程数,初值是0。

由问题描述,我们可以分析出:

  • 只要一个reader进程在读,便不允许writer进程去写;
  • 仅当Rcount=0,reader进程才需要执行P(Wmutex)操作;
  • 仅当reader进程执行了Rcount减1操作后,其值为0时,才须执行V(Wmutex)操作。
    在这里插入图片描述
    注意:Rcount变量是多个读者进程都要读写的共享变量,if(Rcount==0) ++Rcount;这段代码是多个读者关于Rcount变量的临界区,对于这个临界区也应该进行互斥的保护。为此设置一个互斥信息量Rmutex,初值为1。

例题1

有三个进程PA、PB和PC协作解决文件打印问题。PA将文件记录从磁盘读入内存的缓冲区1,每执行一次读一个记录;PB将缓冲区1的内容复制到缓冲区2中,每执行一次复制一个记录;PC将缓冲区2的内容打印出来,每执行一次打印一个记录。缓冲区的大小与记录大小一样。请用信号量来保证文件的正确打印。

解:
在这里插入图片描述

例题2

桌上有个能盛得下五个水果的空盘子。爸爸不停地向盘中放苹果或桔子,儿子不停地从盘中取出桔子吃,女儿不停地从盘中取出苹果吃。规定三人不能同时从盘子中取放水果。试用信号量实现爸爸、儿子和女儿这三个循环进程之间的同步。

解:
在这里插入图片描述

例题3

请用信号量机制解决以下的“过独木桥”问题:同一方向的行人可连续过桥,当某一方向有人过桥时,另一方向的行人必须等待;当某一方向无人过桥时,另一方向的行人可以过桥。

解:
同一方向的行人可以同时过桥,这相当于读者可以同时读。因此,可将两个方向的行人看作两类不同的读者,同类读者(行人)可以同时读(过桥),但不同类读者(行人)之间必须互斥地读(过桥)。

信号量定义如下:

	int countA=0, countB=0; //countA、countB分别表示A、B两个方向过桥的行人数量
	Semaphore bridge=1;          //用来实现不同方向行人过桥的互斥共享      
	Semaphore mutexA=1, mutexB=1;           //分别用来实现对countA、countB的互斥共享

A方向算法描述为:

 	PA(){
 	     Wait(mutexA);                    
 	     If(countA==0) wait(bridge);
 	     countA++;
 	     signal(mutexA);
 	     //过桥;
 	     Wait(mutexA);
 	     countA--;
 	     if(countA==0) signal(bridge);
 	     signal(mutexA);}

B方向行人的算法与上述算法类似,只需将其中的mutexA、countA换成mutexB和countB即可。

例题4

设有两个生产者进程A、B和一个销售者进程C,他们共享一个无限大的仓库,生产者每次循环生产一个产品,然后入库供销售者销售;销售者每次循环从仓库中取出一个产品进行销售。不允许同时入库,也不允许边入库边出库;而且要求生产A产品和B产品的件数满足以下关系:-n<=A的件数-B的件数<=m,其中n、m是正整数,但对仓库中A产品和B产品的件数无上述要求。请用信号量机制写出A、B、C三个进程的工作流程。

解:
题中存在着以下的同步和互斥关系:

  • 生产者A、B和消费者C之间,不能同时将产品入库和出库,仓库是一个临界资源。
  • 两个生产者之间必须进行同步,当生产A、B产品的件数之差>=m时,生产者A必须等待;当生产A、B产品的件数之差<=-n时,生产者B必须等待。可想象成有两种令牌,分别跟允许A和B生产的产品数量相关,A和B必须取得对应的令牌后才能生产产品,故这两类令牌也就是两种临界资源。
  • 生产者和销售者之间也必须取得同步,只有当生产者生产出产品并入库后,销售者才能进行销售。

根据上述分析,信号量定义如下:
为了互斥地入库和出库,为仓库设置互斥信息量, mutex=1
为了使生产的产品件数满足:-n<=A的件数-B的件数<=m,需设置两个信号量,其中SAB表示当前允许A生产的产品数量,其初值为,SAB=mSBA表示当前允许B生产的产品数量,其初值为, SBA =n
设置一个初值为0的资源信号量S,对应于仓库中的产品数量,S=0

Semaphore SAB=m, SBA=n, S=0,mutex=1;

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值