


下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、江蘇大學計算機學院課程設計報告課程名稱操作系統課程設計實驗學期2010至2011學年,第 L學期學生姓名周勇專業班級計算機0801學 號 3080602049指導教師詹永照開課系計算機科學系操作系統課程組制操作系統課程設計報告實驗題目:Linux系統管理實踐與設計時間:2010-12-27至進程控制、進程通信實現2011-01-02一、實驗目的與要求1、掌握基本的同步與互斥算法。2、學習使用Linux中基本的同步對象,掌握相關函數的使用方法。3、了解Linux中多進程的并發執行機制,實現進程的同步與互斥。4、查閱相關資料。5、熟悉各種命令、系統調用與實用程序。6、按給定功能設計相關程序。7、撰
2、寫課程設計報告。二、實驗內容桌上有一只盤子,盤子只能放5只水果,每次只能放一只水果或取出一只水 果。爸爸專放蘋果,媽媽專放橘子,兒子專等吃盤子中的橘子,女兒專等吃盤子 中的蘋果。分別用P,V操作實現他們的協作行為。三、實驗設備與環境實驗設備:虛擬機運行平臺:Linux語言:c四、設計正文(包括分析與設計思路、各模塊流程圖以及帶注釋的主要算法源碼)設計思路:設計4個進程,分別是父親進程,母親進程,兒子進程, 女兒進程。設置一個緩沖區,用來放水果,長度為5.所以設置一個公有信號量mutex,以限制他們對緩沖區的放和取,初值為1.另外設置私有信 號S2,S1.以控制兒子是否可以取橘子吃,女兒是否可以
3、取蘋果吃。 初值都為0.還要設置一個信號量 empty,控制父親跟母親之間的同 步,初值為5。表示現在緩沖區有5個空位可以放。各模塊流程圖:nn帶注釋的主要算法源碼:1. Co nn trol.c#include <sys/types.h>#include <stdio.h>#include <stdlib.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/sem.h>#include <errno.h>#include <string.h&g
4、t;#define SHMKEY 9075 /*共享存儲區的鍵*/#define SEMKEY_EMPTY 9085#define SEMKEY_S1 9086#define SEMKEY_S2 9087#define SEMKEY_MUTEX 9082* 信號量數組的鍵 */#define BUFF_LEN 5 /*緩沖區可以存放個水果 */#define FRUIT_LEN 12 /*水果用字符串代替*/void set_sembuf_struct( struct sembuf *sem, int semnum, int semop, int semflg)/*設置信號量結構*/sem-&
5、gt;sem_num=semnum;sem->sem_op=semop;sem->sem_flg=semflg;main()char *addr, end;int shmid;unsigned char in;int semid_empty, semid_s1,semid_s2, semid_mutex; /*信號量id*/struct sembuf sem_tmp;/*開辟共享存儲區*/if (shmid = shmget(SHMKEY, BUFF_LEN * FRUIT_LEN, 0777|IPC_CREAT|IPC_EXCL) = -1)if (errno = EEXIST)
6、printf("The Buffer Has Existed!n");printf( "Do You Want To Delete The Buffer(Y = yes)?n=:");scanf("%c", & end);if (end = 'y'| end ='Y')/*共享存儲區、信號量并不隨程序的結束而被刪除,如果我們沒刪除的話,可以用ipcs命令查看,用ipcrm刪除*/*釋放緩沖區*/shmid = shmget(SHMKEY, BUFF_LEN * FRUIT_LEN, 0777);
7、if (shmctl(shmid,IPC_RMID,0) < 0) perror( "shmctl:");/*同時釋放信號量*/semid_mutex = semget(SEMKEY_MUTEX,1,0777);semid_empty = semget(SEMKEY_EMPTY,1,0777); semid_s1 = semget(SEMKEY_S1,1,0777);semid_s2 = semget(SEMKEY_S2,1,0777); semctl(semid_mutex,0,IPC_RMID);semctl(semid_empty,0,IPC_RMID); se
8、mctl(semid_s1,0,IPC_RMID);semctl(semid_s2,0,IPC_RMID);elseprintf( "Fail To Create Buffer!n" );return -1;addr = ( char *)shmat(shmid, 0, 0);/* 連接緩沖區 */memset(addr, 0, BUFF_LEN * FRUIT_LEN); shmdt(addr); /* 離開緩沖區 */*創建信號量:1個用于對緩沖區互斥,3個用于父親、母親、兒子、女兒同步*/if (semid_mutex = semget(SEMKEY_MUTEX,1,
9、0777|IPC_CREAT|IPC_EXCL)=-1) if (errno = EEXIST)printf("The SEMKEY_MUTEX Has Existed!n");elseprintf("Fail To Create SEMKEY_MUTEX!n");return -1;if (semid_s1 = semget(SEMKEY_S1,1, 0777|IPC_CREAT|IPC_EXCL)=-1)if (errno = EEXIST)printf( "The SEMKEY_S1 Has Existed!n");elsepr
10、intf( "Fail To Create SEMKEY S1!n");return -1;if (semid_s2 = semget(SEMKEY_S2,1, 0777|IPC_CREAT|IPC_EXCL)=-1)if (errno = EEXIST)printf(else"The SEMKEY_S2 Has Existed!n");printf( "Fail To Create SEMKEY_S2!n" ); return -1;if (semid_empty = semget(SEMKEY_EMPTY,1,0777|IPC_C
11、REAT|IPC_EXCL)=-1) if (errno = EEXIST)printf("The SEM_EMPTY Has Existed!n");elseprintf("Fail To Create SEM_EMPTY!n");return -1;/*給信號量賦初值*/set_sembuf_struct(&sem_tmp, 0, BUFF_LEN, 0);/*BUFF_LEN*/semop(semid_empty, & sem_tmp,1);set_sembuf_struct (&sem_tmp, 0, 0, 0); sem
12、op(semid_s1, &sem_tmp,1);/*0*/set_sembuf_struct (&sem_tmp, 0, 0, 0); semop(semid_s2, &sem_tmp,1);/*0*/set_sembuf_struct (&sem_tmp, 0, 1,0); semop(semid_mutex, & sem_tmp,1);/*1*/return 0;2. Father.c/*下面的p,v是對系統調用的簡單封裝 */int P( int semid)struct sembuf p_buf;p_buf.sem_num = 0;p buf.
13、sem op = -1;p_buf.sem_flg = 0;if (semop(semid, &p_buf, 1)=-1)/*semop參見課件 ppt*/perror ( "p (semid) falsed" );exit (1);elsereturn (0);int V( int semid)struct sembuf v_buf; /*struct sembuf參見課件 ppt*/v_buf.sem_num = 0;v_buf.sem_op = 1;v_buf.sem_flg = 0;if (semop(semid, &v_buf, 1)=-1)per
14、ror (" v (semid) failed" );exit (1);elsereturn (0);main()char *p_buffer; /*共享存儲區地址*/unsigned char in; /*生產者存放產品的指針:它的值存放在全局緩沖區第一個字節*/int shmid; /*共享存儲區id*/int semid_empty, semid_s1,semid_s2, semid_mutex; /*信號量集合id*/shmid = shmget(SHMKEY, BUFF_LEN *FRUIT_LEN, 0777);/* 連接共享存儲區:2 存放 in,out 的值
15、 */p_buffer = ( char *)shmat(shmid, 0, 0);/* 取共享存儲區地址 */semid_mutex = semget(SEMKEY_MUTEX,1,0777);/* 獲取全局信號量 id*/semid_empty = semget(SEMKEY_EMPTY,1,0777);semid_s1 = semget(SEMKEY_S1,1,0777);semid_s2 = semget(SEMKEY_S2,1,0777);/*進入臨界區*/P(semid_empty); /*對私有信號量作F操作*/P(semid_mutex); /*對公有信號量作F操作*/*二者順
16、序不能換*/in = ( unsigned char )(*p_buffer);int j=0;"apple" )&&(*(p_buffer + in * FRUIT_LEN)!=);"apple""orange" )for (j=0;j<5;j+)if (*(p_buffer + in * FRUIT_LEN)!= printf("father put a apple!n"*(p_buffer + in * FRUIT_LEN)= break;in = (in + 1) % BUFF_LEN
17、;shmdt(p_buffer); /* 離開緩沖區 */*離開臨界區*/V(semid_s1);V(semid_mutex);3. Mother.c/*下面的p,v是對系統調用的簡單封裝 */int P( int semid)struct sembuf p_buf;p_buf.sem_num = 0;p_buf.sem_op = -1;p_buf.sem_flg = 0;if (semop(semid, &p_buf, 1)=-1)/*semop參見課件 ppt*/perror ( "p (semid) falsed" );exit (1);elsereturn
18、(0);int V( int semid)struct sembuf v_buf; /*struct sembuf 參見課件 ppt*/v_buf.sem_num = 0;v_buf.sem_op = 1;v_buf.sem_flg = 0;if (semop(semid, &v_buf, 1)=-1)perror (" v (semid) failed" );exit (1);elsereturn (0);main()char *p_buffer; /*共享存儲區地址*/unsigned char in; /*生產者存放產品的指針:它的值存放在全局緩沖區第一個字節
19、*/int shmid; /*共享存儲區id*/int semid_empty, semid_s1,semid_s2, semid_mutex; /*信號量集合id*/shmid = shmget(SHMKEY, BUFF_LEN * FRUIT_LEN, 0777);/* 連接共享存儲區:2 存放 in,out 的值 */p_buffer = ( char *)shmat(shmid, 0, 0);/* 取共享存儲區地址 */semid_mutex = semget(SEMKEY_MUTEX,1,0777);/* 獲取全局信號量 id*/semid_empty = semget(SEMKEY
20、_EMPTY,1,0777);semid_s1 = semget(SEMKEY_S1,1,0777);semid_s2 = semget(SEMKEY_S2,1,0777);/*進入臨界區*/P(semid_empty); /*對私有信號量作F操作*/P(semid_mutex); /*對公有信號量作F操作*/*二者順序不能換*/in = ( unsigned char )(*p_buffer);int j=0;for (j=0;j<5;j+)"apple" )&&(*(p_buffer + in * FRUIT_LEN)!= "orange
21、" );"orange"if (*(p_buffer + in * FRUIT_LEN)!= printf("mother put a orange!n"*(p_buffer + in * FRUIT_LEN)= break;in = (in + 1) % BUFF_LEN; shmdt(p_buffer); /* 離開緩沖區 */*離開臨界區*/V(semid_s2);V(semid_mutex);4.S on .c/*下面的p,v是對系統調用的簡單封裝 */int P( int semid)struct sembuf p buf;p_buf
22、.sem_num = 0;p_buf.sem_op = -1;p_buf.sem_flg = 0;if (semop(semid, &p_buf, 1)=-1)/*semop參見課件 ppt*/perror ( "p (semid) falsed" );exit (1);elsereturn (0);int V( int semid)struct sembuf v_buf; /*struct sembuf 參見課件 ppt*/v_buf.sem_num = 0;v_buf.sem_op = 1;v_buf.sem_flg = 0;if (semop(semid, &
23、amp;v_buf, 1)=-1)perror (" v (semid) failed" );exit (1);elsereturn (0);main()char *p_buffer; /*共享存儲區地址*/unsigned char in; /*生產者存放產品的指針:它的值存放在全局緩沖區第一個字節*/int shmid; /*共享存儲區id*/int semid_empty, semid_s1,semid_s2, semid_mutex; /*信號量集合id*/shmid = shmget(SHMKEY, BUFF_LEN * FRUIT_LEN, 0777);/* 連
24、接共享存儲區:2 存放 in,out 的值 */p_buffer = ( char *)shmat(shmid, 0, 0);/* 取共享存儲區地址 */semid_mutex = semget(SEMKEY_MUTEX,1,0777);/* 獲取全局信號量 id*/semid_empty = semget(SEMKEY_EMPTY,1,0777);semid_s1 = semget(SEMKEY_S1,1,0777);semid_s2 = semget(SEMKEY_S2,1,0777);/*進入臨界區*/P(semid s2);/*對私有信號量作P操作*/P(semid_mutex); /
25、*對公有信號量作F操作*/*二者順序不能換*/in = ( unsigned char )(*p_buffer);int j=0;printf( "son get a orange!n" );for (j=0;j<5;j+)if (*(p_buffer + in * FRUIT_LEN)= "orange" )*(p_buffer + in * FRUIT_LEN)='0'break;in = (in + 1) % BUFF_LEN;shmdt(p_buffer); /* 離開緩沖區 */*離開臨界區*/V(semid_empty)
26、;V(semid_mutex);/*下面的p,v是對系統調用的簡單封裝 */int P( int semid)struct sembuf p_buf;p_buf.sem_num = 0;p_buf.sem_op = -1;p_buf.sem_flg = 0;if (semop(semid, &p_buf, 1)=-1)/*semop參見課件 ppt*/perror ( "p (semid) falsed" );exit (1);elsereturn (0);int V( int semid)struct sembuf v_buf; /*struct sembuf參見
27、課件 ppt*/v_buf.sem_num = 0;v_buf.sem_op = 1;v_buf.sem_flg = 0;if (semop(semid, &v_buf, 1)=-1)perror (" v (semid) failed" );exit (1);elsereturn (0);main()char *p_buffer; /*共享存儲區地址*/unsigned char in; /*生產者存放產品的指針:它的值存放在全局緩沖區第一個字節*/int shmid; /*共享存儲區id*/int semid_empty, semid_s1,semid_s2,
28、semid_mutex; /*信號量集合id*/shmid = shmget(SHMKEY, BUFF_LEN * FRUIT_LEN, 0777);/* 連接共享存儲區:2 存放 in,out 的值 */p_buffer = ( char *)shmat(shmid, 0, 0);/* 取共享存儲區地址 */semid_mutex = semget(SEMKEY_MUTEX,1,0777);/* 獲取全局信號量 id*/semid_empty = semget(SEMKEY_EMPTY,1,0777);semid_s1 = semget(SEMKEY_S1,1,0777);semid_s2
29、= semget(SEMKEY_S2,1,0777);/*進入臨界區*/P(semid_s1); /*對私有信號量作P操作*/P(semid_mutex); /*對公有信號量作F操作*/*二者順序不能換*/in = ( unsigned char )(*p_buffer);int j=0;printf( "daughter get a apple!n" );for (j=0;j<5;j+)if (*(p_buffer + in * FRUIT_LEN)= "apple")*(p_buffer + in * FRUIT_LEN)='0'
30、;break;in = (in + 1) % BUFF_LEN;shmdt(p_buffer);/* 離開緩沖區 */*離開臨界區*/V(semid_empty);V(semid_mutex);五、實驗結果及分析放入了 5個水果,在執行父親進程,則該進程被阻塞roolLoci Ihast pu t an ang?!Irooiloca Ehost put an g r;)ngf 1rtjoiiocj I h()s tkc shef kt sbe | # k<? she Ji.Zin丄 /i:i./input mi crnngc!I rool tloca Ihos t k.e she#: .
31、 / fpm an apple!rnoiioca Iho? tkeihell JfIO此時執行兒子進程,吃掉一個橘子,緩沖區空位增1,喚醒了等待中的父親進程,此時父親可以放入一個橘子?raar>lci Itios t kcshe ./mc-a i an o r dngc pit jn nr jrtge !(ruotlocd Ihosi k-e 5 tie 1 fftoo I -Moca Etic it t keshe fl . /mea t an c range Jpy 1 3n orange I(root 1 nc itioi | ke shr 1, / srooiloea Itios
32、 t keihe ./mI an orange!put jn ot'je !root®locM Ihost heihe# ./sroo LCL'Iuca Itiu i t kt? tht fl . f fcat an oijIpu t s n pp 1 e !1 roollLho l k-E s tie | JtrooiInra Ihos t ke<;he A Vfput an app 1 e!'rooiicta Itios t./fput an appLe!rao ls t ke the fl此時橘子被吃完,再執行兒子進程,則被阻塞| 1Qi -rao
33、tloca Ihos I kestie# Nw ea t <1 n OTane !raa tPloca Itios L上KenL jn oTane!rootlocsIhoi ieshellea t a n oranp*1!raot$>loc3 llios I keshp# . /<i執行一次母親進程,放入一個橘子,來喚醒兒子進程,此時剛才的兒子進程執行,吃掉一個橘子root loca Lhostkeshejjt/mpu t an Grange I rn« t lfK3 Iho s tkr s-hej#./mpu L an orange I tool s'lu
34、ca Ihos tkc&he./mpul an orang*J ruu L 5'Iucj Ihu $ tke thefl./mpu 1 an orange J roo t loca 1 ha s Ikeshe>u a. i_b a h ur a_a. 打 V_I *mo t 譏 oca I ho s t e-a t an orange!roo t Moca Ihos t c-a t un or Jiigf !roa t laca I Ik)s t cji t aw orange !|roo tlocalho(t an orajige 'rcot 訓oca I he
35、 stke she /i kp vhe # k(Mh£ #Re 血 1#ke she J1緩沖區滿,執行母親進程,被阻塞ke she |U .Jc ke she J fl . / fke h he J Jikc shv H .Jit keshe# ./m 臨 xhp# Jrti ke she# . JmrooItic troo ib!1l)ca Jtiu s i put Jan 叩卩Ie !i QQtpu t an apple' rao pMcca Itic s t pul 3n Qrange J roollocalhos t put 汕 oraige roo i'l
36、oca I boat pu i aii of jne roo l'loca Jtiu s t執行兒子進程,吃掉一個橘子,此時喚醒剛才的母親進程,放入一個橘子3 run mji i iu ut ic lc lire nui icn i r - ytsrT覽枷巴 編種目 直和里巽諭I) 轉一f rooltQca lhoji l kcshr# *7cI rootloca Ihod I root ?t cd /honEruoiLceulhusL kcshtl# ./frooii:=locu host horn?“ cd shengput an app le !(roDl ioca Itiusi
37、 I shcii|t cd kc sihe;roollocaIhos! ke she=/fI root'ioca Ihos l ke sheM5put an apple1ea t an orange!rooiJor JhoK t keshf*lfl ./mroo tlDca Itios. l ke shelfiput an orange!rrnolloca lhos l kc sh<- Jt , /mput an orange!ruolloca Ihus i kc she jl =fmput an orange-rootloca Ihos l ke shefl a./mput a
38、n orange!rooiioca JhoK t kcshflJJ女兒吃完了蘋果,在執行女兒進程,則被阻塞eu I ait upp I e ! ruuihos?a I an app le ! Eroot 'Irca 】ho$eu I an appIe! rou t iJura ihu £&a! an nppI亡! Eroo t Ircai keslie I ./d I lie fie 1 # Vd I kehe Jdl1#執行父親進程,增加一個蘋果,喚醒剛才等待中的女兒進程,女兒吃掉一個蘋果pul an omnue!roo t 'Incs Ihn l ke s.he5 pul an upph!rootloca IbosLpul jn app Ie J| roo t .loca lh?!i E ke shejj./f"puI an a pp1e!too tloca Ihosi kc she4 J pul aji ppi亡!(fud t 'loca Ihus I kc she |droot <lDca I hu tea t
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 新解讀《CB-T 3848 - 1999船用扁圓形鑄鐵和鑄鋼法蘭》新解讀
- 超前小導管施工方案
- 墩柱施工方法及工藝
- 鈷基納米復合材料的制備及其ORR-OER電催化性能研究
- 《職業素養》課件 模塊1-4職業認知與職業道德 -數字技能
- 汽車傳感器與檢測技術電子教案:檢測的一般方法
- 地鐵公司辦公管理制度
- 華為客服服務管理制度
- 口腔義齒加工管理制度
- 物理中考一輪復習教案 十三講 從粒子到宇宙
- 寶安區義務教育入學信用承諾書模板
- 香丹注射液中吐溫80的含量測定
- 拖延癥主題班會課件
- 生產設備點檢記錄表
- 假發行業知識產品
- 項目策劃書模板文檔
- GB∕T 16895.21-2020 低壓電氣裝置 第4-41部分:安全防護 電擊防護
- 教師暑期集中培訓講稿PPT(校園突發事件的應對)
- DB23∕T 2418-2019 黑龍江省建筑工程質量鑒定技術標準
- 公司治理完整測試題【附答案】
- 汽車維修工時收費標準二類企業
評論
0/150
提交評論