山大操作系統(tǒng)實驗五_第1頁
山大操作系統(tǒng)實驗五_第2頁
山大操作系統(tǒng)實驗五_第3頁
山大操作系統(tǒng)實驗五_第4頁
山大操作系統(tǒng)實驗五_第5頁
已閱讀5頁,還剩16頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

山大操作系統(tǒng)實驗五山大操作系統(tǒng)實驗五山大操作系統(tǒng)實驗五xxx公司山大操作系統(tǒng)實驗五文件編號:文件日期:修訂次數(shù):第1.0次更改批準審核制定方案設(shè)計,管理制度山東大學(xué)軟件學(xué)院操作系統(tǒng)實驗報告實驗題目:進程互斥實驗實驗?zāi)康模哼M一步研究和實踐操作系統(tǒng)中關(guān)于并發(fā)進程同步與互斥操作的一些經(jīng)典問題的解法,加深對于非對稱性互斥問題有關(guān)概念的理解。觀察和體驗非對稱性互斥問題的并發(fā)控制方法。進一步了解Linux系統(tǒng)中IPC進程同步工具的用法,訓(xùn)練解決對該類問題的實際編程、調(diào)試和分析問題的能力。實驗要求:理發(fā)店問題:假設(shè)理發(fā)店的理發(fā)室中有3個理發(fā)椅子和3個理發(fā)師,有一個可容納4個顧客坐等理發(fā)的沙發(fā)。此外還有一間等候室,可容納13位顧客等候進入理發(fā)室。顧客如果發(fā)現(xiàn)理發(fā)店中顧客已滿(超過20人),就不進入理發(fā)店。在理發(fā)店內(nèi),理發(fā)師一旦有空就為坐在沙發(fā)上等待時間最長的顧客理發(fā),同時空出的沙發(fā)讓在等候室中等待時間最長的的顧客就坐。顧客理完發(fā)后,可向任何一位理發(fā)師付款。但理發(fā)店只有一本現(xiàn)金登記冊,在任一時刻只能記錄一個顧客的付款。理發(fā)師在沒有顧客的時候就坐在理發(fā)椅子上睡眠。理發(fā)師的時間就用在理發(fā)、收款、睡眠上。請利用linux系統(tǒng)提供的IPC進程通信機制實驗并實現(xiàn)理發(fā)店問題的一個解法??偨Y(jié)和分析示例實驗和獨立實驗中觀察到的調(diào)試和運行信息,說明您對與解決非對稱性互斥操作的算法有哪些新的理解和認識為什么會出現(xiàn)進程饑餓現(xiàn)象本實驗的饑餓現(xiàn)象是怎樣表現(xiàn)的怎樣解決并發(fā)進程間發(fā)生的饑餓現(xiàn)象您對于并發(fā)進程間使用消息傳遞解決進程通信問題有哪些新的理解和認識根據(jù)實驗程序、調(diào)試過程和結(jié)果分析寫出實驗報告。硬件環(huán)境:CPU:P4/內(nèi)存:256MB硬盤:10GB軟件環(huán)境:-Linux操作系統(tǒng)Gnome桌面'gccversionvigeditOpenOffice實驗步驟:問題分析假設(shè)理發(fā)店的理發(fā)室中有3個理發(fā)椅子和3個理發(fā)師,有一個可容納4個顧客坐等理發(fā)的沙發(fā)。此外還有一間等候室,可容納13位顧客等候進入理發(fā)室。顧客如果發(fā)現(xiàn)理發(fā)店中顧客已滿(超過20人),就不進入理發(fā)店。在理發(fā)店內(nèi),理發(fā)師一旦有空就為坐在沙發(fā)上等待時間最長的顧客理發(fā),同時空出的沙發(fā)讓在等候室中等待時間最長的的顧客就坐。顧客理完發(fā)后,可向任何一位理發(fā)師付款。但理發(fā)店只有一本現(xiàn)金登記冊,在任一時刻只能記錄一個顧客的付款。理發(fā)師在沒有顧客的時候就坐在理發(fā)椅子上睡眠。理發(fā)師的時間就用在理發(fā)、收款、睡眠上。算法設(shè)計說明該解法利用消息隊列的每條消息代表每個顧客,將進入等候室的顧客組織到一個隊列,將坐入沙發(fā)的顧客組織到另一個隊列。理發(fā)師從沙發(fā)隊列請出顧客,空出的沙發(fā)位置再從等候室請入顧客進入沙發(fā)隊列。三個理發(fā)師進程使用相同的程序段上下文,所有顧客使用同一個程序段上下文。這樣可避免產(chǎn)生太多進程,以便節(jié)省系統(tǒng)資源。intsem_p(intsemid,intindex,intipc_nowait){程間的互斥2.理發(fā)師類似讀者進程,顧客類似寫者進程。最后,通過不斷的調(diào)試,使我熟練了在Linux環(huán)境下編程的技巧,對進程的創(chuàng)建與控制更加熟悉。附錄A:本實驗全部程序源代碼及注釋#ifndefCZW_IPC_H_INCLUDED#defineCZW_IPC_H_INCLUDED#include<>#include<sys/>#include<sys/>intsem_create(constchar*pathname,intproj_id,intnsems,intinit_value){key_tkeyid;intsemid,i;if((keyid=ftok(pathname,proj_id))==-1){perror("ftokerror!");return-1;}if((semid=semget(keyid,nsems,IPC_CREAT|0666))<0){perror("semgeterror!");return-1;}for(i=0;i<nsems;i++){semctl(semid,i,SETVAL,init_value);}returnsemid;}intsem_delete(constchar*pathname,intproj_id){key_tkeyid;intsemid,i;if((keyid=ftok(pathname,proj_id))==-1){perror("ftokerror!");return-1;}if((semid=semget(keyid,0,0666))<0){perror("semgeterror!");return-1;}if(semctl(semid,0,IPC_RMID)<0){perror("semdeletefail!");return-1;}return1;}intsem_set(intsemid,intindex,intvalue){if(index==-1){,10);sem_delete(".",11);msg_delete(".",31);sem_delete(".",110);exit(0);}intmain(){intwait_semid=sem_create(".",10,3,0);intwait_lock_semid=sem_create(".",11,4,0);intwait_msg=msg_create(".",31);intcash_semid=sem_create(".",110,1,1);debug&&printf("\twait_semidis%d\n",wait_semid);debug&&printf("\twait_lock_semidis%d\n",wait_lock_semid);debug&&printf("\twait_msgis%d\n",wait_msg);debug&&printf("\tcash_semidis%d\n",cash_semid);sem_set(wait_semid,0,3);sem_set(wait_semid,1,4);sem_set(wait_semid,2,13);pid_tpid[3]={0};inti;intbarber_id,barber_status,barber_consumer;structex5msgbufmsg;for(i=0;i<3;i++){if((pid[i]=fork())<0){perror("forkerror!");exit(EXIT_FAILURE);}elseif(pid[i]==0){barber_id=i+1;barber_status=0;debug&&printf("\tI'mbarber%d,mypidis%d\n",barber_id,getpid());break;}}if(pid[2]==0){while(1){if(barber_status==0){if(sem_p(wait_lock_semid,0,1)==-2){,10,0,0);intwait_lock_semid=sem_create(".",11,0,0);intwait_msg=msg_create(".",31);debug&&printf("\twait_semidis%d\n",wait_semid);debug&&printf("\twait_lock_semidis%d\n",wait_lock_semid);debug&&printf("\twait_msgis%d\n",wait_msg);debug&&printf("\twait_semid_0is%d\n",sem_show(wait_semid,0));pid_tpid=0;structex5msgbufmsg;inti;intconsumer_status;if((pid=fork())<0){perror("forkerror!");exit(EXIT_FAILURE);}elseif(pid==0){//childprocesswhile(1){sem_p(wait_lock_semid,1,0);//等待沙發(fā)上有人sem_p(wait_semid,0,0);//等待理發(fā)師有空if(msg_get(wait_msg,&msg,WAIT_ID_SOFA,0)<0){perror("messagegeterror!");exit(-1);}msg_send(wait_msg,WAIT_ID_CHAIR,,0);printf("theconsumer%d==>chair,wait%dseconds\n",,(time(NULL)-);//sofa==>chairsem_v(wait_semid,1,0);//沙發(fā)上有空位了sem_v(wait_lock_semid,0,0);//通知有人來理發(fā)了}return0;}if((pid=fork())<0){perror("forkerror!");exit(EXIT_FAILURE);}elseif(pid==0){//childprocesswhile(1){sem_p(wait_lock_semid,2,0);//等待室內(nèi)有人sem_p(wait_semid,1,0);//沙發(fā)上有空位if(msg_get(wait_msg,&msg,WAIT_ID_ROOM,0)<0){perror("messagegeterror!");exit(-1);}msg_send(wait_msg,WAIT_ID_SOFA,,0);printf("theconsumer%d==>sofa,wait%dseconds\n",,(time(NULL)-);//room==>sofasem_v(wait_semid,2,0);//等待室空出1個位子sem_v(wait_lock_semid,1,0);//通知沙發(fā)上有人了}return0;}while(1){if((pid=fork())<0){perror("forkerror!");exit(EXIT_FAILURE);}elseif(pid==0){//if((consumer_status=sem_p(wait_semid,2,1))==-2){//檢查理發(fā)店(等待室)是否已滿printf("我是顧客%d,理發(fā)店滿了,我走人了。。。\n",getpid());//full}elseif(consumer_status==0){//仍然有空間

溫馨提示

  • 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)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論