进程同步与信号量机制的应用

本文详细介绍了信号量机制,包括整形信号量和记录型信号量,阐述了它们在实现进程互斥、同步以及资源分配中的作用。同时,讨论了AND型信号量的特点。此外,还探讨了管程的概念,强调了管程中的条件变量和进程同步。通过实例展示了信号量如何解决生产者消费者问题、读者写者问题以及哲学家进餐问题等经典同步问题。最后,提出了三个进程共享缓冲区的问题,通过信号量机制实现了进程间的同步与互斥。
摘要由CSDN通过智能技术生成
  • 信号量机制

1.整形信号量

与整形量不同,信号量的初值为非负整数,仅能通过两个标准的原子操作wait(s)和signal(s)来访问,也被称为P,V操作,信号量S的值仅有这两个操作来实现。存在忙等现象

wait(s){
while(s<=0);
s--;
}
signal(s)
{
s++;
}

2.记录型信号量

增加了一个用于代表资源数目的整型变量value和一个进程链表指针list,用于表示连接上述的所有等待进程。

wait(*s){
s->value--;
if(s->value<0) block(s->list);
}
signal(*s){
s->value++;
if(s->value<=0) wakeup(s->list);
}

s->value的初值表示系统中某类资源的数目,也称为资源信号量

wait操作意味着进程请求一个单位的该类资源,使系统中可供分配的该类资源减一

s->value<0时,表示该类资源已经分配完毕,因此进程应调用block原语进行自我阻塞,放弃处理机,此时s->value的绝对值表示该信号量链表里所阻塞进程的数目。

signal操作表示执行进程释放一个单位资源,使系统中可供分配的该类资源增加一个

 若加1后s->value<=0,表示在该信号量链表中仍有等待该资源的进程被阻塞

若s->value的初值为1,则表示系统内只允许一个进程访问临界资源,此时的信号量称为互斥信号量,用于进程互斥 

若s->value > 1,则信号量S表示资源信号量

3.AND型信号量

将进程在整个运行过程中所需要的所有资源,一次性全部分配给进程,将进程使用完在一起释放,要么把他所请求的资源全部分配,要么一个也不分配

  • 信号量的应用

1.信号量实现进程互斥(使用同一系统资源“临界资源”)

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

每个欲访问该临界资源的进程在进入临界区之前,都要先对mutex执行wait操作,若该资源此刻未被访问,本次wait操作必然成功,进程便可进入自己的临界区,这时若再有其它进程也欲进入自己的临界区,由于对mutex执行wait操作定会失败,因而此时该进程阻塞,从而保证了该临界资源能被互斥地访问。当访问临界资源的进程退出临界区后,又应对mutex执行signal操作,以便释放该临界资源

当mutex=1时,表示两个进程皆未进入需要互斥的临界区
当mutex=0时,表示有一个进程进入临界区运行
当mutex=-1时,表示有一个进程正在临界区运行,另外一个进程因等待而阻塞在信号量队列中,需要被当前已在临界区运行的进程退出时唤醒

wait(mutex)与signal(mutex)必须成对存在

 信号量实现多个进程的互斥:

2.信号量实现前趋关系

P1中有语句S1; P2中有语句S2。我们希望在S1执行后再执行S2。为实现这种前趋关系,只需使进程P1和P2共享一个公用信号量S,并赋予其初值为0将signal(S)操作放在语句S1后面,而在S2语 句前面插入wait(S)操作。

由于S被初始化为0,这样,若P,先执行必定阻塞,只有在进程Pq执行完Sq; signal(S); 操作后使S增为1时,P2进程方能成功执行语句S2。

 

P1() {S1;signal (a) ;signa1(b); signal(c);}
P2() {wait(a) ;S2; signal(d) ;}
P3() {wait(b) ;S3; signal(e); signal(f);}
P4() {wait(c) ;S4; signal(g) ;}
P5() {wait(d); wait(e) ;S5; signal(h) ;}
P6() {wait(f); wait(g) ;S6; signal(i)}
P7() {wait(h); wait(i) ;S7; signal(j) ;}
P8() {wait(j) ;S8;}

3.信号量实现同步(相互合作完成某一工作)

有A、B两进程,A进程从卡片机读信息写入缓冲区,B进程负责取出并加工缓冲区的信息:缓冲区只能存放一个消息。

设信号量S1:缓冲区中有否可供加工的信息,初始值为0;

信号量S2:缓冲区是否为空,初始值为1。

  • 信号量总结

信号量的使用:
必须一次且只能置一次初值
初值不能为负(与物理意义有关)
只能由P,V操作修改值
信号量的物理意义:
当s>0时,s表示可用资源的个数
当s=0时,s表示无资源,无等待的进程
当s<0时,|s |表示等待队列中进程个数。
互斥的信号量: PV操作在同一个进程中
同步的信号量: PV操作在不同的进程中

  • 管程机制

一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据。

1.管程的介绍

1)管程的组成部分

①管程的名称;
②局部于管程的共享数据结构说明;
③对该数据结构进行操作的一组过程;
④对局部于管程的共享数据设置初始值的语句。

所有进程要访问临界资源时,都只能通过管程间接访问,而管程每次只准许一个进程进入管程,执行管程内的过程,从而实现了进程互斥。
 

2.条件变量

在利用管程实 现进程同步时,必须设置同步工具,如两个同步操作原语wait和signal。当某进程通过管程请求获得临界资源而未能满足时,管程便调用wait原语使该进程等待,并将其排在等待队列上仅当另一进程访问完成并释放该资源之后,管程才又调用signal原语,唤醒等待队列中的队首进程。
管程中的signal必须在wait之后

如果有进程Q因x条件处于阻塞状态,当正在调用管程的进程P执行了x.signal操作后,进程Q被重新启动,管程中便存在两个同时处于活动状态的进程,如何确定哪个执行哪个等待,可采用下述两种方式之一进行处理: 
①P等待,直至Q离开管程或等待另一条件。
②Q等待,直至P离开管程或等待另一条件。
规定管程中的过程所执行的signal操作是过程体的最后一个操作,于是,进程P执行signal操作后立即退出管程,因而,进程Q马上被恢复执行。

  • 同步问题

1.生产者消费者问题

定义两个同步信号量:
empty表示缓冲区是否为空,初值为1。
full表示缓冲区中是否为满,初值为0。

单缓冲区的同步问题
➢P进程不能往“满”的缓冲区中放产品,设置信号量为empty
➢C进程不能从“空”的缓冲区中取产品,设置信号量full
单缓冲区的互斥问题
➢P、C进程不能同时使用缓冲区

 1)记录型信号量表达

empty:说明空缓冲单元的数目,其初值为有界缓冲区的大小n。——同步
full:说明满缓冲单元的数目(即产品数目),其初值为0。——同步
mutex :说明该有界缓冲区是临界资源,必须互斥使用,初始值为1——互斥

它是一个同步问题
(1)消费者想要取产品,有界缓冲区中至少有一个单元是满的。
(2) 生产者想要放产品,有界缓冲区中至少有一个是空的。
它是一互斥问题
有界缓冲区是临界资源,因此,各生产者进程和各消费者进程必须互斥执行。

2)AND型信号量表达

 3)管程表达

put(x)过程。生产者利用该过程将自己生产的产品投放到缓冲池中,并用整型变量count来表示在缓冲池中已有的产品数目,当count≥N时表示缓冲池已满生产者须等待,执行cwait(x)。
get(x)过程。消费者利用该过程从缓冲池中取出一个产品,当count≤0时,表示缓冲池中已无可取用的产品,消费者应等待

对于条件变量notfull和notempty,分别有两个过程cwait和csignal对它们进行操作:
cwait(condition)过程: 当管程被一个进程占用时,其他进程调用该过程时阻塞,并挂在条件condition的队列上。
csignal(condition)过程:唤醒在cwait执行后阻塞在条件condition队列.上的进程,如果这样的进程不止一个,则选择其中一个实施唤醒操作;如果队列为空,则无操作而返回。

4)问题变形

  • 桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专等吃盘中的桔子,女儿专等吃盘中的苹果。规定:当盘空时一次只能放一只水果供吃者取用,请用wait、signal原 语实现爸爸、儿子、女儿三个并发进程的同步。

        本题中,应设置三个信号量s,so,sa,信号量s表示盘子是否为室,其初值为1,信号量S0表示盘中是否有桔子,其初值为0,信号量sa表示盘中是否有苹果,其初值为0。

  • 有三个进程PA、PB和PC合作解决文件打印问题:PA将文件记录从磁盘读入主存的缓冲区1,每执行一次读一个记录; PB将缓冲区1的内容复制到缓冲区2,每执行一次,复制一个记录; PC将缓冲区2的内容打印出来,每执行一次打印一个记录。缓冲区的大小等于一个记录大小。

       请用wait、signal操作来保证文件的正确打印。

        本题中,应设置四个信号量empty1、empty2、full1、full2,信号量empty1和empty2分别表示缓冲区1及缓冲区2是否为空,其初值为1;信号量full1和full2分别表示缓冲区1和缓冲区2是否有记录可供处理,其初值为0。

2.哲学家进餐问题

        该问题是描述有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐完毕,放下筷子继续思考。

        经分析可知,放在桌子上的筷子是临界资源,在.一段时间内只允许一位哲学家使用。为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量构成信号量数组。其描述如下:semaphore chopstick[5]={1,1,1,1,1};所有信号量均被初始化为1,第i位哲学家的活动

3.读者写者问题

        一个数据文件或记录可被多个进程共享,我们把只要求读该文件的进程称为“Reader进程”,其他进程则称为“Writer进程允许多个进程同时读一个共享对象,因为读操作不会使数据文件混乱。但不允许一个Writer进程和其他Reader进程或Writer进程同时访问共享对象。因为这种访问将会引起混乱。

所谓“读者一写者(Reader-Writer Problem)问题"是指保证一个Writer进程必须与其他进程互斥地访问共享对象的同步问题
两组并发进程:读者和写者,共享一组数据区
要求:
■允许多个读者同时执行读操作
■不允许读者、写者同时操作
■不允许多个写者同时操作

为实现Reader与Writer进程间在读或写时的互斥而设置了一个互斥信号量Wmutex。

另外,再设置一个整型变量Readcount表示正在读的进程数目。由于只要有一个Reader进程在读,便不允许Writer进程去写。因此,仅当Readcount=0,表示尚无Reader进程在读时,Reader进程才需要执行Wait(Wmutex)操作。

若wait(Wmutex)操作成功,Reader进程便可去读,相应地,做Readcount+1操作。
同理,仅当Reader进程执行了Readcount减1操作后其值为0时,才须执行signal(Wmutex)操作,以便让Writer进程写操作。又因为Readcount是一个可被多个Reader进程访问的临界资源,
因此,也应该为它设置一个互斥信号量rmutex.

即一旦有写者到达,后续的读者必须等待,而无论是否有读者在读文件。设置一个互斥信号量mutex=1

题目:

  • 例:三个进程P1、P2、P3互斥使用一个包含N(N>0)个单元的缓冲区。P1每次用produce()生成一个正整数并用put()送入缓冲区某一空单元中;P2每次用getodd()从该缓冲区中取出一个奇数并用countodd统计奇数个数;P3每次用geteven()从该缓冲区中取出一个偶数并counteven统计偶数个数。请用信号量机制实现这三个进程的同步与互斥活动,并说明所定义信号量的含义。要求用伪代码描述。

       定义信号量S1控制P1与P2之间的同步; S2控制P1与P3之间的同步,empty控制生产者与消费者之间的同步; mutex控制进程间互斥使用缓冲区。程序如下:

 

 

  • 例银行排队问题。银行有n个柜员,每个顾客进入银行后先取一个号,并且等着叫号,当一个柜员空闲后,就叫下一个号。

       将顾客号码排成一个队列,顾客进入银行领取号码后,将号码由队尾插入;柜员空闲时,从队首取得顾客号码,并且为这个顾客服务,由于队列为若干进程共享,所以需要互斥.柜员空闲时,若有顾客,就叫下一个顾客为之服务.因此,需要设置一个信号量来记录等待服务的顾客数.

  • 交通问题,车流如箭头所示。桥上不允许两车交会,但允许同方向车辆依次通行(即桥上可以有多个同方向的车)。用wait、signal操作实现交通管理以防止桥上堵塞。

        设置countSN和countNS表示由南往北、由北往南已在桥上行驶的汽车数目,初值为0
        设置SN表示对countSN的互斥,初值为1
        设置NS表示对countNS的互斥,初值为1
        设置mutex表示对桥的互斥,初值为1

 

  •  (少林寺问题)某寺庙,有小和尚、老和尚若干.庙内有一水缸,由小和尚提水入缸,供老和尚饮用.水缸可容纳30桶水,每次放水、取水仅为1桶,不可同时进行。水取自同一井中,水井径窄,每次只能容纳一个水桶取水。设水桶个数为5个,试用信号量和wait、signal操 作给出老和尚和小和尚的活动。

        semaphore empty=30;
        //表示缸中目前还能装多少桶水,初始时能装30桶水
        semaphore full=0;
        //表示缸中有多少桶水,初始时缸中没有水
        semaphore buckets= 5;
        //表示有多少只空桶可用,初始时有5只桶可用
        semaphore mutex_ well=1;
        //用于实现对井的互斥操作
        semaphore mutex_ bigjar= 1;
        //用于实现对缸的互斥操作

 

  •  例:有一个阅览室,共有100个座位,读者进入时必须先在一张登记表上登记,该表为每一座位列一表目,包括座号和读者姓名等,读者离开时要消掉登记的信息,试问: 

        (1)为描述读者的动作,应设置几个进程?
        (2)试用wait、 signal操作描述读者进程之间的同步关系。

        读者的动作有两个,一是填表进入阅览室,这时要考虑阅览室里是否有座位;一是读者阅读完毕,离开阅览室,这时的操作要考虑阅览室里是否有读者。读者在阅览室读书时,由于没有引起资源的变动,不算动作变化。
        算法的信号量有三个:
        seats表示阅览室 是否有座位(初值为100,代表阅览室的空座位数) ;
        readers表示阅览室里的读者数,初值为0;
        用于互斥的mutex,初值为1。

  • 某车站售票厅,任何时刻最多可容纳20名购票者进入,当售票厅中少于20名购票者时,则厅外的购票者可立即进入,否则需在外面等待。若把一个购票者看作一个进程,请回答下列问题:

       用wait、signal操作管理这些并发进程时,应怎样定义信号量,写出信号量的初值以及信号量各种取值的含义。

信号量S,初始值为20。
意义: S>0:S的值表示可继续进入售 票厅的人数
S=0:表示售票厅中已有20名顾客(购票者)
S<0:|S|的值为等待进入售票厅的人数

  • 系统中有多个生产者进程和多个消费者进程,共享一个能存放1000件产品的环形缓冲区(初始为空)。当缓冲区未满时,生产者进程可以放入其生产的一件产品,否则等待;当缓冲区未空时,消费者进程可以从缓冲区取走一件产品,否则等待。要求一个消费者进程从缓冲区连续取出10件产品后,其他消费者进程才可以取产品。请使用信号量P, V(wait(),signal()操作实现进程间的互斥与同步,要求写出完整的过程,并说明所用信号量的含义和初值。

        mutex=1表示进程间的互斥,生产与消费不能同时的互斥

        full表示缓冲区中的产品个数,初值为0

        empty表示缓冲区空位置,初值为1000

        s表示一个消费者进程从缓冲区连续取出10件产品后,其他消费者进程才可以取产品的互斥,初值为1

  • 有A、B两人通过信箱进行辩论,每人都从自己的信箱中取得对方的问题。将答案和向对方提出的新问题组成一个邮件放入对方的邮箱中,设A的信箱最多放M个邮件,B的信箱最多放N个邮件。初始时A的信箱中有x个邮件(0<x<M) . B中有y个(0<y<N)。辩论者每取出一个邮件,邮件数减1。当信箱不为空时,辩论者才能从信箱中取邮件,否则等待。 当信箱不满时,辩论者才能将新邮件放入信箱,否则等待。请添加必要的信号量和P、 V (或wait, signal)操作,以实现.上述过程的同步,要求写出完整过程,并说明信号量的含义和初值。

        A、B两人操作过程:

 

Semaphore mutexA=1; //A信箱放信件与取信件的互斥
Semaphore mutexB=1;//B信箱放信件与取信件的互斥
Semaphore emptyA=M-x;//A信箱空位置的数量
Semaphore emptyB=N-y;//B信箱空位置的数量
Semaphore fullA=x;//A信箱邮件个数
Semaphore fullB=y;B信箱邮件个数

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yoin.

感谢各位打赏!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值