信号量与PV操作.ppt
《信号量与PV操作.ppt》由会员分享,可在线阅读,更多相关《信号量与PV操作.ppt(47页珍藏版)》请在三一办公上搜索。
1、主要内容:同步与同步机制信号量及其操作信号量的应用哲学家进餐问题生产者-消费者问题读者-写者问题理发师问题,3.3 信号量与PV操作,3.1.1 同步与同步机制,著名的生产者-消费者问题是计算机操作系统中并发进程内在关系的一种抽象,是典型的进程同步问题。在操作系统中,生产者进程可以是计算进程、发送进程;而消费者进程可以是打印进程、接收进程等等。解决好生产者-消费者问题就解决好了一类并发进程的同步问题。生产者-消费者问题表述:有n个生产者和m个消费者,连接在k个单位缓冲区的有界环形缓冲池上,故又叫有界缓冲问题。其中pi和cj都是并发进程,只要缓冲区未满,生产者进程pi所生产的产品就可以放入缓冲区
2、;只要缓冲区非空,消费者进程cj就可以从缓冲区取走并消耗产品。,.,.,int k;typedef anyitem item;/item类型 nextp,nextc:item;item bufferk;int in=0,out=0,counter=0;,process producer(void)while(TRUE)produce an item in nextp;if(counter=k)sleep(producer);bufferin=nextp;in=(in+1)%k;counter+;if(counter=1)wakeup(consumer);,process consumer(vo
3、id)while(TRUE)if(counter=0)sleep(consumer);nextc=bufferout;out=(out+1)%k;counter-;if(counter=k-1)wakeup(producer);consume the item in nextc;,生产者和消费者单独运行都是正确的,但是,如果并发执行(交替执行)就会产生错误:结果不唯一永远等待出现错误结果的原因在于各个进程访问缓冲区的速率不同,要得到正确结果,需要调整并发进程的速度,这需要通过在进程间交换信号或消息来调整相互速率,达到进程协调运行的目的。这种协调过程称为进程同步。操作系统实现进程同步的机制称为同
4、步机制,它通常由同步原语组成。常用的同步机制有:信号量与PV操作、管程和消息传递。,3.3.2 信号量与PV操作,1.前节种种方法解决临界区调度问题的缺点 1)对不能进入临界区的进程,采用忙式等待测试法,浪费CPU时间。2)将测试能否进入临界区的责任推给各个竞争的进程会削弱系统的可靠性,加重了用户编程负担。3)这些方案只能解决进程竞争,不能解决进程协作问题。2.信号量同步机制的提出 1965年荷兰计算机科学家提出了新的同步工具-信号量和P、V操作。他将交通管制中多种颜色的信号灯管理交通的方法引入操作系统,让两个或多个进程通过特殊变量展开交互。一个进程在某一特殊点上被迫停止执行直到接收到一个对应
5、的特殊变量值,这种特殊变量就是信号量(Semaphore)。,进程可以使用P、V两个特殊操作来发送和接收信号,如果协作进程的相应信号仍未送到,则进程被挂起直到信号送达为止。(注意:这里的“挂起”并不是第二章里的被对换到硬盘上,而是转入等待状态!)操作系统中,信号量是用来表示物理资源的实体,用一个结构性变量表示,有两个分量:一个是信号量的值,另一个是指向信号量的队列的指针。除赋初值外,信号量仅能由同步原语P和V对其进行操作,没有任何其他方法可以检查和操作信号量。原语是操作系统内核中执行时不可中断的过程,即原子操作。Dijkstra发明了两个信号量操作原语:P操作原语和V操作原语(荷兰语中“测试(
6、Proberen)”和“增量(Verhogen)”的头字母)。常用的其他符号有:wait和signal;up和down;sleep和wakeup等。利用信号量和P、V操作既可以解决并发进程的竞争问题,又可以解决并发进程的协作问题。,信号量的分类 信号量按其用途分为2种:公用信号量:初值常常为1,用来实现进程间的互斥。相关进程均可对其执行P、V操作。私有信号量:初值常常为可用资源数,多用来实现进程同步。拥有该信号量的一类进程可以对其执行P操作,而另一类进程可以对其执行V操作,多用于并发进程的同步。信号量按照取值可以分为两种:二元信号量:仅允许取0和1,主要用于解决进程互斥;一般信号量(计数信号量
7、):允许取任意整数值,主要用于解决进程同步问题。,一般信号量 数据类型:s是结构性变量,其中成员value为整型变量,系统初始化时为其赋初值;成员list为等待使用此类资源的进程队列的头指针。P(s):将s的成员value的值减一;若结果小于0,则执行P操作的进程被阻塞,并且进入s的成员list指向的队列;否则,执行P操作的进程继续执行。(2)V(s):将s的成员value的值加一;如果结果小于等于0,则执行V操作的进程从s的成员list指向的队列中唤醒一个进程(使其转变为就绪态),随后自己继续执行;如果结果大于0,则执行V操作的进程继续执行。,结构型信号量和PV操作的实现:typdef st
8、ruct semaphore int value;struct pcb*list;void P(semaphore,其中W(s.list)和R(s.list)是操作系统的基本系统调用,W(s.list)表示把调用它的进程置成等待信号量s状态,并移入s信号量队列,同时释放CPU,转向进程调度;R(s.list)表示释放一个等待s信号量的进程,转换成就绪态并且移入就绪队列,执行该操作的进程继续执行(时间片未到期)或者转向进程调度(时间片已到期)。进程从队列中移出时的次序按照FCFS算法,被阻塞的时间越长的进程越优先出队,一避免饥饿现象。,结构型信号量与PV操作的关系,推论1:若信号量s.value
9、为正值,则该值等于在封锁进程之前对信号量s可施行的P操作数、亦等于s所代表的实际还可以使用的物理资源数推论2:若信号量s.value为负值,则其绝对值等于登记排列在该信号量s队列之中等待的进程个数、亦即恰好等于对信号量s实施P操作而被封锁起来并进入信号量s队列的进程数推论3:通常,P操作意味着请求一个资源,V操作意味着释放一个资源。在一定条件下,P操作代表挂起进程操作,而V操作代表唤醒被挂起进程的操作,记录型信号量与PV操作的注意事项,P 操作信号量的值减一如果满足if条件,执行了P操作的进程会挂起,P操作语句之后的语句都不会再执行。被挂起的进程,除非另一个进程调用V()来唤醒它,否则永远不会
10、执行。V 操作信号量的值加一如果满足if条件,执行V操作的进程会去唤醒另一个正在等待的进程(被挂起的进程)。执行V操作的进程不会自愿停止,V操作后面的语句会接着执行被唤醒的进程只是进入了就绪队列,并不一定有机会马上被执行被唤醒的进程,从挂起点接着执行,也就是P操作之后的语句,2 二元信号量,设s为一个结构型数据结构,其中一个为value,它仅能取值0和1,另一个分量为信号量队列头指针list typedef struct binary_semaphore int value;struct pcb*list;void BP(binary_semaphore 可以证明,二元信号量与其他结构信号量具
11、有一样的表达能力。,3.3.3 信号量实现进程互斥,semaphore mutex;mutex=1;cobegin process Pi()/i=1,2,n.P(mutex);临界区;V(mutex);.coend;,信号量解决机票问题,哲学家吃通心面问题,有五个哲学家围坐在一圆桌旁,桌中央有一盘通心面,每人面前有一只空盘于,每两人之间放一把叉子。每个哲学家思考、饥饿、然后吃通心面。为了吃面,每个哲学家必须获得两把叉子,且每人只能直接从自己左边或右边去取叉子,哲学家吃通心面问题示意图,4,0,0,1,4,3,1,2,3,2,哲学家,叉子,哲学家吃通心面问题,semaphore fork5;fo
12、r(int i;i5;i+)forki:=1;cobeginprocess Philosopher_i()/i=0,1,2,3,4,while(true)think();P(forki);P(forki+1%5);eat();V(forki);V(fork(i+1)%5);coend,上述算法能够实现进程的互斥(同步),但是,它可能发生死锁:如果每一个哲学家依次拿起右边(或者左边)的叉子,结果就会出现每一个人都拿到一把叉子,而都等待第二把叉子的现象。解决死锁问题的方案:至多允许4位哲学家吃面;奇数号哲学家先拿左边的叉子,偶数号哲学家先拿右边的叉子;规定每一个哲学家都必须拿到两把叉子才能吃面,否
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信号量 PV 操作

链接地址:https://www.31ppt.com/p-5229586.html