多线程面试题系列(12):多线程同步内功心法——PV操作上

上面的文章讲解了在Windows系统下实现多线程同步互斥的方法,为了提高在实际问题中分析和思考多个线程之间同步互斥问题的能力,接下来将讲解PV操作,这也是操作系统中的重点和难点。本文将会先简要介绍下PV操作的来源和基本使用方法,然后再通过两道经典的计算机考研真题——放水果和安全岛来示范如何运用PV操作。

 

先讲讲PV操作的起源和用法。

1962年,荷兰学者Dijksrta在参与X8计算机的开发中设计并实现了具有多道程序运行能力的操作系统——THE Multiprogramming System。为了解决这个操作系统中进程(线程)的同步与互斥问题,他巧妙地利用火车运行控制系统中的“信号灯”(semaphore,或叫“信号量”)概念加以解决。信号量的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,这个信号量的值仅能由PV操作来改变。

PV操作由P操作原语和V操作原语组成(原语也叫原子操作Atomic Operation,是不可中断的过程),对信号量(注意不要和Windows中的信号量机制相混淆)进行操作,具体定义如下:

P(S):

①将信号量S的值减1,即S=S-1;

②如果S>=0,则该进程继续执行;否则该进程置为等待状态。

V(S):

①将信号量S的值加1,即S=S+1;

②该进程继续执行;如果该信号的等待队列中有等待进程就唤醒一等待进程。

 

用PV操作实现多线程的同步与互斥是非常简单的,只要考虑逻辑处理上合理严密而不用考虑具体技术细节,因此与写伪代码较为相似。比如有多个进程P1、P2、 ……PN。它们要互斥的访问一个资源。用PV操作来实现就非常方便直观。下面是PV操作代码:

设置信号量为S,初值为1。各进程的操作流程如下:

进程P1              进程P2           ……          进程Pn

P(S);              P(S);                           P(S);

访问资源;         访问资源;                      访问资源;

V(S);             V(S);                          V(S);

可以看出PV操作会忽略具体的编程细节,让程序员的主要精力放在线程同步互斥的逻辑处理上。因此,通过练习PV操作能快速有效提高程序员对多线程的逻辑思维能力,达到强化“内功”的目的

 

接下来就来几道简单的计算机考研真题。

 

第一题 放水果 南京大学计算机考研真题

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

这个题目涉及的东西非常之多,光人物就有三个再加水果,盘子等等,确实让人感觉好像无从下手。但不管题目如何变,只要牢牢的抓住同步和互斥来分析问题就必定能迎刃而解。

下面先考虑同步情况即所有“等待”情况:

第一.爸爸要等待盘子为空。

第二.儿子要等待盘中水果是桔子。

第三.女儿要等待盘中水果是苹果。

接下来来考虑要互斥处理的资源,看起来盘子好像是要作互斥处理的,但由于题目中的爸爸、儿子、女儿均只有一个,并且他们访问盘子的条件都不一样,所以他们根本不会同时去访问盘子,因此盘子也就不用作互斥处理了。分析至些,这个题目已经没有难度了,下面用PV原语给出答案:

先设置三个信号量,信号量Orange表示盘中有桔子,初值为0。信号量Apple表示盘中有苹果,初值为0。信号量EmptyDish表示盘子为空,初值为1。三个人的操作流程如下所示:

1.爸爸

P(EmptyDish)

if (rand()%2==0)

{   

    放桔子

    V(Orange)

}

else

{

    放苹果

    V(Apple)

}

 

2.儿子

P(Orange)

取桔子

V(EmptyDish)

 

3.女儿

P(Apple)

取苹果

V(EmptyDish)

 

 

第二题 安全岛 南开大学考研真题

在南开大学至天津大学间有一条弯曲的路,每次只允许一辆自行车通过,但中间有小的安全岛M(同时允许两辆车),可供两辆车在已进入两端小车错车,设计算法并使用P,V实现。

 

这个问题应该如何考虑了?同样只要牢牢的抓住同步和互斥来分析问题就必定能迎刃而解。

考虑所有“等待”情况:

在路口N准备从N到T的人应该什么时候进入了?如果他只判断道路K上有没有人肯定是不行的,因为如果安全岛M上已经有2个人,那么路口N和路口T再各进一人,肯定会造成死锁。因此可以这样——在路口N准备从N到T的人要等待与他同方向的人已经到达T,如果此人已经到达T,且道路K上没有人,他必定可以上路了。同理在路口T准备从T到N的人也应该这样做。

再考虑互斥情况:

路上每次只允许一辆自行车通过,所以道路是需要作互斥处理的。

 

分析之后,下面就用PV原语给出答案(考研辅导书上的答案):

设置信号量NT表示在路口N且从N到T方向上允许出发的自行车数量,初值为1。信号量TN表示在路口T且从T到N方向上允许出发的自行车数量,初值为1。信号量K和L表示道路,初值均为1。这样从N到T的车和从T到N的车的行驶流程如下:

从N到T的车                     从T到N的车

P(NT)                P(TN)

P(K)                 P(L)

由N到M               由T到M

V(K)                 V(L)

P(L)                 P(K)

由M到T               由M到T

V(L)                 V(K)

V(NT)                V(TN)

 

这个题目的解法有很多,比如还可以用信号量M来记录安全岛M上空位个数,初值为2。每个进入道路前的人都要先预订安全岛上的空位,订到后再互斥的进入道路。否则就要等待安全岛上有空位。信号量K和L表示道路,初值均为1。然后从N到T的车和从T到N的车的行驶流程如下:

从N到T的车                     从T到N的车

P(M)                 P(M)

P(K)                 P(L)

由N到M               由T到M

V(K)                 V(L)

P(L)                 P(K)

V(M)                 V(M)

由M到T               由M到T

V(L)                 V(K)

 

这种解决方法也是不会造成死锁的。安全岛的解法非常之多,网上还有不少不同的解法,有兴趣的童鞋可以搜索一下。

 

下一篇将讲解更难的一道PV操作题,欢迎大家参阅。

转载于:https://www.cnblogs.com/dengyungao/p/7504036.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/257464.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

两离散序列卷积matlab,离散序列卷积和(用matlab实现)

数字信号处理实验报告实验一离散时间序列卷积和MATLAB实现(一)实验目的:学会用MATLAB对信号与系统分析的方法,理解离散序列卷积和的计算对进行离散信号与系统分析的重要性。(二)实验原理:1、离散时间序列f1(k)和f2(k)的卷积和定义&#xff1a…

linux命令学习-4-lsof

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。 在终端下输入lsof即可显示系统打开的文件&#xff…

IOS6+ 下,使用position:sticky实现粘性布局

回顾一下 开通博客之后,潦草的写了几篇,之后由于没时间,加上文笔不好等等(好吧,都是借口),基本上就没怎么写过了,其实平时也做了一些记录,但就是犯懒,没有去整…

SQL游标使用方法SQL游标使用方法(转)

1. 为何使用游标:    使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式。用SQL语言从数据库中检索数据后,结果放在内存的一块区域中,且结果往往是一个含有多个记录的集合。游标机制允许用户在SQL server内逐行地访问…

matlab铣削,基于MATLAB的微细铣削力分析

2010年 12月第 38卷 第 23期 机床与液压 MACH INE TOOL & HYDRAUL ICS Dec2010Vol38 No123DO I: 10. 3969 / jissn11001 - 38812010231037 收稿日期 : 2009 - 11 - 05 作者简介 : 张卫锋 (1978—) , 男 , 讲师 , 研究领域为机器人技术、仿真技术、特种加工。电话: 13656487…

软件测试作业——三

作业见《软件测试基础》中文版49页第7题。英文版63页 a) b) 令MAXPRIMES 4,t1不能检查出错误,t2发生数组越界,使得t2比t1更容易发现。 c)t3(n1) d)节点覆盖:TR{1,2,3,4,5&#xff0…

细说Java主流日志工具库

目录 概述  java.util.logging (JUL)  Log4j  Logback  Log4j vs Logback  common-logging  slf4j  common-logging vs slf4j  总结实施日志解决方案  引入jar包    slf4j直接绑定日志组件    slf4j兼容非slf4j日志组件    spring 集成 slf4j  …

SQL2008使用json.net实现XML与JSON互转

借助CLR&#xff0c;首先实现字符串的互转&#xff0c;然后使用存储过程实现JSON2table public class JsonFunction { /// <summary> /// XML转JSON /// </summary> /// <param name"xml"></param> /// <returns></returns> ///…

黑胡桃木php,揭秘美国黑胡桃木的美

家具是艺术和文化的载体&#xff0c;人们对木的喜爱&#xff0c;是一种与生俱来的情怀。好的木材淳厚质朴、温润坚定&#xff0c;有着不动声色的力量。美国黑胡桃木(亦称黑核桃木)便是如此&#xff0c;“身体”中散发着让人无法抗拒的魅力&#xff01;美国黑胡桃木体现的是“深…

c mysql备份还原数据库,MySQL数据库备份与恢复方法

常有新手问我该怎么备份数据库&#xff0c;下面介绍3种备份数据库的方法&#xff1a;(1)备份数据库文件MySQL中的每一个数据库和数据表分别对应文件系统中的目录和其下的文件。在Linux下数据库文件的存放目录一般为/var/lib/mysql。在Windows下这个目录视MySQL的安装路径而定&a…

第四篇:白话tornado源码之褪去模板外衣的前戏

加班程序员最辛苦&#xff0c;来张图醒醒脑吧&#xff01; ... ... ... 好了&#xff0c;醒醒吧&#xff0c;回归现实看代码了&#xff01;&#xff01; 执行字符串表示的函数&#xff0c;并为该函数提供全局变量 本篇的内容从题目中就可以看出来&#xff0c;就是为之后剖析tor…

生活常识

雷雨天野外要关手机 温汉华介绍&#xff0c;雷雨天&#xff0c;山顶空旷处容易遭雷电袭击。 他同时提醒&#xff0c;若游客在山上游览时&#xff0c;遭遇到电闪雷鸣的暴雨天气时&#xff0c;一定要注意以下事项&#xff1a; 其一&#xff0c;关停自己的手机。 其二&#xff0c;…

主程序分析法MATLAB编程,专题五  概率统计问题的Matlab求解

【实验目的及要求】I&#xff0e;熟练掌握Matlab编程中常见概率分布的概率密度、概率分布、逆分布、均值和方差等语句的调用格式&#xff0c;学会用Matlab对服从各种分布的样本进行参数估计和假设检验。对实际问题&#xff0c;能够进行样本的分析&#xff0c;得出服从哪种分布的…

LFS(Linux From Scratch)学习

一、环境准备 使用Debian平台&#xff0c;需做如下环境检查&#xff1a; 1、检查各个需要的工具及内核版本号&#xff0c;看看是否符合lfs7.7的列表要求 2、检查需要用到的库&#xff0c;一共有三个&#xff0c;gmp, mpfr和mpc 工具检查脚本如下&#xff1a; #filename:check_e…

腾讯云 Centos 配置 JDK Tomcat Mysql

配置JDK 从 oracle 官网下载 rpm 版本的 jdk 包,官方链接:点击此处跳转。下载jdk的时候记得看一看自己的系统是 64 位还是 32 位的&#xff0c;下对应的版本。下载好以后上传到腾讯云服务器中,命令格式为 scp &#xff3b;文件路径] &#xff3b;云主机用户名ip地址]:[服务器上…

php 取url根域名,php中取得URL的根域名的代码

/*** 取得根域名** author lonely* create 2011-3-11* version 0.1* lastupdate lonely* package Sl*/class Sl_RootDomain{private static $self;private $domainnull;private $hostnull;private $state_domain;private $top_domain;/*** 取得域名分析实例* Enter description…

如何创建sequence

我用的是在oracle中的方法&#xff0c;在oracle中sequence就是所谓的序列号&#xff0c;每次取的时候它会自动增加&#xff0c;一般用在需要按序列号排序的地方。 1、Create Sequence 你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限&#xff0c; CREATE SEQUENCE SI_E…

简易版jQuery——mQuery

前面的话 虽然jQuery已经日渐式微&#xff0c;但它里面的许多思想&#xff0c;如选择器、链式调用、方法函数化、取赋值合体等&#xff0c;有的已经变成了标准&#xff0c;有的一直影响到现在。所以&#xff0c;jQuery是一个伟大的前端框架。前端世界日新月异&#xff0c;由于实…

LaTeX 安装配置 OSX

LaTeX 安装配置 OSX官方网站&#xff1a;http://www.latex-project.orghttp://www.tug.org/mactex/http://pages.uoregon.edu/koch/BasicTeX.pdf完整的Tex超过2G&#xff0c;一般用户没必要&#xff0c;可以先安装BasicTeX&#xff0c;当有需要时include必要的库即可1.安装Basi…

php 正三角塔,PHP 环境塔建与数据类型转换

手动塔建PHP开发环境安装php c:\apps\php安装apache c:\apps\apache1.配制apache配制c:\apps\apache\conf\httpd.confDocumentRoot"c:/apps/www" //指定工作目录,WWW为自已创健Directoryindex index.php index.html // 加入:loadModule php5_module "c:\apps\PH…