另类P、V操作问题-详细图解
问题模型
有一个系统,定义如下P、V操作:
P(s):
s.count--;
if s< then
将本进程插入相应队列末尾等待; V(s):
s.count++;
if s<= then
从相应等待队列队尾唤醒一个进程,将其插入就绪队列;
思考并回答:
a. 这样定义P、V操作是否有问题?
b. 试用这样的P、V操作实现N个进程竞争使用某一共享变量的互斥机制。
c. 对于b的解法,有无效率更高的方法。如有,试问降低了多少复杂性?
分析
a. 当然有问题,假设s=2,现有进程p1、p2按顺序来请求共享资源A,p1和p2直接获取A,假设p1和p2都还未释放A的时候,p3、p4、p5按顺序也来请求A,这时s的等待队列L为:(尾)p5p4p3(头),然后p1释放A,执行V(s)操作从L队尾唤醒p5,L变为:(尾)p4p3(头)。这时A被p2和p5持有,且p2和p5都未释放A的时候,假设这时p1又来请求A,p1被挂起,L变为:(尾)p1p4p3(头)。然后p2释放A执行V(s)操作从L队尾唤醒p1,你会发现p1又竞争到了A,而p3和p4还一次都未竞争到,这会导致越靠近L队首的p3和p4越容易饿死,出现饥饿现象。问题的根源就在于这样定义的P、V操作,由于在信号量的等待队列上是先进后出导致的,这属于栈P、V。
b. 解决方案
这里以N个进程为例进行一般化分析,定义信号量数组S[N-1],共有N-1个信号量,下标从0~N-2,其中S[i] = N-i-1,表示第i+1个信号量S[i]的初值为N-i-1,初值为何取这个看后面分析,下为伪码。
Semaphore S[N-]; // S[i] = N-i-1
void func()
{
for(int i= ; i<n- ; i++)
P(S[i]);
// 临界区 Critical Section
for(int i=n- ; i>= ; i--)
V(S[i]);
}
一定要注意P(S[i])操作中的i是从0~N-2,而V(S[i])的i是反过来的从N-2~0,这个很重要,这个就是多级队列的精髓,顺序不能换。
下面的分析,假设t1时刻p1进入临界区还没出来之前,t2~tN时刻p2~pN按顺序来请求进入临界区,那么p2~pN都执行for循环,分别被挂起在信号量N-2~0的等待队列上,并且每个信号量的等待队列上有且只有一个进程被挂起。在tN+1时刻p1出临界区,由于V(S[i])是从N-2~0,因此等待在LN-2上的P2最先被唤醒,然后L2进入临界区。之后按顺序p3~pN依次被唤醒并依次挂入就绪队列等待被调度,而处理器从就绪队列进行调度是FIFO,与请求临界区的顺序一致,饥饿现象得以解决。

该方法的资源复杂度为O(N-1),需要N-1个信号量。
c. 优化方法
除了前面的办法,已经可以确定存在更优方案能把资源复杂度降为O(logN)。
另类P、V操作问题-详细图解的更多相关文章
- CentOS 6.4 服务器版安装教程(超级详细图解)
附:CentOS 6.4下载地址 32位:http://mirror.centos.org/centos/6.4/isos/i386/CentOS-6.4-i386-bin-DVD1to2.torre ...
- win8.1系统的安装方法详细图解教程
win8.1系统的安装方法详细图解教程 关于win8.1系统的安装其实很简单 但是有的童鞋还不回 所以今天就抽空做了个详细的图解教程, 安装win8.1系统最好用U盘安装,这样最方便简单 而且系统安装 ...
- TCP三次握手及四次挥手详细图解
TCP三次握手及四次挥手详细图解 Andrew Huangbluedrum@163.com 相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不 ...
- CentOS 6.4安装(超级详细图解教程)
链接地址:http://www.osyunwei.com/archives/5855.html CentOS 6.4安装(超级详细图解教程) 附:CentOS 6.4下载地址 32位:http://m ...
- (转)tasklist命令参数应用详细图解
原文:https://blog.csdn.net/bcbobo21cn/article/details/51759521 一 操作实例不带参数: /svc参数: /SVC 显示每个进程中的服务信息,当 ...
- MySQL安装详细图解整理
MySQL安装详细图解 2018-08-19 08:32:33 一.MYSQL的安装 1.打开下载的mysql安装文件mysql-5.0.27-win64.zip,双击解压缩,运行“setup.ex ...
- 详细图解jQuery对象,以及如何扩展jQuery插件
详细图解jQuery对象,以及如何扩展jQuery插件 早几年学习前端,大家都非常热衷于研究jQuery源码.我还记得当初从jQuery源码中学到一星半点应用技巧的时候常会有一种发自内心的惊叹,“原来 ...
- JS详细图解全方位解读this
JS详细图解全方位解读this 对于this指向的理解中,有这样一种说法:谁调用它,this就指向谁.在我刚开始学习this的时候,我是非常相信这句话的.因为在一些情况下,这样理解也还算说得通.可是我 ...
- JS内存空间详细图解
JS内存空间详细图解 变量对象与堆内存 var a = 20; var b = 'abc'; var c = true; var d = { m: 20 } 因为JavaScript具有自动垃圾回收机 ...
随机推荐
- 6th week blog(2)
fixed:元素将从常规文档流中删除,并且不会为页面布局中的元素创建任何空间.它的位置相对于初始位置.它允许框架样式布局.在页式媒体如打印输出中,一个固定元素会出现于第一页的相同位置.这可以用来创建一 ...
- .net core+Spring Cloud学习之路 一
文章开头唠叨两句. 2019年了,而自己参加工作也两年有余了,用一个词来概括这两年多的生活,就是:“碌碌无为”. 也不能说一点收获都没有,但是很少.2019来了,我立志要打破现状,改变自己,突破自我. ...
- 【开发】iOS入门 - Touch事件处理学习笔记
网上介绍iOS事件机制的文章,有不少都讲得很好,搬运一次意义不大,这里我就列一些要点吧. 跟Android一样,iOS的Touch事件也是从外到内传递,然后从内到外响应,可以看成一个U型结构.然而,个 ...
- ubuntu16.04 安装java
1.从官网下载 jdk-8u191-linux-x64.tar.gz(https://www.oracle.com/technetwork/java/javase/downloads/jdk8-dow ...
- Mac OS X L2TP Client Setup
原文链接:http://www.softether.org/4-docs/2-howto/9.L2TPIPsec_Setup_Guide_for_SoftEther_VPN_Server/5.Mac_ ...
- 链表中倒数第k个节点(Java)
链表中倒数第k个节点 题目描述 输入一个链表,输出该链表中倒数第k个结点. 思路:two-pointers思想,因为是单链表,没法得prevous点,直接遍历得到链表长度再重新遍历效率很低. 采用双指 ...
- java_oop_接口
接口 难的是在系统设计里怎么样使用接口,主要在语法,不在系统架构与设计 概念 声明 语法 只有抽象方法的抽象类?可以用接口来表示,用接口来代替这样的抽象类,是因为 ...
- vue- 项目之前端页面搭建1
项目分析 首页 导航.登录注册栏.轮播图.地板导航登录注册 选项卡免费课 课程分类.筛选.课程列表免费课详情 课程封面视频.优惠活动倒计时.选项卡我的购物车 全选.商品价格统计购买结算 购买成功 我的 ...
- 我发起并创立了一个 Javascript 前端库 开源项目 jWebForm
在线演示地址: ( 在线演示 云平台 由 Kooboo 提供 https://www.kooboo.com/ ) 按钮: http://iwebform.kgeking.kooboo.si ...
- PHP数组和XML相互转换的函数
//数组转xml function ArrToXml($arr) { if(!is_array($arr) || count($arr) == 0) return ''; $xml = "& ...