




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn)二進(jìn)程同步一、實(shí)驗(yàn)?zāi)康模赫莆栈镜耐剿惴?,理解?jīng)典進(jìn)程同步問題的本質(zhì);學(xué)習(xí)使用Lmux的進(jìn)程同步機(jī)制, 掌握相關(guān)API的使用方法;能利用信號量機(jī)制,采用多種同步算法實(shí)現(xiàn)不會發(fā)生死鎖的訴 學(xué)家進(jìn)餐程序。二、實(shí)驗(yàn)平臺:虛擬機(jī):VMWaie9以上操作系統(tǒng):Ubuntu 12.04以上編輯器:Gedit | Vim編譯器:Gcc三、實(shí)驗(yàn)內(nèi)容:(1)以哲學(xué)家進(jìn)餐模型為依據(jù),在Linux控制臺環(huán)境下創(chuàng)建5個(gè)進(jìn)程,用semget函數(shù)創(chuàng) 建一個(gè)信號量集(5個(gè)信號量,初值為1),模擬訶學(xué)家的思考和進(jìn)餐行為:每一位哲學(xué)家饑 餓時(shí),先拿起左手筷子,再拿起右手筷子;筷子是臨界資源,為每一支筷子定義1個(gè)互斥信 號
2、量;想拿到筷子需要先對信號量做P操作,使用完釋放筷子對信號量做V操作。 偽代碼描述:semaphore chopstick5= 14,1,1,1;第1位行學(xué)家的活動(dòng)可描述為:doprmtf(n%d is thinkingn”,i);prmtf(n%d is hungry*JiH,i);wait(chopstick 訂);拿左筷子wait(chopstick (i+l)%5);拿右筷子piinttf%d is 亡adngn”,i);signal(chopstick i);放左筷子signal(chopstick (i+l)%5);放右筷子 while tme;運(yùn)行該組進(jìn)程,觀察進(jìn)程是否能一直運(yùn)行
3、下去,若停滯則發(fā)生了什么現(xiàn)象?并分析原因。(2)解決哲學(xué)家進(jìn)餐問題可采用如下方法:a.僅當(dāng)哲學(xué)家的左、右兩只筷子均可用時(shí), 才允許他拿起筷子進(jìn)餐:b.至多只允許有4位竹學(xué)家同時(shí)去拿左邊的筷子,最終能保證至少 有一位哲學(xué)家能夠進(jìn)餐;c.規(guī)定奇數(shù)號哲學(xué)家先拿起他左手的筷子,然后再拿起他右手的筷 子,而偶數(shù)號哲學(xué)家則先拿起他右手的筷子,然后再拿起他左手的筷子。方法a在示例程序 中給出,請用方法b和c寫出不會發(fā)生死鎖的竹學(xué)家進(jìn)餐程序。(3)設(shè)計(jì)程序,實(shí)現(xiàn)生產(chǎn)者/消費(fèi)者進(jìn)程(線程)的同步與互斥。在該程序中創(chuàng)建4個(gè)進(jìn)程 (或線程)模擬生產(chǎn)者和消費(fèi)者,實(shí)現(xiàn)進(jìn)程(線程)的同步與互斥。實(shí)驗(yàn)結(jié)果:使用a方法結(jié)果訴
4、學(xué)家就餐問題whtcmisswhtentss:/Deslctop$ gee a.c:a whtcmisswhtenissViftuelBox:/Desktop$ /a 0 is thinking4 is thinking3 is thinking2 ts thinking1 is thinking3 is hungry4 is hungry1 is hungry4 is eating2 is hungry0 ts hungry4 is thinking3 is eating3 is thinking2 ts eating4 is hungry2 is thinking1 ts eating3
5、is hungry1 is thinking0 is eating2 ts hungry使用b方法解決訶學(xué)家就餐問題源碼如下:include include include include include include include include include include include include union semun iiit val;stmct semid_ds *buf;unsigned short *anay;stmct semuifo *_buf;#define ERR_EXIT(m) do perror(m); exit(EXIT_FAILURE); wlule
6、(O)獲取互斥信號量void wait_mutex(mt mutex)stmct sembuf sb=O,-l,O;semop(mutex,&sb,l);對互斥信號量進(jìn)行操作 取得筷子void wait_v(int seinid.iiit num)stmct sembuf sb=nunK-l,0;semop(seimd,&sbj);釋放筷子void signal_p(int semid,mt num)stmct sembuf sb=numJ,0; semop(seimd,&sbj);釋放互斥變量mutexvoid signaLmutex(int senudO)stmct sembuf sb=0
7、丄0; semop(senudO.&sb); /pli函數(shù)void ph(int numjnt senud.mt senudO) mt left=num; mt iight=(num+l)%5;血(;)printf(M%d is thuikingii,num);sleep(l);printf(M%d is hungrySJum);sleep(l);/wait操作,控制哲學(xué)家最多4人能進(jìn)餐wait_mutex(senudO);wait_v(senud,left);wait_v(senud,iight);printf(M%d is eatmgii,num);sleep(l);/signal 操作s
8、ignal_p(seimd.nglit);釋放右筷子 signal_p(semid. left);/釋放左快子 signal_mutex(senudO);/釋放互斥信號量主函數(shù)mtaigc.chai *argv)mt semidsenudO;創(chuàng)建兩個(gè)信號量集semidO=semget(IPC_PRIXTE, 1 JPC.CREAT | 0666); seinid=semget(IPC_PRIATE?5.IPC_CREAT | 0666);/union semun su;su.val=l;inti;fbr(i=0;i5;i+)/semctlQ系統(tǒng)調(diào)用在一個(gè)信號量集(或集合中的單個(gè)信號量)上執(zhí)行各
9、種控制操作 seme tl(s 亡 mid 丄 SETVAL, su);設(shè)定senudO信號量的初始值union semun suO;su0.val=4;semctl(seinidO.O.SETVAL,suO);創(chuàng)建4個(gè)子進(jìn)程iiit num=0;pid_t pid;fbr(i=l;i5;i+)pid=forkQ;if(pid0) ERR_EXITC,fbrkM); if(pid=O) num=i;break:第num個(gè)竹學(xué)家要做的事ph(num,senud,senudO);return 0;執(zhí)行結(jié)果whtcmisswhtcmlss/itu3lBox:/Dskt:op$ gcc b.c b w
10、htcntsswhtcmtss-VIrtualBox:-/Desktops ./b 0 is thinking4 is thinking3 Is thinking2 is thinking1 is thinking0 is hungry4 is hungry3 ts hungry2 is hungry1 is hungry0 is eoting2 is eating0 ts thinking4 is eating2 is thinking1 is eating0 is hungry4 Is thinking3 is eating2 is hungry1 is thinking使用c方法解決訶學(xué)
11、家就餐問題#include #include #include #include #include #include #include #include #include #include #include #include Junion semuniiit val;stmct semid_ds *buf; unsigned short *airay;stmct semuifo *_buf;;define ERR_EXIT(m) dopenor(m); exit(EXIT_FAILURE); wliile(O)取得筷子void wait_v(int seiiud.iiit num)stmct
12、sembuf sb=miml,0;semop(num.&sb, 1);釋放筷子void signal_p(iiit semid,mt num)stmct sembuf sb=miml,0;semop(num.&sb, 1);科學(xué)家要做的事void ph(int senud.mt num)for(;) 死循壞判斷哲學(xué)家的編號是奇數(shù)還是偶數(shù)奇數(shù)先申請左邊的筷子,偶數(shù)先申請右邊的筷子if(num%2!=0)/判斷奇數(shù)printf(M%cl is thuikuigiiM jium);sleep(l);printf(M%cl is hungiyji,num);sleep(l);/wait操作wait_v
13、(senudaium);wait_v(senud,(num+printf(M%cl is eatmgkiinum);sleep(l);/signal 操作signal_p(seinid.(num+1 )%5); signal_p(seiiud4ium); if(num%2=0) 判斷偶數(shù)printfCd is thuikniguinum); sleep(l);printf(M%cl is hungiyu,num); sleep(l);/wait操作 wait_v(senud,(num+ wait_v(senudaium);/signal 操作 signal_p(senud4ium);signa
14、l_p(seiiud.(num+1 )%5);mt mam(mt aigcchai *argv)mt semid;創(chuàng)建5個(gè)信號量seinid=semget(IPC_PRIATE,5,IPC_CREAT | 0666); union semun su;su.val=l;inti;fbr(i=0;i5;i+)注意第二個(gè)參數(shù)也是索引 semctl(senudd,SETAL,su); 創(chuàng)建4個(gè)子進(jìn)程pid_t pid;mt num=5; fbr(i=0;i4;i+)pid=fbrkQ;if(pid0) ERR_EXIT(HfbrkH); if(pid=O) num=i;break;哲學(xué)家要做的事ph(
15、sennd4ium);return 0;ISISISISISISISISISis tsISISTSISISxs-virtuaIBox:-/Desktops gcc c.c o c -VtrtualBox:/D”ltop$ /cthinking thinking thinking thinking thinking hungry hungry hungry hungry hungry eating thinking eating eating thinking hungry thinking thinking hungry thinking生產(chǎn)者和消費(fèi)者的同步與互斥源代碼如下:include i
16、nclude include include include defineN 2/消費(fèi)者或者生產(chǎn)者的數(shù)目define M 10 /緩沖數(shù)目mtm = 0;/生產(chǎn)者放置產(chǎn)品的位置mt out = 0; /消費(fèi)者取產(chǎn)品的位置mt bufftM = 0;/緩沖初始化為0,開始時(shí)沒有產(chǎn)品sem_t empty_sem; /同步信號量,當(dāng)滿了時(shí)阻止生產(chǎn)者放產(chǎn)品 sem_t fblLsem; /同步信號量,當(dāng)沒產(chǎn)品時(shí)阻止消費(fèi)者消費(fèi) ptluead_mutex_t mutex; /互斥信號量,一次只有一個(gè)線程訪問緩沖 mt produced = 0; 生產(chǎn)者 idint prochase.id = 0; /
17、消費(fèi)者 id/*打印緩沖情況*/void priiit()int i;fbr(i = 0; i M; i+)pnntff%d ”, buffli);pnntf(HnM);/*生產(chǎn)者方法*/void *productQint id = +pioduct_id;while(l)/用sleep的數(shù)量可以調(diào)節(jié)生產(chǎn)和消費(fèi)的速度,便于觀察 sleep(l);/sleep(l);senvwait(&einpty_sem); ptluead_mutex_lock (&mutex);ill = ill % M;pimtf(nproduct%d in %d. like: tH, id. in);pnntO;ptl
18、uead_mutex_unlock (&mutex); sem_post(&hill_sum);/*消費(fèi)者方法/void *prochase()int id = +prochase_id;wlule(l)/用sleep的數(shù)量可以調(diào)節(jié)生產(chǎn)和消費(fèi)的速度,便于觀察 sleep ;/sleep ;sem_wait(&fbll_s 亡 m); ptluead_mutex_lock (&mutex);out = out % M;printf(,procliase%d in %d. like: f id, out);buyout = 0; pnntO; +out;ptluead_mutex_unlock (
19、&mutex);sem_post(&empty_s 亡 m);mtptluead_t idlN;ptluead_t id2N;inti;int retN;/初始化同步信號量int ini! = sem_init(&亡mpty_sem, 0, M);int ini2 = sem_init(&full_sem. 0、0);& iiii2 != 0)piintfpsem uut failed iin);exit(l);/初始化互斥信號量int ini3 = ptlnead_mutex_iiiit (& mutex. NULL);if(iiii3 != 0)priiitf(nmutex init failedexit(l);/創(chuàng)建N個(gè)生產(chǎn)者線程fbr(i = 0; i N; i+)reti = ptluead-create(NULL, product, (void *)(&i);if(ieti != 0)pimtHMpioduct%d creation foiled i); exit(l);創(chuàng)建N個(gè)消費(fèi)者線程fbr(i = 0; i N; i+)reti = ptluead-create(&id2i, NULL, prochase, NULL);if(ie
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度休閑餐飲店員工勞動(dòng)聘請服務(wù)協(xié)議
- 2025年度足浴店品牌授權(quán)及連鎖經(jīng)營權(quán)轉(zhuǎn)讓協(xié)議
- 二零二五年度黃金抵押貸款還款計(jì)劃合同
- 2025年度智慧醫(yī)療合伙開店合同
- 二零二五年度商場場地租賃與物業(yè)租賃服務(wù)合同
- 二零二五年度教育行業(yè)委托擔(dān)保服務(wù)協(xié)議
- 二零二五年度貨車運(yùn)輸合伙人風(fēng)險(xiǎn)共擔(dān)合作協(xié)議合同
- 2025年法人變更背景下的股權(quán)轉(zhuǎn)讓協(xié)議書
- 江西省水務(wù)集團(tuán)有限公司2024年勞務(wù)派遣人員招聘【34人】筆試參考題庫附帶答案詳解
- 2025西安數(shù)據(jù)資產(chǎn)經(jīng)營有限責(zé)任公司招聘筆試參考題庫附帶答案詳解
- 水利工程施工驗(yàn)收規(guī)范對工程監(jiān)理單位的要求
- 生豬行業(yè)pest分析
- 五年級上冊小數(shù)乘除練習(xí)300道及答案
- 《新概念英語第二冊》電子書、單詞、筆記、練習(xí)冊(附答案)匯編
- Midea美的F50-22DE5(HEY)電熱水器說明書
- 實(shí)驗(yàn)室生物安全與個(gè)人防護(hù)課件
- 學(xué)校心理健康教育的目標(biāo)體系課件
- 功能材料-智能材料
- 科普甲狀腺結(jié)節(jié)課件
- 合同智能審核與風(fēng)險(xiǎn)預(yù)警
- SG-400140型火電廠鍋爐中硫煙煤煙氣噴霧干燥法脫硫+袋式除塵系統(tǒng)設(shè)計(jì)
評論
0/150
提交評論