![實驗二進程同步實驗_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/e1121701-b5f5-4b17-aeac-7bc17918f63f/e1121701-b5f5-4b17-aeac-7bc17918f63f1.gif)
![實驗二進程同步實驗_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/e1121701-b5f5-4b17-aeac-7bc17918f63f/e1121701-b5f5-4b17-aeac-7bc17918f63f2.gif)
![實驗二進程同步實驗_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/e1121701-b5f5-4b17-aeac-7bc17918f63f/e1121701-b5f5-4b17-aeac-7bc17918f63f3.gif)
![實驗二進程同步實驗_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/e1121701-b5f5-4b17-aeac-7bc17918f63f/e1121701-b5f5-4b17-aeac-7bc17918f63f4.gif)
![實驗二進程同步實驗_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/9/e1121701-b5f5-4b17-aeac-7bc17918f63f/e1121701-b5f5-4b17-aeac-7bc17918f63f5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上實驗二 進程同步一、實驗?zāi)康模赫莆栈镜耐剿惴?,理解?jīng)典進程同步問題的本質(zhì);學(xué)習(xí)使用Linux的進程同步機制,掌握相關(guān)API的使用方法;能利用信號量機制,采用多種同步算法實現(xiàn)不會發(fā)生死鎖的哲學(xué)家進餐程序。二、實驗平臺:虛擬機:VMWare12操作系統(tǒng):kali linux編輯器:Gedit 編譯器:Gcc三、實驗內(nèi)容:(1)以哲學(xué)家進餐模型為依據(jù),在Linux控制臺環(huán)境下創(chuàng)建5個進程,用semget函數(shù)創(chuàng)建一個信號量集(5個信號量,初值為1),模擬哲學(xué)家的思考和進餐行為:每一位哲學(xué)家饑餓時,先拿起左手筷子,再拿起右手筷子;筷子是臨界資源,為每一支筷子定義1個互斥信號
2、量;想拿到筷子需要先對信號量做P操作,使用完釋放筷子對信號量做V操作。偽代碼描述:semaphore chopstick5=1,1,1,1,1; 第i位哲學(xué)家的活動可描述為: do printf(%d is thinkingn,i); printf(%d is hungryn,i); wait(chopsticki); /拿左筷子 wait(chopstick(i+1) % 5); /拿右筷子 printf(%d is eatingn,i); signal(chopsticki); /放左筷子 signal(chopstick(i+1) % 5); /放右筷子 whiletrue; 運行該組進
3、程,觀察進程是否能一直運行下去,若停滯則發(fā)生了什么現(xiàn)象?并分析原因。(2)解決哲學(xué)家進餐問題可采用如下方法:a.僅當(dāng)哲學(xué)家的左、右兩只筷子均可用時,才允許他拿起筷子進餐;b.至多只允許有4位哲學(xué)家同時去拿左邊的筷子,最終能保證至少有一位哲學(xué)家能夠進餐;c.規(guī)定奇數(shù)號哲學(xué)家先拿起他左手的筷子,然后再拿起他右手的筷子,而偶數(shù)號哲學(xué)家則先拿起他右手的筷子,然后再拿起他左手的筷子。方法a在示例程序中給出,請用方法b和c寫出不會發(fā)生死鎖的哲學(xué)家進餐程序。 (3)設(shè)計程序,實現(xiàn)生產(chǎn)者/消費者進程(線程)的同步與互斥。在該程序中創(chuàng)建4個進程(或線程)模擬生產(chǎn)者和消費者,實現(xiàn)進程(線程)的同步與互斥。四、實驗
4、步驟:一、Linux的信號量機制為了簡化對多個信號量的操作,Linux系統(tǒng)中提出了信號量集的概念。一個信號量集對象中可以容納多個信號量,System V 信號量的分配和操作是以信號量集為單位的。1. 進程利用信號量獲得共享資源的步驟:a.測試控制該資源的信號量;b.若信號量為正,則進程可以使用該資源;使用資源時,進程將該信號量減1(P操作);不再使用資源時,進程將該信號量值加1(V操作);c.若信號量為0,則進程進入睡眠狀態(tài)P操作和V操作都原子操作。2. 創(chuàng)建或打開信號量集semget()系統(tǒng)調(diào)用創(chuàng)建一個新信號量集或獲取一個既有信號量集的表示符。函數(shù)原型:#include int semget
5、(key_t key, int nsems, int flag);返回值:成功返回信號量集ID,出錯返回-1。nsems信號量集中信號量個數(shù);flags:IPC_CREAT,IPC_EXCL,權(quán)限組合;第一個參數(shù)key是整數(shù)值(唯一非零),不相關(guān)的進程可以通過它訪問一個信號量,它代表程序可能要使用的某個資源,程序?qū)λ行盘柫康脑L問都是間接的,程序先通過調(diào)用semget函數(shù)并提供一個鍵,再由系統(tǒng)生成一個相應(yīng)的信號標識符(semget函數(shù)的返回值),只有semget函數(shù)才直接使用信號量鍵,所有其他的信號量函數(shù)使用由semget函數(shù)返回的信號量標識符。如果多個程序使用相同的key值,key將負責(zé)協(xié)調(diào)
6、工作。第三個參數(shù)sem_flags是一組標志,當(dāng)想要當(dāng)信號量不存在時創(chuàng)建一個新的信號量,可以和值IPC_CREAT做按位或操作。設(shè)置了IPC_CREAT標志后,即使給出的鍵是一個已有信號量的鍵,也不會產(chǎn)生錯誤。而IPC_CREAT | IPC_EXCL則可以創(chuàng)建一個新的,唯一的信號量,如果信號量已存在,返回一個錯誤。注意:建立信號量集時每個信號量的初始值不確定。3. 信號量控制操作semctl()系統(tǒng)調(diào)用在一個信號量集或集合中的單個信號量上執(zhí)行各種控制操作。函數(shù)原型:#include int semctl (int semid, int semnum, int cmd, /*union sem
7、un arg*/)semnum:信號量編號或0,表示對指定信號量做控制操作;cmd: 操作命令,實施的控制操作;cmd參數(shù):IPC_STAT 獲取信號量集的屬性IPC_SET 設(shè)置信號量集的屬性IPC_RMID 刪除信號量集GETVAL 返回semnum信號量的值SETVAL 設(shè)置semnum信號量的值GETALL 獲取所有信號量的值SETALL 設(shè)置所有信號量的初始值第四個參數(shù)是union semununion semun int val; struct semid_ds *buf; unsigned short *array;例:定義一個信號量集,含3個信號量,初始值分別為(2,5,1)。
8、semid = semget(IPC_PRIVATE,3,IPC_CREAT|IPC_EXCL|0777);unsigned short vals3 = 2,5,1;union semnu se;se.array = vals;semclt(semid,0,SETALL,se);4. 信號量集操作semop()系統(tǒng)調(diào)用在semid標識的信號量集中的信號量上執(zhí)行一個或多個up或down操作,可用于進程間的同步和互斥。函數(shù)原型:#include int semop(int semid, struct sembuf *semop, size_t nops);返回:成功返回0,出錯返回-1。Struc
9、t sembufunsigned sem_num; /*member # in set*/short sem_op; /*operation(negative, 0, positive*/short sem_flg; /*IPC_NOWAIT,SEM_UNDO*/例:對上文定義的信號量集semid中的3個信號量,分別執(zhí)行如下操作:1: p(1); 2: p(3); 3: v(3);其semop的操作語句為:struct sembuf ops3 = 0, -1, SEM_UNDO, 1,-3, SEM_UNDO,2,3, SEM_UNDO;semop(semid, ops ,3);5.組合權(quán)限說
10、明0666 文件或目錄的所有者、所有者所在組、其他用戶對該對象均可讀、可寫rw-rw-rw-0777 文件或目錄的所有者、所有者所在組、其他用戶對該對象均可讀、可寫、可執(zhí)行rwxrwxrwx附:示例程序(左、右兩只筷子均可用時才允許拿起筷子)#include #include #include #include #include #include #include #include #include #include #include #include #ifdef_SEM_SEMUN_UNDEFINEDunion semunint val;struct semid_ds *buf;unsig
11、ned short *array;struct seminfo *_buf;#endif#defineERR_EXIT(m) do perror(m); exit(EXIT_FAILURE); while(0)int wait_1chopstick(int no,int semid)struct sembuf sb = no,-1,0;int ret;ret = semop(semid,&sb,1);if(ret 0) ERR_EXIT(semop);return ret;int free_1chopstick(int no,int semid)struct sembuf sb = no,1,
12、0;int ret;ret = semop(semid,&sb,1);if(ret 0) ERR_EXIT(semop);return ret;#defineDELAY (rand() % 5 + 1)void wait_for_2chopstick(int no,int semid)int left = no;int right = (no + 1) % 5;struct sembuf buf2 = left,-1,0,right,-1,0;semop(semid,buf,2);void free_2chopstick(int no,int semid)int left = no;int r
13、ight = (no + 1) % 5;struct sembuf buf2 = left,1,0,right,1,0;semop(semid,buf,2);void philosophere(int no,int semid)srand(getpid();for(;) #if 0printf(%d is thinkingn,no);sleep(DELAY);printf(%d is hungryn,no);wait_for_2chopstick(no,semid);printf(%d is eatingn,no);sleep(DELAY);free_2chopstick(no,semid);
14、#elseint left = no;int right = (no + 1) % 5;printf(%d is thinkingn,no);sleep(DELAY);printf(%d is hungryn,no);wait_1chopstick(left,semid);sleep(DELAY);wait_1chopstick(right,semid);printf(%d is eatingn,no);sleep(DELAY);free_1chopstick(left,semid); free_1chopstick(right,semid);#endifint main(int argc,char *argv)int semid;semid = semget(IPC_PRIVATE,5,IPC_CREAT | 0666);if(semid 0) ERR_EXIT(semid);u
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- R-YNT-3708-生命科學(xué)試劑-MCE-1793
- N-Butyl-Pentedrone-hydrochloride-生命科學(xué)試劑-MCE-8255
- Homarylamine-hydrochloride-生命科學(xué)試劑-MCE-8287
- 2025年度員工股份分配與業(yè)績考核協(xié)議
- 二零二五年度離婚財產(chǎn)協(xié)議-房產(chǎn)車輛資產(chǎn)分配
- 2025年度車輛外借責(zé)任免除及事故賠償協(xié)議
- 2025年度研學(xué)旅行文化體驗合同
- 二零二五年度炊事員餐飲業(yè)未來趨勢預(yù)測聘用合同
- 2025年度蛋糕店線上線下銷售渠道拓展合同
- 施工現(xiàn)場施工防生物災(zāi)害威脅制度
- 2024年全國現(xiàn)場流行病學(xué)調(diào)查職業(yè)技能競賽考試題庫-上部分(600題)
- 2025年中國鐵路設(shè)計集團有限公司招聘筆試參考題庫含答案解析
- (一模)晉城市2025年高三年第一次模擬考試 物理試卷(含AB卷答案解析)
- 實驗室5S管理培訓(xùn)
- 安徽省蚌埠市2025屆高三上學(xué)期第一次教學(xué)質(zhì)量檢查考試(1月)數(shù)學(xué)試題(蚌埠一模)(含答案)
- 醫(yī)院工程施工重難點分析及針對性措施
- 2025年春節(jié)安全專題培訓(xùn)(附2024年10起重特大事故案例)
- 2025年江蘇太倉水務(wù)集團招聘筆試參考題庫含答案解析
- 遼寧省沈陽名校2025屆高三第一次模擬考試英語試卷含解析
- 智研咨詢-2025年中國生鮮農(nóng)產(chǎn)品行業(yè)市場全景調(diào)查、投資策略研究報告
- 員工賠償金保密協(xié)議書(2篇)
評論
0/150
提交評論