




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、進程同步實驗張咪軟件四班一、實驗目的總結和分析示例實驗和獨立實驗中觀察到的調試和運行信息,說明您對與解決非對稱性互斥操作的算法有哪些新的理解和認識? 為什么會出現進程饑餓現象?本實驗的饑餓現象是怎樣表現的?怎樣解決并發進程間發生的饑餓現象?您對于并發進程間使用消息傳遞解決進程通信問題有哪些新的理解和認識?根據實驗程序、調試過程和結果分析寫出實驗報告。二、實驗要求理發店問題:假設理發店的理發室中有3個理發椅子和3個理發師,有一個可容納4個顧客坐等理發的沙發。此外還有一間等候室,可容納13位顧客等候進入理發室。顧客如果發現理發店中顧客已滿(超過20人),就不進入理發店。 在理發店內,理發師一旦有空
2、就為坐在沙發上等待時間最長的顧客理發,同時空出的沙發讓在等候室中等待時間最長的的顧客就坐。顧客理完發后,可向任何一位理發師付款。但理發店只有一本現金登記冊,在任一時刻只能記錄一個顧客的付款。理發師在沒有顧客的時候就坐在理發椅子上睡眠。理發師的時間就用在理發、收款、睡眠上。 請利用linux系統提供的IPC進程通信機制實驗并實現理發店問題的一個解法。三、實驗環境實驗環境均為Linux操作系統,開發工具為gcc和g+。四、實驗思路約束:1 設置一個count變量來對顧客進行計數,該變量將被多個顧客進程互斥地訪問并修改,通過一個互斥信號量mutext來實現。count20時,就不進入理發店。7cou
3、nt20時,count+,顧客申請等候室,進入等候室等待,用一個room信號量控制。然后等待申請沙發,用一個sofa信號量控制。然后申請椅子。3count7時,count+,顧客坐在沙發上等待,等待申請椅子。count20) /顧客大于20人signal(mutex); 離開理發店 else/顧客小于20人count=count+1;/進入理發店 if(count7) /count7,說明理發椅和沙發上都有人,需要到等待室等待 signal(mutex); wait(room);/申請進入等待室 在等待室等 wait(sofa); /申請沙發signal(room);/釋放等待室坐在沙發上等
4、wait(empty);/等待理發椅為空 申請到理發椅signal(sofa); /釋放沙發 else if(count3)/說明理發椅上都有人,需要坐到沙發上等待signal(mutex);wait(sofa);/申請沙發 坐在沙發上等wait(empty);/等待理發椅為空申請到理發椅signal(sofa);/釋放沙發else/count3,可以坐到理發椅上等待signal(mutex); wait(empty); /申請理發椅 坐在理發椅上等待理發 signal(full); /通知理發師開始理發理發 wait(finish); /等待理發完畢 付款signal(payment); /
5、通知理發師已付款 wait(receipt); /等待理發師收款 理發師收費完成,顧客離開理發椅 signal(empty); /釋放理發椅 wait(mutex); /對count 臨界資源操作,用mutex完成互斥 count=count-1; /離開理發店 signal(mutex); 七、調試及實驗結果1、創建makefile文件hdrs = ipc.h opts = -g -c c_src = cons.c ipc.c c_obj = cons.o ipc.o p_src = bar.c ipc.c p_obj = bar.o ipc.o all: producer consumer
6、 consumer: $(c_obj) gcc $(c_obj) -o consumer cons.o: $(c_src) $(hdrs) gcc $(opts) $(c_src) producer: $(p_obj) gcc $(p_obj) -o producer bar.o: $(p_src) $(hdrs) gcc $(opts) $(p_src) clean: rm cons bar *.o2.執行make命令,結果出現了許多由于粗心造成的編譯錯誤3、修改程序后編譯成功,打開兩個終端,先運行producer.c,再運行consumer.c4、若按ctrl+c停止producer進程,
7、則出現如下圖結果。沙發坐滿后顧客將進入等候室等待5、若再次執行producer進程,將陸續喚醒在等待的顧客,結果如下圖6、若再停止producer,讓等待室的人也滿,則顧客會離開理發店,結果如下圖七、心得與收獲1、本次試驗,使我基本掌握了怎樣用消息隊列控制和堵塞進程,實現對共享內存的有序訪問。2、msgrcv/msgsnd為linux系統中異步或進程間通信的一種機制,msgrcv()可以從消息隊列中讀取消息,msgsnd()將一個新的消息寫入隊列。int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);ssize_t
8、msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);msgflg:這個參數依然是是控制函數行為的標志,取值可以是:0,表示忽略;IPC_NOWAIT,如果消息隊列為空,則返回一個ENOMSG,并將控制權交回調用函數的進程。3、不僅加深了對進程互斥的理解,還使我加深了對理發師算法的理解,找到了它與讀者寫者問題的共同之處:(1).進程間的互斥(2).理發師類似讀者進程,顧客類似寫者進程。4、編寫程序時要細心,對于編譯過程中出現的錯誤,要有耐心去解決。八、源代碼Ipc.h:#include #include #in
9、clude #include #include #include #include #define BUFSZ 256#define MAXVAL 100#define STRSIZ 8#define WRITERQUEST 1#define READERQUEST 2#define FINISHED 3 /寫請求標識 /讀請求標識/讀寫完成標識typedef union semuns int val; Sem_uns;typedef struct msgbuf long mtype;int mid; Msg_buf;/信號量key_t costomer_key;int costomer_se
10、m;key_t account_key;int account_sem;int sem_val;int sem_flg;/消息隊列int wait_quest_flg;key_t wait_quest_key;int wait_quest_id;int wait_respond_flg;key_t wait_respond_key;int wait_respond_id;int sofa_quest_flg;key_t sofa_quest_key;int sofa_quest_id;int sofa_respond_flg;key_t sofa_respond_key;int sofa_re
11、spond_id;int get_ipc_id(char *proc_file,key_t key);char *set_shm(key_t shm_key,int shm_num,int shm_flag);int set_msq(key_t msq_key,int msq_flag);int set_sem(key_t sem_key,int sem_val,int sem_flag);int down(int sem_id);int up(int sem_id);Ipc.c:#include ipc.hint get_ipc_id(char *proc_file,key_t key)FI
12、LE *pf;int i,j;char lineBUFSZ,columBUFSZ;if(pf = fopen(proc_file,r) = NULL)perror(Proc file not open);exit(EXIT_FAILURE);fgets(line, BUFSZ, pf);while(!feof(pf)i = j = 0;fgets(line, BUFSZ,pf);while(linei = ) i+;while(linei != ) columj+ = linei+;columj = 0;if(atoi(colum) != key) continue;j=0;while(lin
13、ei = ) i+;while(linei != ) columj+ = linei+;columj = 0;i = atoi(colum);fclose(pf);return i;fclose(pf);return -1;int down(int sem_id)struct sembuf buf;buf.sem_op = -1;buf.sem_num = 0;buf.sem_flg = SEM_UNDO;if(semop(sem_id,&buf,1) 0) perror(down error );exit(EXIT_FAILURE);return EXIT_SUCCESS;int up(in
14、t sem_id)struct sembuf buf;buf.sem_op = 1;buf.sem_num = 0;buf.sem_flg = SEM_UNDO;if(semop(sem_id,&buf,1) 0) perror(up error );exit(EXIT_FAILURE);return EXIT_SUCCESS;int set_sem(key_t sem_key,int sem_val,int sem_flg)int sem_id;Sem_uns sem_arg;/測試由 sem_key 標識的信號燈數組是否已經建立if(sem_id = get_ipc_id(/proc/sy
15、svipc/sem,sem_key) 0 )/semget 新建一個信號燈,其標號返回到 sem_idif(sem_id = semget(sem_key,1,sem_flg) 0)perror(semaphore create error);exit(EXIT_FAILURE);/設置信號燈的初值sem_arg.val = sem_val;if(semctl(sem_id,0,SETVAL,sem_arg) 0)perror(semaphore set error);exit(EXIT_FAILURE);return sem_id;char * set_shm(key_t shm_key,i
16、nt shm_num,int shm_flg)int i,shm_id;char * shm_buf;/測試由 shm_key 標識的共享內存區是否已經建立if(shm_id = get_ipc_id(/proc/sysvipc/shm,shm_key) 0 )/shmget 新建 一個長度為 shm_num 字節的共享內存,其標號返回到 shm_idif(shm_id = shmget(shm_key,shm_num,shm_flg) 0)perror(shareMemory set error);exit(EXIT_FAILURE);/shmat 將由 shm_id 標識的共享內存附加給指
17、針 shm_bufif(shm_buf = (char *)shmat(shm_id,0,0) (char *)0)perror(get shareMemory error);exit(EXIT_FAILURE);for(i=0; ishm_num; i+) shm_bufi = 0; /初始為 0/shm_key 標識的共享內存區已經建立,將由 shm_id 標識的共享內存附加給指針 shm_bufif(shm_buf = (char *)shmat(shm_id,0,0) (char *)0)perror(get shareMemory error);exit(EXIT_FAILURE);
18、return shm_buf;int set_msq(key_t msq_key,int msq_flg)int msq_id;/測試由 msq_key 標識的消息隊列是否已經建立if(msq_id = get_ipc_id(/proc/sysvipc/msg,msq_key) 0 )/msgget 新建一個消息隊列,其標號返回到 msq_idif(msq_id = msgget(msq_key,msq_flg) =0) /讀沙發請求隊列 msgsnd(sofa_respond_id, &msg_arg,sizeof(msg_arg), 0);/往沙發回應隊列里寫 printf(%d號理發師為
19、%d號顧客理發n, getpid(), msg_arg.mid); sleep(rate); down(account_sem); printf(%d號理發師收取%d號顧客交費n, getpid(), msg_arg.mid); up(account_sem); else pid2=fork(); if(pid2=0) while(1) / wait_quest_flg=IPC_NOWAIT; printf(%d號理發師睡眠n, getpid(); wait_quest_flg=0; if(msgrcv(sofa_quest_id, &msg_arg, sizeof(msg_arg), 0,
20、wait_quest_flg)=0) msgsnd(sofa_respond_id, &msg_arg,sizeof(msg_arg), 0); printf(%d號理發師為%d號顧客理發n, getpid(), msg_arg.mid); sleep(rate); down(account_sem); printf(%d號理發師收取%d號顧客交費n, getpid(), msg_arg.mid); up(account_sem); else printf(%d號理發師睡眠n, getpid(); else while(1) / wait_quest_flg=IPC_NOWAIT; print
21、f(%d號理發師睡眠n, getpid(); wait_quest_flg=0; if(msgrcv(sofa_quest_id, &msg_arg, sizeof(msg_arg), 0, wait_quest_flg)=0) msgsnd(sofa_respond_id, &msg_arg,sizeof(msg_arg), 0); printf(%d號理發師為%d號顧客理發n, getpid(), msg_arg.mid); sleep(rate); down(account_sem); printf(%d號理發師收取%d號顧客交費n, getpid(), msg_arg.mid); up
22、(account_sem); else printf(%d號理發師睡眠n, getpid(); return 0;Cons.c:#include ipc.hint main(int argc,char *argv) int rate; Msg_buf msg_arg; /可在在命令行第一參數指定一個進程睡眠秒數,以調解進程執行速度 if(argv1 != NULL) rate = atoi(argv1); else rate = 3; /聯系一個請求消息隊列 wait_quest_flg = IPC_CREAT| 0644; wait_quest_key = 101; wait_quest_i
23、d = set_msq(wait_quest_key,wait_quest_flg); /聯系一個響應消息隊列 wait_respond_flg = IPC_CREAT| 0644; wait_respond_key = 102; wait_respond_id = set_msq(wait_respond_key,wait_respond_flg); /聯系一個請求消息隊列 sofa_quest_flg = IPC_CREAT| 0644; sofa_quest_key = 201; sofa_quest_id = set_msq(sofa_quest_key,sofa_quest_flg); /聯系一個響應消息隊列 sofa_respond_flg = IPC_CREAT| 0644; sofa_respond_ke
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 那一種溫曖為題的中考語文作文
- 礦物加工廠環境保護法規與標準考核試卷
- 消費金融公司激勵機制與績效管理考核試卷
- 批發市場線上線下融合趨勢考核試卷
- 書香校園初二語文作文
- 堿性催化劑在化學反應中的應用考核試卷
- 一年級語文試題-(下冊)識字3
- 文化機械行業的循環經濟與資源利用考核試卷
- 礦物加工技術進展-石墨滑石分離考核試卷
- 廈門高三質檢語文作文2021
- (二模)2025年深圳市高三年級第二次調研考試歷史試卷(含標準答案)
- 婦產科課件-早產臨床防治指南(2024)解讀
- 2024年無錫市錫山環保能源集團招聘筆試參考題庫附帶答案詳解
- 八十天環游地球-完整版PPT
- 康佳led彩電電路原理圖
- 中考英語任務型閱讀解題技巧課件
- 江西省鄱陽湖康山蓄滯洪區安全建設工程項目環境影響報告書
- DB32∕T 2915-2016 化工園區(集中區)應急救援物資配備要求
- (西北)火力發電廠汽水管道支吊架設計手冊
- 文體學eecummings詩歌分析
- 針織毛衫實例
評論
0/150
提交評論