计算机操作系统专题一:多道环境下进程同步与互斥制约关系的学习
1. 問題描述
設(shè)自行車生產(chǎn)線上有一只箱子,其中有N個位置(N≥3),每個位置可存放一個車架或一個車輪,又設(shè)有三名工人,其活動分別為:
2. 問題分析(包括涉及的知識點、制約關(guān)系分析、問題的解決思路等)
? 根據(jù)題目意義分析,該題所述作業(yè)工人1、工人2與工人3構(gòu)成生產(chǎn)者與消費者關(guān)系,存在著生產(chǎn)者-消費者問題的同步關(guān)系,涉及的知識點包括:信號量、PV原語、進程同步、死鎖問題等。
? 問題解決思路:
? 用信號量與PV操作實現(xiàn)三個工人的合作,首先不考慮死鎖問題,工人1與工人3、工人2與工人3構(gòu)成生產(chǎn)者與消費者關(guān)系,這兩對生產(chǎn)-消費關(guān)系通過共同的緩沖區(qū)——箱子相聯(lián)系。從資源的角度來看,箱子中的空位置相當于工人1和工人2的資源,而車架和車輪相當于工人3的資源。定義三個信號量empty(空位置數(shù)量)、frame(車架數(shù)量)、wheel(車輪數(shù)量)來實現(xiàn)這種同步關(guān)系,分析會產(chǎn)生什么問題:
semaphore empty = N;//空位置數(shù)量 semaphore frame = 0;//車架數(shù)量 semaphore wheel = 0;//車輪數(shù)量do{ //工人1活動 P(empty); 加工一個車架; 車架放入箱中; V(frame); }while(1)do{ //工人2活動 P(empty); 加工一個車輪; 車輪放入箱中; V(wheel); }while(1)do{ //工人3活動 P(frame); P(wheel); P(wheel); 箱中取一個車架; 箱中取一個車架; 組裝一臺車; V(empty); V(empty); V(empty); }while(1)? 分析易見,當工人1加工速度較快時,箱中空位置可能完全被車架占滿或只留有一個存放車輪的位置,而當此時工人3同時取2個車輪時將無法得到,而工人2又無法將新加工的車輪放入箱中;當工人2加工速度較快時,箱中空位置可能完全被車輪占滿,而當此時工人3取車架時將無法得到,而工人1又無法將新加工的車架放入箱中。上述兩種情況都意味著死鎖的發(fā)生。為防止死鎖的發(fā)生,箱中車架的數(shù)量不可超過N-2,車輪的數(shù)量不可超過N-1,這些限制可以添加另外兩個信號量maxframe(箱中最大車架數(shù))、maxwheel(箱中最大車輪數(shù))來解死鎖產(chǎn)生問題,解決方案如下。
3. 解決方案(包括所用工具介紹、方案流程圖、方案偽代碼等)
方案偽代碼如下:
semaphore empty = N;//空位置數(shù)量 semaphore maxframe = N-2;//箱中最大車架數(shù)量 semaphore maxwheel = N-1;//箱中最大車輪數(shù)量 semaphore frame = 0;//車架數(shù)量 semaphore wheel = 0;//車輪數(shù)量do{ //工人1活動P(maxframe); P(empty); 加工一個車架; 車架放入箱中; V(frame); }while(1)do{ //工人2活動P(maxwheel); P(empty); 加工一個車輪; 車輪放入箱中; V(wheel); }while(1)do{ //工人3活動 P(frame); P(wheel); P(wheel); 箱中取一個車架; 箱中取一個車架; 組裝一臺車; V(maxframe); V(maxwheel); V(maxwheel); V(empty); V(empty); V(empty); }while(1)工具介紹:
所用工具為jBACI,該工具包有自己的編譯器和解釋器,源代碼有編譯器編譯,再解釋執(zhí)行,類似于java,該工具可以在windows10系統(tǒng)下直接運行。程序編寫有“.cm”和“.pm”兩種格式,“.cm”格式和C語言、C++相似,內(nèi)置一些圖形函數(shù),具體可以參照docs文件夾下的說明書和examples文件夾下的范例來學習使用,使用前需要更改內(nèi)部配置文件config.cfg文件,修改內(nèi)容為:
SOURCE_DIRECTORY=.\examples\
PASCAL_COMPILER=.\bin\bapas.exe
C_COMPILER=.\bin\bacc.exe
(下載地址:https://github.com/motib/jbaci)
代碼編寫好后,需要點擊Compile進行編譯,才能夠點擊Run執(zhí)行,進入執(zhí)行頁面可以看到有代碼執(zhí)行區(qū)、控制臺、全局變量區(qū)等,可以對代碼Add添加斷點,可以step單步執(zhí)行,點擊Go執(zhí)行后還可以很好看清各個進程的詳細執(zhí)行情況和各個變量的數(shù)值變化。
總之,jBACI是用來學習計算機操作系統(tǒng)進程同步與互斥制約關(guān)系的一個相當友好而且實用的工具。
方案示意流程圖如下:
方案具體實現(xiàn)代碼如下:
4.實驗結(jié)果分析(包括結(jié)果展示、結(jié)果原因剖析等)
結(jié)果展示:
? 左邊結(jié)果顯示,工人1率先停下工作,工人2其次,工人3最后完成工作,右邊結(jié)果顯示,箱中車架數(shù)frame和車輪數(shù)wheel為0,箱中空位置數(shù)empty復位為6,最大可容納車架數(shù)maxframe和最大可容納車輪數(shù)maxwheel復位,生產(chǎn)出的車架數(shù)、車輪數(shù)、車輛數(shù)正好達到所設(shè)期望值,不超出也沒減少,而且程序執(zhí)行過程中并沒有發(fā)出“A deadlock occured”的死鎖警告。
結(jié)果原因剖析:
? 該結(jié)果符合預期,成功避免了死鎖發(fā)生。原因一是新添了兩個信號量最大可容納車架數(shù)maxframe和最大可容納車輪數(shù)maxwheel,阻止了生產(chǎn)中出現(xiàn)的工人1或2加工過快導致箱中無法湊齊一輛車必要部件的死鎖情況,原因二是通過設(shè)置生產(chǎn)車量的期望值來給每個工人一個工作結(jié)束條件,避免了工人1或2其中一個率先結(jié)束工作時工人3未結(jié)束工作但因一個部件缺少而一直等待,另一工人也等待工人3拿走箱中部件才能繼續(xù)加工的死鎖情況。
總結(jié)
以上是生活随笔為你收集整理的计算机操作系统专题一:多道环境下进程同步与互斥制约关系的学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: esp32cam与下载板的实际有效接线图
- 下一篇: 格兰因果模型可以分析哪些东西_如何系统地