




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(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)程同步問(wè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è)互斥信
2、號(hào)量;想拿到筷子需要先對(duì)信號(hào)量做P操作,使用完釋放筷子對(duì)信號(hào)量做 V操作.偽代碼描述:semaphore chopstick5=1,1,1,1,1;? 第i位哲學(xué)家的活動(dòng)可描述為: doprintf("%d is thinking'n",i);printf("%d is hungryn",i);wait(chopstick i); 拿左筷子wait(chopstick (i+1) % 5);拿右筷子printf("%d is eatingn",i);signal(chopstick i );/放左筷子signal(chopst
3、ick (i+1) % 5 );/放右筷子whiletrue;運(yùn)行該組進(jìn)程,觀察進(jìn)程是否能一直運(yùn)行下去,假設(shè)停滯那么發(fā)生了什么現(xiàn)象?并分析原因.(2)解決哲學(xué)家進(jìn)餐問(wè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寫(xiě)出不會(huì)發(fā)生死鎖的哲學(xué)家進(jìn)餐程序.(3)設(shè)計(jì)程序,實(shí)現(xiàn)生產(chǎn)者/消費(fèi)者進(jìn)程(線程)的同步與互斥.在該程序
4、中創(chuàng)立4個(gè)進(jìn)程(或線程)模擬生產(chǎn)者和消費(fèi)者,實(shí)現(xiàn)進(jìn)程(線程)的同步與互斥.A方法:#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>#include <sys/ipc.h>#inc
5、lude <sys/sem.h>#include <sys/wait.h>#ifdef _SEM_SEMUN_UNDEFINED union semunint val;struct semid_ds *buf;unsigned short *array;struct seminfo *_buf;#endif#define ERR_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
6、;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,0;int ret;ret = semop(semid,&sb,1);if(ret < 0) ERR_EXIT("semop");return ret;#define DELAY (rand() % 5 + 1)void wait_for_2chopstick(int
7、 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 right = (no + 1) % 5;struct sembuf buf2 = left,1,0,right,1,0;semop(semid,buf,2);void philosophere(int no,int semid)srand(getpid()
8、;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);#elseint left = no;int right = (no + 1) % 5;printf("%d is thinkingn",no);sleep(DEL
9、AY);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);#endif)int main(int argc,char *argv口)(int semid;semid = semget(IPC_PRIVATE,5,IPC_C
10、REAT | 0666);if(semid < 0) ERR_EXIT("semid");)union semun su;su.val = 1;int i;for(i = 0;i < 5;+i) semctl(semid,i,SETVAL,su);)int num = 0;pid_t pid;for(i = 1;i < 5;+i) pid = fork();if(pid < 0) ERR_EXIT("fork");)if(0 = pid) num = i;break;)philosophere(num,semid); return
11、 0;)B方法:#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>#include <sys/ipc.h>#include <sys/sem.h>#include &l
12、t;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);對(duì)互斥信號(hào)量進(jìn)行操作/取得筷子void wait_v(int semid,int num)struct sem
13、buf 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,int semid0)int left=num;int right=(num+1)%5;for(;)printf(&
14、quot;%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);/ 釋放右筷子signal_p(semid,left);/ 釋放左快子signal_mutex(semid0)
15、; 釋放互斥信號(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í)行各種限制操作 semctl(semid,i,SETV AL,su);/設(shè)定semid0信號(hào)量的初始值union
16、semun su0;su0.val=4;semctl(semid0,0,SETV AL,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;heronaubuntu畤 gedtt b.c )eroHa0ubiintu;-n$ Isby mps mps*cheronaQubuntu:m/D< sktop/exan$
17、 gcc -o b b*u herona0ubuntun$ .,b 9 is thinking 2 is thirtktng 1 is thinking3 is thinking4 is thirtking9 is hungry2 ts hungry1 is hungry3 is hungry4 ts hungry0 is eating2 is eatingC 方法:#include <stdio.h>#include <stdlib.h>#include <string.h>#include <stdint.h>#include <std
18、bool.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 semunint val;struct semid_ds *buf;unsigned short *array;struct seminfo *_buf;#define ERR_EXIT(m) do
19、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);/科學(xué)家要做的事void ph(int semid,int num)for(;)/死循環(huán)判斷哲學(xué)家的編號(hào)是奇數(shù)還是偶數(shù)/奇數(shù)先申請(qǐng)左邊的筷子,偶數(shù)先申請(qǐng)右邊的筷子 if(num%2!=
20、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 操作signal_p(semid,(num+1)%5);signal_p(semid,num);if(num%2=0)判斷偶數(shù)printf("%d is thinkingn&q
21、uot;,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;/創(chuàng)立5個(gè)信號(hào)量semid=semget(IPC_PRIVATE,5,IPC_CREAT | 0666); union semun su;su.val=1;int i;for(
22、i=0;i<5;i+)(/注意第二個(gè)參數(shù)也是索引semctl(semid,i,SETV AL,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;Jun 6 02;00Activities 曰 Terminal -Qheromaubuntu: */Desktop/examFl 三 -heromafubuntu:5 gedtt c
23、 + cheronaubuntu: D ;k$ gcc -o c c,cheronaubuntu:$ ./co is thinkingS is thinking2 is thinking1 is thinking3 is thinkingG ts hungry4 is hungry5 ts hungryS is hungry1 is hunqrv生產(chǎn)者和消費(fèi)者的同步與互斥:#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <pthread.h>#include <
24、;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,開(kāi)始時(shí)沒(méi)有產(chǎn)品sem_t empty_sem; /同步信號(hào)量,當(dāng)滿了時(shí)阻止生產(chǎn)者放產(chǎn)品sem_t full_sem; /同步信號(hào)量,當(dāng)沒(méi)產(chǎn)品時(shí)阻止消費(fèi)者消費(fèi)pthread_mutex_t mutex; /互斥信號(hào)量,一次只有一個(gè)線程訪問(wèn)緩沖int product_id = 0; 生產(chǎn)者 idint prochase_id = 0; / 消費(fèi)者 i
25、d/*打印緩沖情況 */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)/用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 i
26、n %d. like: t", id, in);buffin = 1;print(); +in;pthread_mutex_unlock(&mutex); sem_post(&full_sem);/*消費(fèi)者方法*/void *prochase()(int id = +prochase_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("proc
27、hase%d in %d. like: t", id, out);buffout = 0;print();+out;pthread_mutex_unlock(&mutex);sem_post(&empty_sem);)int main()(pthread_t id1N;pthread_t id2N;int i;int retN;/初始化同步信號(hào)量int inil = sem_init(&empty_sem, 0, M);int ini2 = sem_init(&full_sem, 0, 0);if(ini1 && ini2 != 0)(
28、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 = pthread_create(&id1i, NULL, product, (void *)(&i); if(reti != 0)(printf("product%d creation failed n", i);exit(1);)/創(chuàng)立N個(gè)消費(fèi)者線程for(i = 0; i < N; i+)(reti = pthread_create(&id2i, NULL,
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 公共交通工具安全防護(hù)方案計(jì)劃
- 生物觀察實(shí)踐活動(dòng)方案計(jì)劃
- 倉(cāng)庫(kù)作業(yè)效率提升的案例分析計(jì)劃
- 肺癌合并肺栓塞護(hù)理
- 未來(lái)市場(chǎng)的年度工作應(yīng)對(duì)策略計(jì)劃
- 《貴州萬(wàn)勝恒通礦業(yè)有限責(zé)任公司習(xí)水縣溫水鎮(zhèn)吉華煤礦(變更)礦產(chǎn)資源綠色開(kāi)發(fā)利用方案(三合一)》評(píng)審意見(jiàn)
- 木林森品牌新形象
- Definitiontheability(英文版知識(shí)講義)
- 儲(chǔ)能鋰電池知識(shí)培訓(xùn)課件
- 內(nèi)蒙古開(kāi)魯縣高中生物 第四章 細(xì)胞的物質(zhì)輸入和輸出 4.1 物質(zhì)跨膜運(yùn)輸?shù)膶?shí)例 第一課時(shí)教學(xué)實(shí)錄 新人教版必修1
- 《痛經(jīng)的預(yù)防保健》課件
- 幼兒園三會(huì)一課會(huì)議記錄
- 2025年宜賓興文縣招考聘用社區(qū)專(zhuān)職工作者7人高頻重點(diǎn)提升(共500題)附帶答案詳解
- 公園物業(yè)管理安保服務(wù)投標(biāo)技術(shù)標(biāo)方案參考借鑒范本
- 《習(xí)近平法治思想概論(第二版)》 課件 3.第三章 習(xí)近平法治思想的實(shí)踐意義
- 中醫(yī)藥文化知識(shí)培訓(xùn)課件
- 2025中智集團(tuán)招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
- 二 20以內(nèi)的退位減法 第1課時(shí) 十幾減9課件2024-2025人教版一年級(jí)數(shù)學(xué)下冊(cè)
- 退役軍人創(chuàng)業(yè)扶持協(xié)議
- 養(yǎng)老院院感管理與應(yīng)急預(yù)案
- 湘教版七年級(jí)上冊(cè)數(shù)學(xué)期末考試試卷及答案
評(píng)論
0/150
提交評(píng)論