![實(shí)驗(yàn)二進(jìn)程同步實(shí)驗(yàn)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/4/f25d1954-2f83-4c2d-8c8f-55857eba47f8/f25d1954-2f83-4c2d-8c8f-55857eba47f81.gif)
![實(shí)驗(yàn)二進(jìn)程同步實(shí)驗(yàn)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/4/f25d1954-2f83-4c2d-8c8f-55857eba47f8/f25d1954-2f83-4c2d-8c8f-55857eba47f82.gif)
![實(shí)驗(yàn)二進(jìn)程同步實(shí)驗(yàn)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/4/f25d1954-2f83-4c2d-8c8f-55857eba47f8/f25d1954-2f83-4c2d-8c8f-55857eba47f83.gif)
![實(shí)驗(yàn)二進(jìn)程同步實(shí)驗(yàn)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/4/f25d1954-2f83-4c2d-8c8f-55857eba47f8/f25d1954-2f83-4c2d-8c8f-55857eba47f84.gif)
![實(shí)驗(yàn)二進(jìn)程同步實(shí)驗(yàn)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2022-3/4/f25d1954-2f83-4c2d-8c8f-55857eba47f8/f25d1954-2f83-4c2d-8c8f-55857eba47f85.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、實(shí)驗(yàn)二 進(jìn)程同步一、實(shí)驗(yàn)?zāi)康模赫莆栈镜耐剿惴?,理解?jīng)典進(jìn)程同步問題的本質(zhì);學(xué)習(xí)使用Linux的進(jìn)程同步機(jī)制,掌握相關(guān)API的使用方法;能利用信號(hào)量機(jī)制,采用多種同步算法實(shí)現(xiàn)不會(huì)發(fā)生死鎖的哲學(xué)家進(jìn)餐程序。二、實(shí)驗(yàn)平臺(tái):虛擬機(jī):VMWare9以上操作系統(tǒng):Ubuntu12.04以上編輯器:Gedit | Vim編譯器:Gcc三、實(shí)驗(yàn)內(nèi)容:(1)以哲學(xué)家進(jìn)餐模型為依據(jù),在Linux控制臺(tái)環(huán)境下創(chuàng)建5個(gè)進(jìn)程,用semget函數(shù)創(chuàng)建一個(gè)信號(hào)量集(5個(gè)信號(hào)量,初值為1),模擬哲學(xué)家的思考和進(jìn)餐行為:每一位哲學(xué)家饑餓時(shí),先拿起左手筷子,再拿起右手筷子;筷子是臨界資源,為每一支筷子定義1個(gè)互斥信號(hào)量;想拿
2、到筷子需要先對(duì)信號(hào)量做P操作,使用完釋放筷子對(duì)信號(hào)量做V操作。偽代碼描述:semaphore chopstick5=1,1,1,1,1; 第i位哲學(xué)家的活動(dòng)可描述為: 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
3、+1) % 5); /放右筷子 whiletrue; 運(yùn)行該組進(jìn)程,觀察進(jìn)程是否能一直運(yùn)行下去,若停滯則發(fā)生了什么現(xiàn)象?并分析原因。(2)解決哲學(xué)家進(jìn)餐問題可采用如下方法:a.僅當(dāng)哲學(xué)家的左、右兩只筷子均可用時(shí),才允許他拿起筷子進(jìn)餐;b.至多只允許有4位哲學(xué)家同時(shí)去拿左邊的筷子,最終能保證至少有一位哲學(xué)家能夠進(jìn)餐;c.規(guī)定奇數(shù)號(hào)哲學(xué)家先拿起他左手的筷子,然后再拿起他右手的筷子,而偶數(shù)號(hào)哲學(xué)家則先拿起他右手的筷子,然后再拿起他左手的筷子。方法a在示例程序中給出,請(qǐng)用方法b和c寫出不會(huì)發(fā)生死鎖的哲學(xué)家進(jìn)餐程序。 (3)設(shè)計(jì)程序,實(shí)現(xiàn)生產(chǎn)者/消費(fèi)者進(jìn)程(線程)的同步與互斥。在該程序中創(chuàng)建4個(gè)進(jìn)程(或
4、線程)模擬生產(chǎn)者和消費(fèi)者,實(shí)現(xiàn)進(jìn)程(線程)的同步與互斥。實(shí)驗(yàn)結(jié)果:使用a方法結(jié)果哲學(xué)家就餐問題使用b方法解決哲學(xué)家就餐問題源碼如下:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdint.h>#include <stdbool.h>#include <errno.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#incl
5、ude <sys/ipc.h>#include <sys/sem.h>#include <sys/wait.h>union semunint val;struct semid_ds *buf;unsigned short *array;struct seminfo *_buf;#define ERR_EXIT(m) do perror(m); exit(EXIT_FAILURE); while(0)/獲取互斥信號(hào)量void wait_mutex(int mutex)struct sembuf sb=0,-1,0;semop(mutex,&sb,1);
6、/對(duì)互斥信號(hào)量進(jìn)行操作/取得筷子void wait_v(int semid,int num)struct sembuf sb=num,-1,0;semop(semid,&sb,1);/釋放筷子void signal_p(int semid,int num)struct sembuf sb=num,1,0;semop(semid,&sb,1);/釋放互斥變量mutexvoid signal_mutex(int semid0)struct sembuf sb=0,1,0;semop(semid0,&sb,1);/ph函數(shù)void ph(int num,int semid,i
7、nt semid0)int left=num;int right=(num+1)%5;for(;)printf("%d is thinkingn",num);sleep(1);printf("%d is hungryn",num);sleep(1);/wait操作,控制哲學(xué)家最多4人能進(jìn)餐wait_mutex(semid0);wait_v(semid,left);wait_v(semid,right);printf("%d is eatingn",num);sleep(1);/signal操作signal_p(semid,right)
8、;/釋放右筷子signal_p(semid,left);/釋放左快子signal_mutex(semid0);/釋放互斥信號(hào)量/主函數(shù)int main(int argc,char *argv)int semid,semid0;/創(chuàng)建兩個(gè)信號(hào)量集semid0=semget(IPC_PRIVATE,1,IPC_CREAT | 0666);semid=semget(IPC_PRIVATE,5,IPC_CREAT | 0666);/union semun su;su.val=1;int i;for(i=0;i<5;i+)/semctl()系統(tǒng)調(diào)用在一個(gè)信號(hào)量集(或集合中的單個(gè)信號(hào)量)上執(zhí)行各種控
9、制操作semctl(semid,i,SETVAL,su);/設(shè)定semid0信號(hào)量的初始值union semun su0;su0.val=4;semctl(semid0,0,SETVAL,su0);/創(chuàng)建4個(gè)子進(jìn)程int num=0;pid_t pid;for(i=1;i<5;i+)pid=fork();if(pid<0) ERR_EXIT("fork");if(pid=0) num=i;break;/第num個(gè)哲學(xué)家要做的事ph(num,semid,semid0);return 0;執(zhí)行結(jié)果使用c方法解決哲學(xué)家就餐問題#include <stdio.h&
10、gt;#include <stdlib.h>#include <string.h>#include <stdint.h>#include <stdbool.h>#include <errno.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/ipc.h>#include <sys/sem.h>#include <sys/wait.h>union semunin
11、t val;struct semid_ds *buf;unsigned short *array;struct seminfo *_buf;#define ERR_EXIT(m) do perror(m); exit(EXIT_FAILURE); while(0)/取得筷子void wait_v(int semid,int num)struct sembuf sb=num,-1,0;semop(num,&sb,1);/釋放筷子void signal_p(int semid,int num)struct sembuf sb=num,-1,0;semop(num,&sb,1);/科
12、學(xué)家要做的事void ph(int semid,int num)for(;)/死循環(huán)/判斷哲學(xué)家的編號(hào)是奇數(shù)還是偶數(shù)/奇數(shù)先申請(qǐng)左邊的筷子,偶數(shù)先申請(qǐng)右邊的筷子if(num%2!=0)/判斷奇數(shù)printf("%d is thinkingn",num);sleep(1);printf("%d is hungryn",num);sleep(1);/wait操作wait_v(semid,num);wait_v(semid,(num+1)%5);printf("%d is eatingn",num);sleep(1);/signal操作si
13、gnal_p(semid,(num+1)%5);signal_p(semid,num);if(num%2=0)/判斷偶數(shù)printf("%d is thinkingn",num);sleep(1);printf("%d is hungryn",num);sleep(1);/wait操作wait_v(semid,(num+1)%5);wait_v(semid,num);/signal操作signal_p(semid,num);signal_p(semid,(num+1)%5);int main(int argc,char *argv)int semid;/
14、創(chuàng)建5個(gè)信號(hào)量semid=semget(IPC_PRIVATE,5,IPC_CREAT | 0666);union semun su;su.val=1;int i;for(i=0;i<5;i+)/注意第二個(gè)參數(shù)也是索引semctl(semid,i,SETVAL,su);/創(chuàng)建4個(gè)子進(jìn)程pid_t pid;int num=5;for(i=0;i<4;i+)pid=fork();if(pid<0) ERR_EXIT("fork");if(pid=0) num=i;break;/哲學(xué)家要做的事ph(semid,num);return 0;生產(chǎn)者和消費(fèi)者的同步與互
15、斥源代碼如下:#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <semaphore.h>#define N 2 / 消費(fèi)者或者生產(chǎn)者的數(shù)目#define M 10 / 緩沖數(shù)目int in = 0; / 生產(chǎn)者放置產(chǎn)品的位置int out = 0; / 消費(fèi)者取產(chǎn)品的位置int buffM = 0; / 緩沖初始化為0, 開始時(shí)沒有產(chǎn)品sem_t empty_sem; / 同步信號(hào)量, 當(dāng)滿了時(shí)阻止生產(chǎn)者放產(chǎn)品se
16、m_t full_sem; / 同步信號(hào)量, 當(dāng)沒產(chǎn)品時(shí)阻止消費(fèi)者消費(fèi)pthread_mutex_t mutex; / 互斥信號(hào)量, 一次只有一個(gè)線程訪問緩沖int product_id = 0; /生產(chǎn)者idint prochase_id = 0; /消費(fèi)者id/* 打印緩沖情況 */void print()int i;for(i = 0; i < M; i+) printf("%d ", buffi);printf("n");/* 生產(chǎn)者方法 */ void *product()int id = +product_id;while(1) / 用
17、sleep的數(shù)量可以調(diào)節(jié)生產(chǎn)和消費(fèi)的速度,便于觀察 sleep(1); /sleep(1); sem_wait(&empty_sem); pthread_mutex_lock(&mutex); in = in % M; printf("product%d in %d. like: t", id, in); buffin = 1; print(); +in; pthread_mutex_unlock(&mutex); sem_post(&full_sem); /* 消費(fèi)者方法 */void *prochase()int id = +procha
18、se_id;while(1) / 用sleep的數(shù)量可以調(diào)節(jié)生產(chǎn)和消費(fèi)的速度,便于觀察 sleep(1);/sleep(1); sem_wait(&full_sem); pthread_mutex_lock(&mutex); out = out % M; printf("prochase%d in %d. like: t", id, out); buffout = 0; print(); +out; pthread_mutex_unlock(&mutex); sem_post(&empty_sem);int main()pthread_t i
19、d1N;pthread_t id2N;int i;int retN;/ 初始化同步信號(hào)量int ini1 = sem_init(&empty_sem, 0, M); int ini2 = sem_init(&full_sem, 0, 0); if(ini1 && ini2 != 0) printf("sem init failed n"); exit(1); /初始化互斥信號(hào)量 int ini3 = pthread_mutex_init(&mutex, NULL);if(ini3 != 0) printf("mutex init failed n"); exit(1); / 創(chuàng)建N個(gè)生產(chǎn)者線程for(i = 0; i < N; i+) reti = pthrea
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度建筑工地施工現(xiàn)場(chǎng)綠化養(yǎng)護(hù)合同標(biāo)準(zhǔn)
- 2025年度工業(yè)地皮買賣合同風(fēng)險(xiǎn)評(píng)估與控制服務(wù)協(xié)議
- 金華浙江金華市婺城區(qū)三江街道社區(qū)衛(wèi)生服務(wù)中心招聘工作人員筆試歷年參考題庫附帶答案詳解
- 金華浙江金華義烏市中心醫(yī)院基建總務(wù)科非編人員招聘筆試歷年參考題庫附帶答案詳解
- 重慶2025年重慶文理學(xué)院招聘39人筆試歷年參考題庫附帶答案詳解
- 漯河2024年河南共青團(tuán)漯河市委所屬事業(yè)單位引進(jìn)高層次人才筆試歷年參考題庫附帶答案詳解
- 淄博2024年山東淄博機(jī)電工程學(xué)校招聘教師筆試歷年參考題庫附帶答案詳解
- 汕尾2025年廣東汕尾陸河縣第一批城鎮(zhèn)公益性崗位招聘筆試歷年參考題庫附帶答案詳解
- 杭州浙江杭州市上城區(qū)行政審批服務(wù)管理辦公室編外人員招聘筆試歷年參考題庫附帶答案詳解
- 2025年中國(guó)企業(yè)管理軟件市場(chǎng)調(diào)查研究報(bào)告
- 中國(guó)宗教文化 中國(guó)古代宗教文化的特點(diǎn)及現(xiàn)代意義
- 2024年四川省巴中市級(jí)事業(yè)單位選聘15人歷年高頻難、易錯(cuò)點(diǎn)練習(xí)500題附帶答案詳解
- 演出經(jīng)紀(jì)人培訓(xùn)
- 蓋房四鄰簽字協(xié)議書范文
- 2024年新人教版七年級(jí)上冊(cè)數(shù)學(xué)教學(xué)課件 第六章 幾何圖形初步 數(shù)學(xué)活動(dòng)
- 《新時(shí)代大學(xué)生勞動(dòng)教育》全套教學(xué)課件
- 2024簡(jiǎn)易租房合同下載打印
- 數(shù)字出版概論 課件 第八章 數(shù)字出版產(chǎn)品開發(fā)與分析
- 碼頭工程施工組織設(shè)計(jì)
- TBSES 001-2024 建設(shè)項(xiàng)目環(huán)境影響后評(píng)價(jià)技術(shù)指南 污染影響類
- 北師大版數(shù)學(xué)三年級(jí)下冊(cè)《分橘子》說課稿及反思(共二篇)
評(píng)論
0/150
提交評(píng)論