另类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具有自动垃圾回收机 ...
随机推荐
- Struts2 2.5版本的通配符和动态方法调用的问题
Struts2.5版本之后,使用通配符的时候出现错误 配置的四个action,使用通配符和动态方法的时候找不到其中的update方法后来经过查找才知道原来是版本加了一个 <action name ...
- 第一次Scrum冲刺——Life in CCSU
一.第一次Scrum任务 首先集体讨论确定全局规划,然后进行切割分工,按照规划实现全部功能.现在基于用户的基本需求做一部分. 二.用户故事 1.用户打开APP,进入登录界面: 2.用户输入账号和密码: ...
- js 中数字与字符串之间的转换
数字转换为字符串 var num = 123: 1.num.toString 2."" + num 3.String(num) 将数字转化为格式化后的字符串 num.toFixe ...
- Leetcode 两数之和 (散列表)
给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums = [2, 7, 11, 15], target ...
- 21. Wireless tools (无线工具 5个)
AircrackKismetNetStumblerinSSIDerKisMAC
- P4168 [Violet]蒲公英
神仙分块题?其实还是很简单的,res[i][j]表示第i块到第j块的众数,然后再用sum[i][j]表示前i块中j这个种类出现的次数,然后分块瞎搞就行了,感觉我写的十分简洁,好评( //author ...
- cordova原生页面切换效果插件的使用:com.telerik.plugins.nativepagetransitions
1. 添加插件:cordova plugin add com.telerik.plugins.nativepagetransitions2. 使用方法: 在index.html中添加: <met ...
- 谈lisp
The Lisp Curse /Lisp魔咒 http://winestockwebdesign.com/Essays/Lisp_Curse.html 英文出处 http://www.soimort. ...
- maven无法下载oracle驱动包
由于版权问题,在中央仓库是没有oracle的jdbc驱动的,可以手动下载到本地或者在oracle安装目录的jdbc目录中找到对应的jar,然后通过以下命令安装到本地仓库 mvn install:ins ...
- java_oop_三大特性
继承 概念 优点 语法 使用 有些父类成员不能被继承 private成员变量和方法 子类与父类不在同包,使用默认访问权限的成员 ...