山東大學(xué)操作系統(tǒng)實(shí)驗(yàn)五_第1頁
山東大學(xué)操作系統(tǒng)實(shí)驗(yàn)五_第2頁
山東大學(xué)操作系統(tǒng)實(shí)驗(yàn)五_第3頁
山東大學(xué)操作系統(tǒng)實(shí)驗(yàn)五_第4頁
山東大學(xué)操作系統(tǒng)實(shí)驗(yàn)五_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

/軟件學(xué)院操作系統(tǒng)實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)題目:實(shí)驗(yàn)五、進(jìn)程互斥實(shí)驗(yàn)學(xué)號(hào):201100300124日期:20XX05月20日班級(jí):5班姓名:韓俊曉Email:實(shí)驗(yàn)?zāi)康模哼M(jìn)一步研究和實(shí)踐操作系統(tǒng)中關(guān)于并發(fā)進(jìn)程同步與互斥操作的一些經(jīng)典問題的解法.加深對(duì)于非對(duì)稱性互斥問題有關(guān)概念的理解。觀察和體驗(yàn)非對(duì)稱性互斥問題的并發(fā)控制方法。進(jìn)一步了解Linux系統(tǒng)中IPC進(jìn)程同步工具的用法.訓(xùn)練解決對(duì)該類問題的實(shí)際編程、調(diào)試和分析問題的能力。實(shí)驗(yàn)要求:理發(fā)店問題:假設(shè)理發(fā)店的理發(fā)室中有3個(gè)理發(fā)椅子和3個(gè)理發(fā)師.有一個(gè)可容納4個(gè)顧客坐等理發(fā)的沙發(fā)。此外還有一間等候室.可容納13位顧客等候進(jìn)入理發(fā)室。顧客如果發(fā)現(xiàn)理發(fā)店中顧客已滿〔超過20人.就不進(jìn)入理發(fā)店。在理發(fā)店內(nèi).理發(fā)師一旦有空就為坐在沙發(fā)上等待時(shí)間最長(zhǎng)的顧客理發(fā).同時(shí)空出的沙發(fā)讓在等候室中等待時(shí)間最長(zhǎng)的的顧客就坐。顧客理完發(fā)后.可向任何一位理發(fā)師付款。但理發(fā)店只有一本現(xiàn)金登記冊(cè).在任一時(shí)刻只能記錄一個(gè)顧客的付款。理發(fā)師在沒有顧客的時(shí)候就坐在理發(fā)椅子上睡眠。理發(fā)師的時(shí)間就用在理發(fā)、收款、睡眠上。請(qǐng)利用linux系統(tǒng)提供的IPC進(jìn)程通信機(jī)制實(shí)驗(yàn)并實(shí)現(xiàn)理發(fā)店問題的一個(gè)解法。硬件環(huán)境:實(shí)驗(yàn)室計(jì)算機(jī)軟件環(huán)境:Ubuntu08.4-Linux操作系統(tǒng)BASH_VERSION='3.2.33<1>-releaseOpenOffice2.3實(shí)驗(yàn)步驟:實(shí)驗(yàn)思路:〔1對(duì)于理發(fā)師進(jìn)程可以創(chuàng)建兩個(gè)子進(jìn)程.這樣父子進(jìn)程就構(gòu)成了三個(gè)理發(fā)師.控制對(duì)顧客的理發(fā)過程.同時(shí)對(duì)賬本采用互斥記賬方法〔2對(duì)于消費(fèi)者進(jìn)程.則創(chuàng)建四個(gè)消息隊(duì)列.分別為sofa_quest,sofa_respond,wait_quest,wait_respond,分別響應(yīng)不同的信號(hào)請(qǐng)求.打印不同的信息。1.實(shí)驗(yàn)說明:在linux系統(tǒng)中可以利用進(jìn)程間通信〔interprocesscommunicationIPC中的3個(gè)對(duì)象:共享內(nèi)存、信號(hào)燈數(shù)組、消息隊(duì)列.來解決協(xié)作并發(fā)進(jìn)程間的同步與互斥的問題。1共享內(nèi)存是OS內(nèi)核為并發(fā)進(jìn)程間交換數(shù)據(jù)而提供的一塊內(nèi)存區(qū)〔段。如果段的權(quán)限設(shè)置恰當(dāng).每個(gè)要訪問該段內(nèi)存的進(jìn)程都可以把它映射到自己私有的地址空間中。如果一進(jìn)程更新了段中數(shù)據(jù).那么其他進(jìn)程立即會(huì)看到這一更新。進(jìn)程創(chuàng)建的段也可由另一進(jìn)程讀寫。linux中可用命令ipcs-m觀察共享內(nèi)存情況。$ipcs-mSharedMemorySegmentskeyshmidownerpermsbytesnattchstatus0x00000000327682student6003932162dest0x00000000360451student6001966082dest0x00000000393220student6001966082destkey共享內(nèi)存關(guān)鍵值shmid共享內(nèi)存標(biāo)識(shí)owner共享內(nèi)存所由者〔本例為studentperm共享內(nèi)存使用權(quán)限<本例為student可讀可寫byte共享內(nèi)存字節(jié)數(shù)nattch共享內(nèi)存使用計(jì)數(shù)status共享內(nèi)存狀態(tài)上例說明系統(tǒng)當(dāng)前已由student建立了一些共享內(nèi)存,每個(gè)都有兩個(gè)進(jìn)程在共享。2>信號(hào)燈數(shù)組是OS內(nèi)核控制并發(fā)進(jìn)程間共享資源的一種進(jìn)程同步與互斥機(jī)制。linux中可用命令ipcs-s觀察信號(hào)燈數(shù)組的情況。$ipcs-sSemaphoreArrayskeysemidownerpermsnsems0000000163844apache60010x4d00f259294920beagleind60080x00000159425995student6441semid信號(hào)燈的標(biāo)識(shí)號(hào)nsems信號(hào)燈的個(gè)數(shù)其他字段意義同以上共享內(nèi)存所述。上例說明當(dāng)前系統(tǒng)中已經(jīng)建立多個(gè)信號(hào)燈。其中最后一個(gè)標(biāo)號(hào)為425996是由student建立的,它的使用權(quán)限為644.信號(hào)燈數(shù)組中信號(hào)燈個(gè)數(shù)為1個(gè)。3>消息隊(duì)列是OS內(nèi)核控制并發(fā)進(jìn)程間共享資源的另一種進(jìn)程同步機(jī)制。linux中可用命令ipcs-q觀察消息隊(duì)列的情況。$ipcs-qMessageQueueskeymsqidownerpermsused-bytesmessages0x000001c80root64481msgmid消息隊(duì)列的標(biāo)識(shí)號(hào)used-bytes消息的字節(jié)長(zhǎng)度messages消息隊(duì)列中的消息條數(shù)其他字段意義與以上兩種機(jī)制所述相同。上例說明當(dāng)前系統(tǒng)中有一條建立消息隊(duì)列.標(biāo)號(hào)為0.為root所建立.使用權(quán)限為644.每條消息8個(gè)字節(jié).現(xiàn)有一條消息。4>在權(quán)限允許的情況下您可以使用ipcrm命令刪除系統(tǒng)當(dāng)前存在的IPC對(duì)象中的任一個(gè)對(duì)象。ipcrm-m21482刪除標(biāo)號(hào)為21482的共享內(nèi)存。ipcrm-s32673刪除標(biāo)號(hào)為32673的信號(hào)燈數(shù)組。ipcrm-q18465刪除標(biāo)號(hào)為18465的消息隊(duì)列。5>在linux的proc文件系統(tǒng)中有3個(gè)虛擬文件動(dòng)態(tài)記錄了由以上ipcs命令顯示的當(dāng)前IPC對(duì)象的信息.它們分別是:/proc/sysvipc/shm共享內(nèi)存/proc/sysvipc/sem信號(hào)量/proc/sysvipc/msg消息隊(duì)列我們可以利用它們?cè)诔绦驁?zhí)行時(shí)獲取有關(guān)IPC對(duì)象的當(dāng)前信息。6>IPC對(duì)象有關(guān)的系統(tǒng)調(diào)用函數(shù)原型都聲明在以下的頭文件中:#include<sys/types.h>#include<sys/ipc.h>創(chuàng)建一段共享內(nèi)存系統(tǒng)調(diào)用語法:#include<sys/shm.h>intshmget<key_tkey,intsize,intflags>;key共享內(nèi)存的鍵值,可以為IPC_PRIVATE,也可以用整數(shù)指定一個(gè)size共享內(nèi)存字節(jié)長(zhǎng)度flags共享內(nèi)存權(quán)限位。shmget調(diào)用成功后.如果key用新整數(shù)指定.且flags中設(shè)置了IPC_CREAT位.則返回一個(gè)新建立的共享內(nèi)存段標(biāo)識(shí)符。如果指定的key已存在則返回與key關(guān)聯(lián)的標(biāo)識(shí)符。不成功返回-1令一段共享內(nèi)存附加到調(diào)用進(jìn)程中的系統(tǒng)調(diào)用語法:#include<sys/shm.h>char*shmat<intshmid,char*shmaddr,intflags>shmid由shmget創(chuàng)建的共享內(nèi)存的標(biāo)識(shí)符shmaddr總為0,表示用調(diào)用者指定的指針指向共享段flags共享內(nèi)存權(quán)限位shmat調(diào)用成功后返回附加的共享內(nèi)存首地址令一段共享內(nèi)存從到調(diào)用進(jìn)程中分離出去的系統(tǒng)調(diào)用語法:#include<sys/shm.h>intshmdt<char*shmadr>;shmadr進(jìn)程中指向附加共享內(nèi)存的指針shmdt調(diào)用成功將遞減附加計(jì)數(shù).當(dāng)計(jì)數(shù)為0.將刪除共享內(nèi)存。調(diào)用不成功返回-1。創(chuàng)建一個(gè)信號(hào)燈數(shù)組的系統(tǒng)調(diào)用有語法:#include<sys/sem.h>intsemget<key_tkey,intnsems,intflags>;key信號(hào)燈數(shù)組的鍵值,可以為IPC_PRIVATE,也可以用整數(shù)指定一個(gè)nsems信號(hào)燈數(shù)組中信號(hào)燈的個(gè)數(shù)flags信號(hào)燈數(shù)組權(quán)限位。如果key用整數(shù)指定.應(yīng)設(shè)置IPC_CREAT位。semget調(diào)用成功.如果key用新整數(shù)指定.且flags中設(shè)置了IPC_CREAT位.則返回一個(gè)新建立的信號(hào)等數(shù)組標(biāo)識(shí)符。如果指定的整數(shù)key已存在則返回與key關(guān)聯(lián)的標(biāo)識(shí)符。不成功返回-1操作信號(hào)燈數(shù)組的系統(tǒng)調(diào)用語法:#include<sys/sem.h>intsemop<intsemid,structsembuf*semop,unsignednops>;semid由semget創(chuàng)建的信號(hào)燈數(shù)組的標(biāo)識(shí)符semop指向sembuf數(shù)據(jù)結(jié)構(gòu)的指針nops信號(hào)燈數(shù)組元素的個(gè)數(shù)。semop調(diào)用成功返回0.不成功返回-1??刂菩盘?hào)燈數(shù)組的系統(tǒng)調(diào)用語法:#include<sys/sem.h>intsemctl<intsemid,intsemnum,intcmd,unionsemunarg>;semid由semget創(chuàng)建的信號(hào)燈數(shù)組的標(biāo)識(shí)符semnum該信號(hào)燈數(shù)組中的第幾個(gè)信號(hào)燈cmd對(duì)信號(hào)燈發(fā)出的控制命令。例如:GETVAL返回當(dāng)前信號(hào)燈狀態(tài)SETVAL設(shè)置信號(hào)燈狀態(tài)IPC_RMID刪除標(biāo)號(hào)為semid的信號(hào)燈arg保存信號(hào)燈狀態(tài)的聯(lián)合體,信號(hào)燈的值是其中一個(gè)基本成員unionsemun{intval;/*valueforSETVAL*/};semctl執(zhí)行不成功返回-1.否則返回指定的cmd的值。創(chuàng)建消息隊(duì)列的系統(tǒng)調(diào)用語法:#include<sys/msg.h>intmsgget<key_tkey,intflags>key消息隊(duì)列的鍵值,可以為IPC_PRIVATE,也可以用整數(shù)指定一個(gè)flags消息隊(duì)列權(quán)限位。msgget調(diào)用成功.如果key用新整數(shù)指定.且flags中設(shè)置了IPC_CREAT位.則返回一個(gè)新建立的消息隊(duì)列標(biāo)識(shí)符。如果指定的整數(shù)key已存在則返回與key關(guān)聯(lián)的標(biāo)識(shí)符。成功返回-1。追加一條新消息到消息隊(duì)列的系統(tǒng)調(diào)用語法:#include<sys.msg.h>intmsgsnd<intmsqid,structmsgbuf*msgp,size_tmsgsz,intmsgflg>;msqid由消息隊(duì)列的標(biāo)識(shí)符msgp消息緩沖區(qū)指針。消息緩沖區(qū)結(jié)構(gòu)為:structmsgbuf{longmtype;/*消息類型.必須大于0*/charmtext[1];/*消息數(shù)據(jù).長(zhǎng)度應(yīng)于msgsz聲明的一致*/}msgsz消息數(shù)據(jù)的長(zhǎng)度msgflg為0表示阻塞方式.設(shè)置IPC_NOWAIT表示非阻塞方式msgsnd調(diào)用成功返回0.不成功返回-1。從到消息隊(duì)列中讀出一條新消息的系統(tǒng)調(diào)用語法:#include<sys.msg.h>intmsgrcv<intmsqid,structmsgbuf*msgp,size_tmsgsz,longmsgtype,intmsgflg>;msqid由消息隊(duì)列的標(biāo)識(shí)符msgp消息緩沖區(qū)指針。消息緩沖區(qū)結(jié)構(gòu)為:structmsgbuf{longmtype;/*消息類型.必須大于0*/charmtext[1];/*消息數(shù)據(jù).長(zhǎng)度應(yīng)于msgsz聲明的一致*/}msgsz消息數(shù)據(jù)的長(zhǎng)度msgtype決定從隊(duì)列中返回哪條消息:=0返回消息隊(duì)列中第一條消息>0返回消息隊(duì)列中等于mtype類型的第一條消息。<0返回mtype<=type絕對(duì)值最小值的第一條消息。msgflg為0表示阻塞方式.設(shè)置IPC_NOWAIT表示非阻塞方式msgrcv調(diào)用成功返回0.不成功返回-1。刪除消息隊(duì)列的系統(tǒng)調(diào)用語法:#include<sys/msg.h>intmsgctl<intmsqid,intcmd,structmsqid_ds*buf>;msqid由消息隊(duì)列的標(biāo)識(shí)符cmd控制命令。常用的有:IPC_RMID刪除msgid標(biāo)識(shí)的消息隊(duì)列IPC_STAT為非破壞性讀.從隊(duì)列中讀出一個(gè)msgid_ds結(jié)構(gòu)填充緩沖bufIPC_SET改變隊(duì)列的UID.GID.訪問模式和最大字節(jié)數(shù)。msgctl調(diào)用成功返回0.不成功返回-1。3.調(diào)試過程:1建立以下名為ipc.h的C語言頭文件:#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/shm.h>#include<sys/sem.h>#include<sys/msg.h>#include<signal.h>#defineBUFSZ256#defineMAXVAL100#defineSTRSIZ8#defineWRITERQUEST1#defineREADERQUEST2#defineFINISHED3//寫請(qǐng)求標(biāo)識(shí)//讀請(qǐng)求標(biāo)識(shí)//讀寫完成標(biāo)識(shí)//進(jìn)程自定義的鍵盤中斷信號(hào)處理函數(shù)原型typedefvoid<*sighandler_t><int>;voidsigcat<void>;typedefunionsemuns{intval;}Sem_uns;typedefstructmsgbuf{longmtype;intmid;}Msg_buf;//信號(hào)量key_tcostomer_key;intcostomer_sem;key_taccount_key;intaccount_sem;intsem_val;intsem_flg;//消息隊(duì)列intwait_quest_flg;key_twait_quest_key;intwait_quest_id;intwait_respond_flg;key_twait_respond_key;intwait_respond_id;intsofa_quest_flg;key_tsofa_quest_key;intsofa_quest_id;intsofa_respond_flg;key_tsofa_respond_key;intsofa_respond_id;intget_ipc_id<char*proc_file,key_tkey>;char*set_shm<key_tshm_key,intshm_num,intshm_flag>;intset_msq<key_tmsq_key,intmsq_flag>;intset_sem<key_tsem_key,intsem_val,intsem_flag>;intdown<intsem_id>;intup<intsem_id>;2建立ipc.c、barber.c和customer.c程序。其中實(shí)驗(yàn)思想為利用消息隊(duì)列的每條消息代表每個(gè)顧客.將進(jìn)入等候室的顧客組織到一個(gè)隊(duì)列.將坐入沙發(fā)的顧客組織到另一個(gè)隊(duì)列。理發(fā)師從沙發(fā)隊(duì)列請(qǐng)出顧客.空出的沙發(fā)位置再從等候室請(qǐng)入顧客進(jìn)入沙發(fā)隊(duì)列。三個(gè)理發(fā)師進(jìn)程使用相同的程序段上下文.所有顧客使用同一個(gè)程序段上下文。這樣可避免產(chǎn)生太多進(jìn)程.以便節(jié)省系統(tǒng)資源。參考解法偽代碼:理發(fā)師程序〔Barber{建立一個(gè)互斥帳本信號(hào)量:s_account,初值=1;建立一個(gè)同步顧客信號(hào)量:s_customer,初值=0;建立沙發(fā)消息隊(duì)列:q_sofa;建立等候室消息隊(duì)列:q_wait;建立3個(gè)理發(fā)師進(jìn)程:b1_pid,b2_pid,b3_pid;每個(gè)理發(fā)師進(jìn)程作:while<1>{以阻塞方式從沙發(fā)隊(duì)列接收一條消息.如果有消息.則消息出沙發(fā)隊(duì)列<模擬一顧客理發(fā)>;喚醒顧客進(jìn)程<讓下一顧客坐入沙發(fā)。用進(jìn)程休眠一個(gè)隨機(jī)時(shí)間模擬理發(fā)過程。理完發(fā),使用帳本信號(hào)量記賬?;コ獾墨@取賬本記賬喚醒用賬本理發(fā)師者否則沒有消息<沙發(fā)上無顧客>則理發(fā)師進(jìn)程在沙發(fā)隊(duì)列上睡眠;當(dāng)沙發(fā)隊(duì)列有消息時(shí)被喚醒<有顧客坐入沙發(fā)>。}}顧客程序<customer>{while<1>{取沙發(fā)隊(duì)列消息數(shù)<查沙發(fā)上顧客數(shù)>;如果消息數(shù)小于4<沙發(fā)沒座滿以非阻塞方式從等候室隊(duì)列接收一條消息<查等候室有顧客否>.如果有消息將接收到的消息發(fā)送到沙發(fā)隊(duì)列<等候室顧客坐入沙發(fā)>;否則發(fā)送一條消息到沙發(fā)隊(duì)列<新來的顧客直接坐入沙發(fā)>;否則<沙發(fā)坐滿>取等候室隊(duì)列消息數(shù)<查等候室顧客數(shù)>;如果消息數(shù)小于13發(fā)送一條消息到等候室隊(duì)列<等候室沒滿,新顧客進(jìn)等候室>;否則在顧客同步信號(hào)量上睡眠<等候室滿暫不接待新顧客>;用進(jìn)程休眠

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論