• 信号量机制

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信箱邮件个数

进程同步与信号量机制的应用相关推荐

  1. 进程同步之信号量机制(pv操作)及三个经典同步问题

    上篇博客中(进程同步之临界区域问题及Peterson算法),我们对临界区,临界资源,锁机制详细解读了下,留下了一个问题,就是锁机制只能判断临界资源是否被占用,所以他解决了互斥问题,但是他不能确定前面的 ...

  2. 进程同步之信号量机制(pv操作)

    1.信号量机制 信号量机制即利用pv操作来对信号量进行处理. 什么是信号量?信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程.信号量的值与相应资源的使用情况有 ...

  3. 操作系统之进程管理:11、用信号量机制实现进程同步、互斥、前驱关系

    11.用信号量机制实现进程同步.互斥.前驱关系 思维导图 用信号量机制实现进程同步 用信号量机制实现进程互斥 用信号量机制实现进程的前驱关系 思维导图 用信号量机制实现进程同步 先来看一下什么是进程同 ...

  4. 2.3.5 操作系统之信号量机制实现进程的互斥、同步与前驱关系

    文章目录 0.思维导图 1.信号量机制实现进程互斥 2.信号量机制实现进程同步 3.信号量机制实现前驱关系 0.思维导图 在看此小结内容之前,需熟悉这一篇博客里面的知识,关于P.V操作内部实现原理等h ...

  5. 信号量机制实现进程互斥

    目录 1.总览 2.信号量机制实现进程互斥 3.信号量机制实现进程同步 4.信号量机制实现前驱关系 5.小结 1.总览 2.信号量机制实现进程互斥 3.信号量机制实现进程同步 4.信号量机制实现前驱关 ...

  6. 卡住无法查看到所有进程_进程同步 进程互斥 软件和硬件实现方式 信号量机制 信号量机制实现进程同步,进程互斥,前驱关系...

    参考:https://www.bilibili.com/video/av31584226/?p=9 进程具有异步性的特征,异步性是指,各并发执行的进程以各自独立的,不可预知的速度向前推进. 回忆我们之 ...

  7. 操作系统(三)| 进程同步详解(主要任务、制约关系、临界资源、临界区、同步机制遵循规则、信号量机制、信号量的应用)

    文章目录 进程的同步基本概念 进程同步的主要任务 进程间的制约关系 临界资源 临界区 同步机制应遵循的规则 信号量机制 整型信号量 记录型信号量 ❤❤❤ AND型信号量 信号量的应用 实现进程互斥 实 ...

  8. 十六、用信号量机制实现进程互斥、同步、前驱关系

    一.知识总览 二.信号量机制实现进程互斥 注意: 1.信号量mutex表示进入临界区的名额 2.对不同的临界资源需要设置不同的互斥信号量 3.P.V操作必须成对出现,缺少P(mutex)就不能保证临界 ...

  9. 操作系统(二十二)用信号量机制实现进程互斥、同步、前驱关系

    2.3.5 用信号量机制实现进程互斥.同步.前驱关系 目录 2.3.5 用信号量机制实现进程互斥.同步.前驱关系 2.3.5.1 用信号量机制实现进程互斥 2.3.5.2 用信号量机制实现进程同步 2 ...

  10. 操作系统(二十一)信号量机制

    2.3.4 信号量机制 在前两节中我们分别学习了用软件方式以及硬件方式实现互斥访问,但是他们或多或少的存在一些问题,1965年荷兰的一名学者迪杰斯特拉(是的,就是那个男人)提出了信号量机制,有效的解决 ...

最新文章

  1. NC:王金锋等揭示阴道菌群异位对子宫健康的影响
  2. char str[]与char *str的区别
  3. 如何制作一个通用的多系统安装U盘七(Windows相关配置)
  4. PHP-代码审计-审计第一步
  5. Slickflow.NET 开源工作流引擎基础介绍-.NET Core2.0 版本实现介绍
  6. 哈夫曼树(Huffman Tree)的介绍、画法、哈夫曼树的可视化显示(Python代码实现)
  7. docker镜像是否包含操作系统
  8. 【深入理解Java虚拟机学习笔记】第三章 垃圾收集器与内存分配策略
  9. Python操作ElasticSearch条件查询
  10. Anaconda:使用pip安装第三方库:keras、TensorFlow、h5py
  11. 二十三 常量池作为同步对象可能造成困惑
  12. adb工具箱_安卓福音,史上最强搞机工具箱,一键修手机
  13. 数学建模(NO.10 典型相关分析)
  14. TRNSYS 内区之间通风原理试验
  15. 台式电脑主板插线步骤图_图解电脑主机电源线接法图解
  16. matplotlib—画正弦、余弦函数图
  17. 恰星V3S投影仪好不好?适合学生党购入么?
  18. powerha_在IBM PowerHA集群环境中实现存储数据的服务器端缓存
  19. java I/O流
  20. C++小作业-设计一个用于人事管理的People(人员)类

热门文章

  1. Flask 数据库迁移(详解)
  2. SSM毕设项目国有资产管理系统3c938(java+VUE+Mybatis+Maven+Mysql)
  3. 阿里云·天池大数据竞赛,快商通突破专业屏障,算法能力领跑全球
  4. python爬去新浪微博_Python爬取新浪微博热搜榜
  5. jwplayer使用方法
  6. matlab实现kmeans聚类算法
  7. js drag拖动事件
  8. 企业微信-通讯录管理-成员管理以及部门管理
  9. SMAIL 语法大全(Dalvik 虚拟机操作码)
  10. 凯立德导航 版本号意义解读