版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
/軟件學院操作系統(tǒng)實驗報告實驗題目:實驗五、進程互斥實驗學號:201100300124日期:20XX05月20日班級:5班姓名:韓俊曉Email:實驗目的:進一步研究和實踐操作系統(tǒng)中關于并發(fā)進程同步與互斥操作的一些經(jīng)典問題的解法.加深對于非對稱性互斥問題有關概念的理解。觀察和體驗非對稱性互斥問題的并發(fā)控制方法。進一步了解Linux系統(tǒng)中IPC進程同步工具的用法.訓練解決對該類問題的實際編程、調試和分析問題的能力。實驗要求:理發(fā)店問題:假設理發(fā)店的理發(fā)室中有3個理發(fā)椅子和3個理發(fā)師.有一個可容納4個顧客坐等理發(fā)的沙發(fā)。此外還有一間等候室.可容納13位顧客等候進入理發(fā)室。顧客如果發(fā)現(xiàn)理發(fā)店中顧客已滿〔超過20人.就不進入理發(fā)店。在理發(fā)店內.理發(fā)師一旦有空就為坐在沙發(fā)上等待時間最長的顧客理發(fā).同時空出的沙發(fā)讓在等候室中等待時間最長的的顧客就坐。顧客理完發(fā)后.可向任何一位理發(fā)師付款。但理發(fā)店只有一本現(xiàn)金登記冊.在任一時刻只能記錄一個顧客的付款。理發(fā)師在沒有顧客的時候就坐在理發(fā)椅子上睡眠。理發(fā)師的時間就用在理發(fā)、收款、睡眠上。請利用linux系統(tǒng)提供的IPC進程通信機制實驗并實現(xiàn)理發(fā)店問題的一個解法。硬件環(huán)境:實驗室計算機軟件環(huán)境:Ubuntu08.4-Linux操作系統(tǒng)BASH_VERSION='3.2.33<1>-releaseOpenOffice2.3實驗步驟:實驗思路:〔1對于理發(fā)師進程可以創(chuàng)建兩個子進程.這樣父子進程就構成了三個理發(fā)師.控制對顧客的理發(fā)過程.同時對賬本采用互斥記賬方法〔2對于消費者進程.則創(chuàng)建四個消息隊列.分別為sofa_quest,sofa_respond,wait_quest,wait_respond,分別響應不同的信號請求.打印不同的信息。1.實驗說明:在linux系統(tǒng)中可以利用進程間通信〔interprocesscommunicationIPC中的3個對象:共享內存、信號燈數(shù)組、消息隊列.來解決協(xié)作并發(fā)進程間的同步與互斥的問題。1共享內存是OS內核為并發(fā)進程間交換數(shù)據(jù)而提供的一塊內存區(qū)〔段。如果段的權限設置恰當.每個要訪問該段內存的進程都可以把它映射到自己私有的地址空間中。如果一進程更新了段中數(shù)據(jù).那么其他進程立即會看到這一更新。進程創(chuàng)建的段也可由另一進程讀寫。linux中可用命令ipcs-m觀察共享內存情況。$ipcs-mSharedMemorySegmentskeyshmidownerpermsbytesnattchstatus0x00000000327682student6003932162dest0x00000000360451student6001966082dest0x00000000393220student6001966082destkey共享內存關鍵值shmid共享內存標識owner共享內存所由者〔本例為studentperm共享內存使用權限<本例為student可讀可寫byte共享內存字節(jié)數(shù)nattch共享內存使用計數(shù)status共享內存狀態(tài)上例說明系統(tǒng)當前已由student建立了一些共享內存,每個都有兩個進程在共享。2>信號燈數(shù)組是OS內核控制并發(fā)進程間共享資源的一種進程同步與互斥機制。linux中可用命令ipcs-s觀察信號燈數(shù)組的情況。$ipcs-sSemaphoreArrayskeysemidownerpermsnsems0000000163844apache60010x4d00f259294920beagleind60080x00000159425995student6441semid信號燈的標識號nsems信號燈的個數(shù)其他字段意義同以上共享內存所述。上例說明當前系統(tǒng)中已經(jīng)建立多個信號燈。其中最后一個標號為425996是由student建立的,它的使用權限為644.信號燈數(shù)組中信號燈個數(shù)為1個。3>消息隊列是OS內核控制并發(fā)進程間共享資源的另一種進程同步機制。linux中可用命令ipcs-q觀察消息隊列的情況。$ipcs-qMessageQueueskeymsqidownerpermsused-bytesmessages0x000001c80root64481msgmid消息隊列的標識號used-bytes消息的字節(jié)長度messages消息隊列中的消息條數(shù)其他字段意義與以上兩種機制所述相同。上例說明當前系統(tǒng)中有一條建立消息隊列.標號為0.為root所建立.使用權限為644.每條消息8個字節(jié).現(xiàn)有一條消息。4>在權限允許的情況下您可以使用ipcrm命令刪除系統(tǒng)當前存在的IPC對象中的任一個對象。ipcrm-m21482刪除標號為21482的共享內存。ipcrm-s32673刪除標號為32673的信號燈數(shù)組。ipcrm-q18465刪除標號為18465的消息隊列。5>在linux的proc文件系統(tǒng)中有3個虛擬文件動態(tài)記錄了由以上ipcs命令顯示的當前IPC對象的信息.它們分別是:/proc/sysvipc/shm共享內存/proc/sysvipc/sem信號量/proc/sysvipc/msg消息隊列我們可以利用它們在程序執(zhí)行時獲取有關IPC對象的當前信息。6>IPC對象有關的系統(tǒng)調用函數(shù)原型都聲明在以下的頭文件中:#include<sys/types.h>#include<sys/ipc.h>創(chuàng)建一段共享內存系統(tǒng)調用語法:#include<sys/shm.h>intshmget<key_tkey,intsize,intflags>;key共享內存的鍵值,可以為IPC_PRIVATE,也可以用整數(shù)指定一個size共享內存字節(jié)長度flags共享內存權限位。shmget調用成功后.如果key用新整數(shù)指定.且flags中設置了IPC_CREAT位.則返回一個新建立的共享內存段標識符。如果指定的key已存在則返回與key關聯(lián)的標識符。不成功返回-1令一段共享內存附加到調用進程中的系統(tǒng)調用語法:#include<sys/shm.h>char*shmat<intshmid,char*shmaddr,intflags>shmid由shmget創(chuàng)建的共享內存的標識符shmaddr總為0,表示用調用者指定的指針指向共享段flags共享內存權限位shmat調用成功后返回附加的共享內存首地址令一段共享內存從到調用進程中分離出去的系統(tǒng)調用語法:#include<sys/shm.h>intshmdt<char*shmadr>;shmadr進程中指向附加共享內存的指針shmdt調用成功將遞減附加計數(shù).當計數(shù)為0.將刪除共享內存。調用不成功返回-1。創(chuàng)建一個信號燈數(shù)組的系統(tǒng)調用有語法:#include<sys/sem.h>intsemget<key_tkey,intnsems,intflags>;key信號燈數(shù)組的鍵值,可以為IPC_PRIVATE,也可以用整數(shù)指定一個nsems信號燈數(shù)組中信號燈的個數(shù)flags信號燈數(shù)組權限位。如果key用整數(shù)指定.應設置IPC_CREAT位。semget調用成功.如果key用新整數(shù)指定.且flags中設置了IPC_CREAT位.則返回一個新建立的信號等數(shù)組標識符。如果指定的整數(shù)key已存在則返回與key關聯(lián)的標識符。不成功返回-1操作信號燈數(shù)組的系統(tǒng)調用語法:#include<sys/sem.h>intsemop<intsemid,structsembuf*semop,unsignednops>;semid由semget創(chuàng)建的信號燈數(shù)組的標識符semop指向sembuf數(shù)據(jù)結構的指針nops信號燈數(shù)組元素的個數(shù)。semop調用成功返回0.不成功返回-1??刂菩盘枱魯?shù)組的系統(tǒng)調用語法:#include<sys/sem.h>intsemctl<intsemid,intsemnum,intcmd,unionsemunarg>;semid由semget創(chuàng)建的信號燈數(shù)組的標識符semnum該信號燈數(shù)組中的第幾個信號燈cmd對信號燈發(fā)出的控制命令。例如:GETVAL返回當前信號燈狀態(tài)SETVAL設置信號燈狀態(tài)IPC_RMID刪除標號為semid的信號燈arg保存信號燈狀態(tài)的聯(lián)合體,信號燈的值是其中一個基本成員unionsemun{intval;/*valueforSETVAL*/};semctl執(zhí)行不成功返回-1.否則返回指定的cmd的值。創(chuàng)建消息隊列的系統(tǒng)調用語法:#include<sys/msg.h>intmsgget<key_tkey,intflags>key消息隊列的鍵值,可以為IPC_PRIVATE,也可以用整數(shù)指定一個flags消息隊列權限位。msgget調用成功.如果key用新整數(shù)指定.且flags中設置了IPC_CREAT位.則返回一個新建立的消息隊列標識符。如果指定的整數(shù)key已存在則返回與key關聯(lián)的標識符。成功返回-1。追加一條新消息到消息隊列的系統(tǒng)調用語法:#include<sys.msg.h>intmsgsnd<intmsqid,structmsgbuf*msgp,size_tmsgsz,intmsgflg>;msqid由消息隊列的標識符msgp消息緩沖區(qū)指針。消息緩沖區(qū)結構為:structmsgbuf{longmtype;/*消息類型.必須大于0*/charmtext[1];/*消息數(shù)據(jù).長度應于msgsz聲明的一致*/}msgsz消息數(shù)據(jù)的長度msgflg為0表示阻塞方式.設置IPC_NOWAIT表示非阻塞方式msgsnd調用成功返回0.不成功返回-1。從到消息隊列中讀出一條新消息的系統(tǒng)調用語法:#include<sys.msg.h>intmsgrcv<intmsqid,structmsgbuf*msgp,size_tmsgsz,longmsgtype,intmsgflg>;msqid由消息隊列的標識符msgp消息緩沖區(qū)指針。消息緩沖區(qū)結構為:structmsgbuf{longmtype;/*消息類型.必須大于0*/charmtext[1];/*消息數(shù)據(jù).長度應于msgsz聲明的一致*/}msgsz消息數(shù)據(jù)的長度msgtype決定從隊列中返回哪條消息:=0返回消息隊列中第一條消息>0返回消息隊列中等于mtype類型的第一條消息。<0返回mtype<=type絕對值最小值的第一條消息。msgflg為0表示阻塞方式.設置IPC_NOWAIT表示非阻塞方式msgrcv調用成功返回0.不成功返回-1。刪除消息隊列的系統(tǒng)調用語法:#include<sys/msg.h>intmsgctl<intmsqid,intcmd,structmsqid_ds*buf>;msqid由消息隊列的標識符cmd控制命令。常用的有:IPC_RMID刪除msgid標識的消息隊列IPC_STAT為非破壞性讀.從隊列中讀出一個msgid_ds結構填充緩沖bufIPC_SET改變隊列的UID.GID.訪問模式和最大字節(jié)數(shù)。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//寫請求標識//讀請求標識//讀寫完成標識//進程自定義的鍵盤中斷信號處理函數(shù)原型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程序。其中實驗思想為利用消息隊列的每條消息代表每個顧客.將進入等候室的顧客組織到一個隊列.將坐入沙發(fā)的顧客組織到另一個隊列。理發(fā)師從沙發(fā)隊列請出顧客.空出的沙發(fā)位置再從等候室請入顧客進入沙發(fā)隊列。三個理發(fā)師進程使用相同的程序段上下文.所有顧客使用同一個程序段上下文。這樣可避免產(chǎn)生太多進程.以便節(jié)省系統(tǒng)資源。參考解法偽代碼:理發(fā)師程序〔Barber{建立一個互斥帳本信號量:s_account,初值=1;建立一個同步顧客信號量:s_customer,初值=0;建立沙發(fā)消息隊列:q_sofa;建立等候室消息隊列:q_wait;建立3個理發(fā)師進程:b1_pid,b2_pid,b3_pid;每個理發(fā)師進程作:while<1>{以阻塞方式從沙發(fā)隊列接收一條消息.如果有消息.則消息出沙發(fā)隊列<模擬一顧客理發(fā)>;喚醒顧客進程<讓下一顧客坐入沙發(fā)。用進程休眠一個隨機時間模擬理發(fā)過程。理完發(fā),使用帳本信號量記賬?;コ獾墨@取賬本記賬喚醒用賬本理發(fā)師者否則沒有消息<沙發(fā)上無顧客>則理發(fā)師進程在沙發(fā)隊列上睡眠;當沙發(fā)隊列有消息時被喚醒<有顧客坐入沙發(fā)>。}}顧客程序<customer>{while<1>{取沙發(fā)隊列消息數(shù)<查沙發(fā)上顧客數(shù)>;如果消息數(shù)小于4<沙發(fā)沒座滿以非阻塞方式從等候室隊列接收一條消息<查等候室有顧客否>.如果有消息將接收到的消息發(fā)送到沙發(fā)隊列<等候室顧客坐入沙發(fā)>;否則發(fā)送一條消息到沙發(fā)隊列<新來的顧客直接坐入沙發(fā)>;否則<沙發(fā)坐滿>取等候室隊列消息數(shù)<查等候室顧客數(shù)>;如果消息數(shù)小于13發(fā)送一條消息到等候室隊列<等候室沒滿,新顧客進等候室>;否則在顧客同步信號量上睡眠<等候室滿暫不接待新顧客>;用進程休眠
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年蘭州石化職業(yè)技術學院高職單招高職單招英語2016-2024歷年頻考點試題含答案解析
- 2025年六盤水幼兒師范高等??茖W校高職單招職業(yè)適應性測試近5年??及鎱⒖碱}庫含答案解析
- 2025年上海行健職業(yè)學院高職單招職業(yè)適應性測試近5年??及鎱⒖碱}庫含答案解析
- 探究營銷策略創(chuàng)新-第2篇-洞察分析
- 碳酸鈣在生物醫(yī)藥中的應用-洞察分析
- 無人機綠色材料研究-洞察分析
- 2025年度車貸抵押貸款額度調整協(xié)議3篇
- 2025年廠區(qū)消防安全管理與物業(yè)服務合同3篇
- 2025年橘片項目可行性研究報告
- 2025年水磨布項目可行性研究報告
- 2025年溫州市城發(fā)集團招聘筆試參考題庫含答案解析
- 2025版高考物理復習知識清單
- 2024年度工作總結與計劃標準版本(2篇)
- 全球半導體測試探針行業(yè)市場研究報告2024
- 2024年注冊計量師-一級注冊計量師考試近5年真題附答案
- 2023-2024學年深圳市高一年級下冊英語期末考試題(含答案)
- 工程管理重大風險應對方案
- 直播帶貨助農(nóng)現(xiàn)狀及發(fā)展對策研究-以抖音直播為例(開題)
- 《光伏發(fā)電工程工程量清單計價規(guī)范》
- (完整版)保證藥品信息來源合法、真實、安全的管理措施、情況說明及相關證明
- 營銷專員績效考核指標
評論
0/150
提交評論