進程互斥經典問題(讀寫者問題、理發店問題)

目錄

讀寫者問題

問題描述

問題分析

進程互斥問題三部曲

讀者寫者算法實現

一、找進程——確定進程關系

二、找主營業務

三、找同步約束

a.互斥

b.資源?

c.配額?

理發店問題?

問題描述

問題分析

進程互斥問題三部曲

理發店問題算法實現

一、找進程——確定進程關系

?二、找主營業務

?三、找同步約束

a.資源

b.互斥?

c.配額?

總結


讀寫者問題

問題描述

有一個許多進程共享的數據區。有一些只讀取這個數據區的進程(Reader)和一些只往數據區寫數據的進程(Writer)。現在要寫一個程序,保證這些進程的運行是安全的。

問題分析

分析問題可以發現以下這些要點:

1、讀者進程彼此可以同時訪問共享數據區

2、讀者和寫者進程不可以同時訪問共享數據區

3、寫者進程彼此不可以同時訪問共享數據區

進程互斥問題三部曲

任何進程互斥(PV問題)都可以按照以下三步思考(來源:山東大學高曉程老師)

一、找進程——確定進程關系

二、找主營業務——拋開互斥,確定每個進程的主要任務

三、找同步約束

  1. 互斥
  2. 資源(計數信號量、空閑空間信號量等)
  3. 限額

讀者寫者算法實現

接下來,我們按照上面三部曲的思路來實現這個PV經典算法

一、找進程——確定進程關系

進程有兩類:1、讀者進程;2、寫者進程

進程關系如下:

1、讀者寫者是互斥的

2、寫者之間是互斥的

3、讀者之間不是互斥的

二、找主營業務

讀者進程的主營業務就是:讀取reading

寫者進程的主營業務就是:寫入writing

(此時不考慮任何同步約束~~)

代碼如下:

//寫者進程
writer(){while(1){writing;}
}//讀者進程
reader(){while(1){reading;}
}

三、找同步約束

a.互斥

互斥約束:1、找到臨界區;2、互斥變量緊貼臨界區

在上面程序的基礎上增加互斥約束,如下:

//寫者進程
writer(){while(1){wait(rwmutex);writing;signal(rwmutex);}
}//讀者進程
reader(){while(1){wait(mutex);if(count==0){wait(rwmutex);}count++;signal(mutex);reading;wait(mutex);count--;if(count==0)signal(rwmutex);signal(mutex);}
}

關鍵點:

1、讀者可以一起讀取文件,但是讀者和寫者不能一起訪問資源區。這表明如果沒有讀者訪問,此時有一個讀者想要訪問資源區,他需要和寫者競爭這個資源。一旦這個讀者開始讀取后,其他讀者可以直接讀取,不需要互斥訪問。———需要一個讀者和寫者之間的互斥量rwmutex。

2、?由于只有第一個讀者需要去競爭rwmutex,所以需要一個格外的變量count去記錄目前有幾個讀者。

3、又由于count變量對于多個讀者進程來說又是共享的變量(臨界區),所以需要另外一個互斥量mutex去約束讀者進程對count變量的訪問

b.資源?

資源視角主要包括有界緩存問題的計數信號量、先后執行問題的同步信號量等。本題顯然沒有這兩個信號量的約束,所以這邊資源視角沒有新的代碼修改。

但是資源視角是一個萬能視角,我們可以從資源視角來看上面的互斥:

1、rwmutex是訪問資源,第一個讀者進程需要和眾多寫者進程去競爭。只有競爭成功才可以進一步操作

2、對count的訪問也是一種讀者進程間的訪問資源,只有每個讀者進程競爭到了這個資源,才可以訪問count變量,對變量進行修改

c.配額?

配額僅僅在特殊的進程互斥問題上才需要考慮,本題中并沒有對配額進行限制。后續有遇到配額約束,我們再展開說說。


理發店問題?

問題描述

理發店里有一位理發師、一把理發椅和 n 把供等候理發的顧客坐的椅子。如果沒有顧客,理發師便在理發椅上睡覺;當一個顧客到來時,它必須叫醒理發師;如果理發師正在理發時又有顧客來到,那么,如果有空椅子可坐,顧客就坐下來等待,否則就離開理發店。

問題分析

1、只有n把顧客坐的等待椅子,一旦椅子滿了,新顧客就離開

2、理發椅子只有一個

3、沒有客人理發師就睡覺,客人來了理發師才理發

進程互斥問題三部曲

任何進程互斥(PV問題)都可以按照以下三步思考(來源:山東大學高曉程老師)

一、找進程——確定進程關系

二、找主營業務——拋開互斥,確定每個進程的主要任務

三、找同步約束

  1. 互斥
  2. 資源(計數信號量、空閑空間信號量等)
  3. 限額

理發店問題算法實現

一、找進程——確定進程關系

兩個進程:1、理發師進程;2、顧客進程

1、理發師和顧客進程存在先后關系,顧客來了理發師才理發

2、顧客進程之間存在互斥關系,理發椅只有一張

3、顧客進程存在上限,一旦超過上限便不再添加

?二、找主營業務

理發師:叫號+理發

顧客:取號+被理發

//理發師進程
Server(){while(1){叫號;理發;
}//顧客進程
Customer(){while(1){取號;被理發;
}

?三、找同步約束

a.資源

顧客來了,給理發師釋放一個資源;理發師理完發,給顧客們釋放一種資源。所以這里需要兩個資源customer、server:

//默認先對信號量操作,再進行實際操作
//理發師進程
Server(){while(1){wait(customer);叫號;  //減少一個顧客數,訪問臨界區signal(server);理發;
}//顧客進程
Customer(){while(1){取號;  //增加一個顧客數(可能失敗,所以signal在后面),訪問臨界區signal(customer);wait(server)被理發;
}

只有n把顧客坐的等待椅子,一旦椅子滿了,新顧客就離開。所以這里需要共享變量waiting,來記錄等待的顧客數目:

//默認先對信號量操作,再進行實際操作
//理發師進程
Server(){while(1){wait(customer);叫號;  //減少一個顧客數,訪問臨界區waiting--;  //減少一個等待顧客數,訪問臨界區signal(server);理發;
}//顧客進程
Customer(){while(1){if(waiting<n){取號;  //增加一個顧客數(可能失敗,所以signal在后面),訪問臨界區signal(customer);wait(server)被理發;}else{離店;}
}
b.互斥?

對所有臨界區的變量加上互斥鎖

//默認先對信號量操作,再進行實際操作
//理發師進程
Server(){while(1){wait(customer);wait(mutex);叫號;  //減少一個顧客數,訪問臨界區waiting--;  //減少一個等待顧客數,訪問臨界區signal(mutex);signal(server);理發;}
}//顧客進程
Customer(){while(1){wait(mutex);  //這個wait同樣也是保護if語句,所以在后面else結束if語句時也需要signalif(waiting<n){取號;  //增加一個顧客數(可能失敗,所以signal在后面),訪問臨界區waiting++;signal(mutex);signal(customer);wait(server)被理發;}else{signal(mutex);離店;}}
}
c.配額?

配額僅僅在特殊的進程互斥問題上才需要考慮,本題中并沒有對配額進行限制。后續有遇到配額約束,我們再展開說說。


總結

本文到這里就結束啦~~有時間我們再來進入其他的經典進程互斥算法
如果覺得對你有幫助,辛苦友友點個贊哦~

知識來源:操作系統概念(黑寶書)、山東大學高曉程老師PPT及課上講解。不要私下外傳

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/18110.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/18110.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/18110.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

SB-OSC,最新的 MySQL Schema 在線變更方案

目前主流的 MySQL 在線變更方案有兩個&#xff1a; 基于 trigger 的 pt-online-schema-change基于 binlog 的 gh-ost 上周 Sendbird 剛開源了他們的 MySQL Schema 在線變更方案 SB-OSC: Sendbird Online Schema Change。 GitHub 上剛剛 25 顆星星&#xff0c;絕對新鮮出爐。 …

Qt Creator(2)【如何在Qt Creator中創建新工程】

閱讀導航 引言一、Qt Creator開始界面介紹二、如何在Qt Creator中創建新工程1. 新建項目2. 選擇項目模板3. 選擇項目路徑4. 選擇構建系統5. 填寫類信息設置界面6. 選擇語言和翻譯文件7. 選擇Qt套件8. 選擇版本控制系統9. 最終效果 三、認識Qt Creator項目內容界面1. 基本界面2.…

React Native 之 處理觸摸事件(八)

React Native 提供了可以處理常見觸摸手勢&#xff08;例如點擊或滑動&#xff09;的組件&#xff0c; 以及可用于識別更復雜的手勢的完整的手勢響應系統。 Button是一個簡單的跨平臺的按鈕組件。下面是一個最簡示例&#xff1a; <ButtononPress{() > {Alert.alert(你點…

go語言初識別(五)

本博客內容涉及到&#xff1a;切片 切片 1. 切片的概念 首先先對數組進行一下回顧&#xff1a; 數組定義完&#xff0c;長度是固定的&#xff0c;例如&#xff1a; var num [5]int [5]int{1,2,3,4,5}定義的num數組長度是5&#xff0c;表示只能存儲5個整形數字&#xff0c…

檢索模型預訓練方法:RetroMAE

論文title&#xff1a;https://arxiv.org/pdf/2205.12035RetroMAE: Pre-Training Retrieval-oriented Language Models Via Masked Auto-Encoder 論文鏈接&#xff1a;https://arxiv.org/pdf/2205.12035 摘要 1.一種新的MAE工作流&#xff0c;編碼器和解器輸入進行了不同的掩…

華為OD機試【計算最接近的數】(java)(100分)

1、題目描述 給定一個數組X和正整數K&#xff0c;請找出使表達式X[i] - X[i1] … - X[i K 1]&#xff0c;結果最接近于數組中位數的下標i&#xff0c;如果有多個i滿足條件&#xff0c;請返回最大的i。 其中&#xff0c;數組中位數&#xff1a;長度為N的數組&#xff0c;按照元…

軟件性能測試有哪些測試類型和方法?

軟件性能測試是一種通過模擬真實用戶使用情況&#xff0c;評估軟件系統在各種壓力和負載下的表現的測試方法。在今天這個講究效率的時代&#xff0c;軟件性能測試是不可或缺的一環。它能幫助開發人員和企業發現潛在的性能問題&#xff0c;提前優化改進&#xff0c;保證軟件系統…

Flutter 中的 SizeChangedLayoutNotifier 小部件:全面指南

Flutter 中的 SizeChangedLayoutNotifier 小部件&#xff1a;全面指南 在 Flutter 中&#xff0c;SizeChangedLayoutNotifier 是一種特殊的小部件&#xff0c;它用于監聽其子組件尺寸的變化。當子組件的大小發生變化時&#xff0c;SizeChangedLayoutNotifier 可以通知其他組件…

動態內存管理—C語言通訊錄

目錄 一&#xff0c;動態內存函數的介紹 1.1 malloc和free 1.2 calloc 1.3 realloc 1.4C/C程序的內存開辟 二&#xff0c;通訊錄管理系統 動態內存函數的介紹 malloc free calloc realloc 一&#xff0c;動態內存函數的介紹 1.1 malloc和free void* malloc (…

回文鏈表(快慢指針解法之在推進過程中反轉)

歸納編程學習的感悟&#xff0c; 記錄奮斗路上的點滴&#xff0c; 希望能幫到一樣刻苦的你&#xff01; 如有不足歡迎指正&#xff01; 共同學習交流&#xff01; &#x1f30e;歡迎各位→點贊 &#x1f44d; 收藏? 留言?&#x1f4dd;抱怨深處黑暗&#xff0c;不如提燈前行…

進程間通信IPC機制

進程間通信&#xff08;IPC&#xff0c;InterProcess Communication&#xff09;是指在不同進程之間傳播或交換信息。IPC機制有多種方式&#xff0c;每種方式都有其特定的工作原理、應用場景以及優缺點。以下是對幾種主要IPC方式的詳細解釋&#xff1a; 管道&#xff08;Pipe&a…

數據結構算法題day04

數據結構算法題day04 題目分析算法思想代碼完整運行代碼如下&#xff1a; 題目 對長度為n的順序表L&#xff0c;編寫一個時間復雜度為O(n)、空間復雜度為O(1)的算法 該算法刪除線性表中所有值為X的數據元素。分析 O(n) -> 掃描一次順序表 O(1) -> 申請常數個輔助空間 1…

代碼隨想錄算法訓練營day14|二叉樹的遞歸遍歷、二叉樹的迭代遍歷、二叉樹的統一迭代法

二叉樹的遞歸遍歷 首先需要明確的一點是&#xff0c;前序中序和后序在二叉樹的遞歸遍歷中的區別僅在于遞歸函數中操作的順序&#xff0c;前序是在遍歷一個節點的左右子樹前進行操作&#xff0c;中序是在遍歷一個節點的左子樹后進行操作再遍歷右子樹&#xff0c;而后序是在遍歷…

C++算術運算和自增自減運算

一 引言 表示運算的符號稱為運算符。 算術運算&#xff1b; 比較運算&#xff1b; 邏輯運算&#xff1b; 位運算&#xff1b; 1 算術運算 算術運算包括加、減、乘、除、乘方、指數、對數、三角函數、求余函數&#xff0c;這些都是算術運算。 C中用、-、*、/、%分別表示加、減…

【AI】AI框架項目OpenWebUI如何追加模型

【背景】 openWebUI是一個非常好用的AI框架項目&#xff0c;既可以用API形式連接各類外部AI模型&#xff0c;也可以直接連接服務器硬盤上部署的離線大模型。 簡單來說&#xff0c;OpenWebUI可以用來方便地把你的本地模型變為可供所有內網人員使用的SAAS服務站點&#xff0c;并…

《當微服務遇上Ribbon:一場負載均衡的華麗舞會》

在微服務的廚房里&#xff0c;如何確保每一道服務都恰到好處&#xff1f;揭秘Spring Cloud Ribbon如何像大廚一樣精心調配資源&#xff0c;讓負載均衡變得像烹飪藝術一樣簡單&#xff01; 文章目錄 Spring Cloud Ribbon 詳解1. 引言微服務架構中的負載均衡需求Spring Cloud Rib…

【算法實戰】每日一題:設計一個算法,用最少數量的矩形覆蓋一系列寬度為d、高度為w的矩形,且使用矩形不能超出邊界

題目 設計一個算法&#xff0c;用最少數量的矩形覆蓋一系列寬度為d、高度為w的矩形建筑物側墻&#xff0c;且矩形不能超出邊界。 核心思路 考慮這種結構 前面遞增后面一個與前面的某個高度一致&#xff0c;這時候考慮最下面的覆蓋&#xff08;即都是從最下面向上覆蓋&#…

redis數據類型set,zset

華子目錄 Set結構圖相關命令sdiff key1 [key2]sdiffstore destination key1 [key2...]sinter key1 [key2...]sinterstore destination key1 [key2...]sunion key1 [key2...]sunionstore destination key1 [key2...]smove source destination memberspop key [count]sscan key c…

Java GC問題排查的一些個人總結和問題復盤

個人博客 Java GC問題排查的一些個人總結和問題復盤 | iwts’s blog 是否存在GC問題判斷指標 有的比較明顯&#xff0c;比如發布上線后內存直接就起飛了&#xff0c;這種也是比較好排查的&#xff0c;也是最多的。如果單純從優化角度&#xff0c;看當前應用是否需要優化&…

探索旅行的優惠之選,千益暢行旅游卡讓旅程更省心省力!

在旅行的道路上&#xff0c;一張旅游卡往往能為您帶來意想不到的便利與優惠。那么&#xff0c;對于千益暢行旅游卡&#xff0c;您是否好奇如何輕松擁有它呢&#xff1f; 首先&#xff0c;千益暢行旅游卡作為旅行者的貼心伴侶&#xff0c;為您提供了多樣化的獲取渠道。您可以通…