山東大學操作系統實驗五_第1頁
山東大學操作系統實驗五_第2頁
山東大學操作系統實驗五_第3頁
山東大學操作系統實驗五_第4頁
山東大學操作系統實驗五_第5頁
已閱讀5頁,還剩11頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論