多線程面試題系列(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.pswp.cn/news/257464.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257464.shtml
英文地址,請注明出處:http://en.pswp.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…