版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、-. z.實驗二 進程同步一、實驗?zāi)康模赫莆崭镜耐剿惴ǎ斫饨?jīng)典進程同步問題的本質(zhì);學(xué)習(xí)使用Linu*的進程同步機制,掌握相關(guān)API的使用方法;能利用信號量機制,采用多種同步算法實現(xiàn)不會發(fā)生死鎖的哲學(xué)家進餐程序。二、實驗平臺:虛擬機:VMWare9以上操作系統(tǒng):Ubuntu12.04以上編輯器:Gedit | Vim編譯器:Gcc三、實驗容:1以哲學(xué)家進餐模型為依據(jù),在Linu*控制臺環(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é)家的活動可描述為: doprintf(%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、否能一直運行下去,假設(shè)停滯則發(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)進程(線程)的同步與互斥。實驗結(jié)果:使用a方法結(jié)果哲學(xué)家就
4、餐問題使用b方法解決哲學(xué)家就餐問題源碼如下:#include #include #include #include #include #include #include #include #include #include #include #include union semunint val;struct semid_ds *buf;unsigned short *array;struct seminfo *_buf;#define ERR_E*IT(m) do perror(m); e*it(E*IT_FAILURE); while(0)/獲取互斥信號量void wait_mute*(i
5、nt mute*)struct sembuf sb=0,-1,0;semop(mute*,&sb,1);/對互斥信號量進展操作/取得筷子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);/釋放互斥變量mute*void signal_mute*(int semid0)struct sembuf sb=0,1,0;semop(semid0
6、,&sb,1);/ph函數(shù)void ph(int num,int semid,int 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人能進餐wait_mute*(semid0);wait_v(semid,left);wait_v(semid,right);printf(%d is eatingn,num);sleep(1);/signal操作signal_p(semid,ri
7、ght);/釋放右筷子signal_p(semid,left);/釋放左快子signal_mute*(semid0);/釋放互斥信號量/主函數(shù)int main(int argc,char *argv)int semid,semid0;/創(chuàng)立兩個信號量集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;i5;i+)/semctl()系統(tǒng)調(diào)用在一個信號量集(或集合中的單個信號量)上執(zhí)行各種控
8、制操作semctl(semid,i,SETVAL,su);/設(shè)定semid0信號量的初始值union semun su0;su0.val=4;semctl(semid0,0,SETVAL,su0);/創(chuàng)立4個子進程int num=0;pid_t pid;for(i=1;i5;i+)pid=fork();if(pid0) ERR_E*IT(fork);if(pid=0) num=i;break;/第num個哲學(xué)家要做的事ph(num,semid,semid0);return 0;執(zhí)行結(jié)果使用c方法解決哲學(xué)家就餐問題#include #include #include #include #incl
9、ude #include #include #include #include #include #include #include union semunint val;struct semid_ds *buf;unsigned short *array;struct seminfo *_buf;#define ERR_E*IT(m) do perror(m); e*it(E*IT_FAILURE); while(0)/取得筷子void wait_v(int semid,int num)struct sembuf sb=num,-1,0;semop(num,&sb,1);/釋放筷子void
10、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é)家的編號是奇數(shù)還是偶數(shù)/奇數(shù)先申請左邊的筷子,偶數(shù)先申請右邊的筷子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
11、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,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
12、)int semid;/創(chuàng)立5個信號量semid=semget(IPC_PRIVATE,5,IPC_CREAT | 0666);union semun su;su.val=1;int i;for(i=0;i5;i+)/注意第二個參數(shù)也是索引semctl(semid,i,SETVAL,su);/創(chuàng)立4個子進程pid_t pid;int num=5;for(i=0;i4;i+)pid=fork();if(pid0) ERR_E*IT(fork);if(pid=0) num=i;break;/哲學(xué)家要做的事ph(semid,num);return 0;生產(chǎn)者和消費者的同步與互斥源代碼如下:#incl
13、ude #include #include #include #include #define N 2 / 消費者或者生產(chǎn)者的數(shù)目#define M 10 / 緩沖數(shù)目int in = 0; / 生產(chǎn)者放置產(chǎn)品的位置int out = 0; / 消費者取產(chǎn)品的位置int buffM = 0; / 緩沖初始化為0, 開場時沒有產(chǎn)品sem_t empty_sem; / 同步信號量, 當(dāng)滿了時阻止生產(chǎn)者放產(chǎn)品sem_t full_sem; / 同步信號量, 當(dāng)沒產(chǎn)品時阻止消費者消費pthread_mute*_t mute*; / 互斥信號量, 一次只有一個線程訪問緩沖int product_id =
14、 0; /生產(chǎn)者idint prochase_id = 0; /消費者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) / 用sleep的數(shù)量可以調(diào)節(jié)生產(chǎn)和消費的速度,便于觀察 sleep(1); /sleep(1); sem_wait(&empty_sem); pthread_mute*_lock(&mute*); in = in % M; printf(product
15、%d in %d. like: t, id, in); buffin = 1; print(); +in; pthread_mute*_unlock(&mute*); sem_post(&full_sem); /* 消費者方法 */void *prochase()int id = +prochase_id;while(1) / 用sleep的數(shù)量可以調(diào)節(jié)生產(chǎn)和消費的速度,便于觀察 sleep(1);/sleep(1); sem_wait(&full_sem); pthread_mute*_lock(&mute*); out = out % M; printf(prochase%d in %d.
16、 like: t, id, out); buffout = 0; print(); +out; pthread_mute*_unlock(&mute*); sem_post(&empty_sem);int main()pthread_t id1N;pthread_t id2N;int i;int retN;/ 初始化同步信號量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); e*it(1); /初
17、始化互斥信號量 int ini3 = pthread_mute*_init(&mute*, NULL);if(ini3 != 0) printf(mute* init failed n); e*it(1); / 創(chuàng)立N個生產(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); e*it(1); /創(chuàng)立N個消費者線程for(i = 0; i N; i+) reti = pthread_create(&id2i, NULL, prochase, NULL); if(reti != 0) printf(prochase%d creation failed n, i); e*it(1); /銷毀線程for(i = 0; i N; i+) pthread_join(id1i,NULL); pthread_join(i
溫馨提示
- 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 臨床氨甲苯酸、氨基己酸、氨甲環(huán)酸等止血藥適應(yīng)癥、用法、不良反應(yīng)、禁忌癥等區(qū)別及藥理作用
- 2024果樹采購合同
- 2025高考生物備考說課稿:免疫失調(diào)與免疫學(xué)的應(yīng)用說課稿
- 2024融資合同范本:新能源汽車產(chǎn)業(yè)專項協(xié)議3篇
- 專屬2024學(xué)校系列校服訂購協(xié)議
- 2024液化氣運輸合同能源消耗與減排責(zé)任規(guī)范文本3篇
- 專業(yè)咨詢顧問合作合同(2024年度版)版
- 福建省南平市松溪縣鄭墩中學(xué)高二語文月考試題含解析
- 12坐井觀天(說課稿)2024-2025學(xué)年統(tǒng)編版語文二年級上冊
- 1-1《子路、曾皙、冉有、公西華侍坐》說課稿-2024-2025學(xué)年高一語文下學(xué)期同步說課稿(統(tǒng)編版必修下冊)
- 人教版(2024新版)七年級上冊生物期末復(fù)習(xí)全冊知識點提綱
- 期末達標(biāo)測試卷(二)(試卷)-2024-2025學(xué)年冀教版數(shù)學(xué)四年級上冊
- 2024-2030年中國干燥設(shè)備行業(yè)研發(fā)創(chuàng)新狀況及發(fā)展行情監(jiān)測報告
- GB/T 44413-2024城市軌道交通分類
- GB 19041-2024光氣及光氣化產(chǎn)品生產(chǎn)安全規(guī)范
- 拔除氣管導(dǎo)管的護理
- 2024年大學(xué)英語四六級考試大綱詞匯
- NB/T 11450-2023礦用隔爆型三相永磁同步電動滾筒
- 2024年山東省生態(tài)環(huán)境監(jiān)測專業(yè)技術(shù)人員大比武理論試題庫(含答案)
- GB 28008-2024家具結(jié)構(gòu)安全技術(shù)規(guī)范
- 消防技能訓(xùn)練-射水姿勢與形式課件講解
評論
0/150
提交評論