編輯模擬多進(jìn)程共享臨界資源_第1頁
編輯模擬多進(jìn)程共享臨界資源_第2頁
編輯模擬多進(jìn)程共享臨界資源_第3頁
編輯模擬多進(jìn)程共享臨界資源_第4頁
編輯模擬多進(jìn)程共享臨界資源_第5頁
已閱讀5頁,還剩24頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上課 程 設(shè) 計(jì)課程設(shè)計(jì)名稱: 操作系統(tǒng)原理 專 業(yè) 班 級(jí) : 軟件1301 學(xué) 生 姓 名 : 理金龍 學(xué) 號(hào) : 6 指 導(dǎo) 教 師 : 劉於勛 課程設(shè)計(jì)時(shí)間: 2015年7月6-11日 軟件工程 專業(yè)課程設(shè)計(jì)任務(wù)書學(xué)生姓名理金龍專業(yè)班級(jí)軟件1301學(xué)號(hào)6題 目編程模擬多進(jìn)程共享臨界資源課題性質(zhì)其它課題來源自擬課題指導(dǎo)教師劉於勛同組姓名主要內(nèi)容要求產(chǎn)生3 個(gè)進(jìn)程:1、 兩個(gè)進(jìn)程模擬需要進(jìn)入臨界區(qū)的用戶進(jìn)程,當(dāng)需要進(jìn)入臨界區(qū)時(shí),顯示:“進(jìn)程x請(qǐng)求進(jìn)入臨界區(qū)”,同時(shí)向管理進(jìn)程提出申請(qǐng);申請(qǐng)返回,表示進(jìn)入了臨界區(qū)。在臨界區(qū)中等待一段隨機(jī)時(shí)間,并顯示:“進(jìn)程x 正在臨界區(qū)

2、”;當(dāng)時(shí)間結(jié)束,顯示:“進(jìn)程x 退出臨界區(qū)”,同時(shí)向管理進(jìn)程提出退出申請(qǐng);當(dāng)申請(qǐng)返回,顯示:“進(jìn)程x 已退出臨界區(qū)。”2、一個(gè)進(jìn)程作為原語的管理進(jìn)程,接受其他進(jìn)程的臨界區(qū)進(jìn)入請(qǐng)求:如果允許進(jìn)入,則設(shè)置相應(yīng)變量,然后返回;如果不允許進(jìn)入,則進(jìn)入循環(huán)等待,直到允許為止;3、對(duì)臨界區(qū)的訪問應(yīng)遵循空閑讓進(jìn)、忙則等待、有限等待、讓權(quán)等待的準(zhǔn)則。4、進(jìn)程間通信可以采用信號(hào)、消息傳遞、管道或網(wǎng)絡(luò)通信方式。任務(wù)要求理解多進(jìn)程共享臨界資源的原理,并編程實(shí)現(xiàn)參考文獻(xiàn)任滿杰等操作系統(tǒng)原理實(shí)用教程 電子工業(yè)出版社 2006湯子瀛 計(jì)算機(jī)操作系統(tǒng)(修訂版)西安電子科技大學(xué)出版社 2001張堯?qū)W 史美林計(jì)算機(jī)操作系統(tǒng)教程

3、實(shí)驗(yàn)指導(dǎo) 清華大學(xué)出版社 2000 羅宇等 操作系統(tǒng)課程設(shè)計(jì)機(jī)械工業(yè)出版社 2005審查意見指導(dǎo)教師簽字:教研室主任簽字: 2015 年 7 月 6 日 說明:本表由指導(dǎo)教師填寫,由教研室主任審核后下達(dá)給選題學(xué)生,裝訂在設(shè)計(jì)(論文)首頁信息科學(xué)與工程 學(xué)院課程設(shè)計(jì)成績?cè)u(píng)價(jià)表課程名稱:操作系統(tǒng)原理設(shè)計(jì)題目:編程模擬多進(jìn)程共享臨界資源專業(yè): 軟件工程 班級(jí):軟件1301 姓名:理金龍 學(xué)號(hào):6序號(hào)評(píng)審項(xiàng)目分 數(shù)滿分標(biāo)準(zhǔn)說明1內(nèi) 容思路清晰,語言表達(dá)準(zhǔn)確,概念清楚,論點(diǎn)正確;設(shè)計(jì)方法科學(xué),分析歸納合理;結(jié)論嚴(yán)謹(jǐn),設(shè)計(jì)有應(yīng)用價(jià)值。任務(wù)飽滿,工作量適中2創(chuàng) 新內(nèi)容新穎,設(shè)計(jì)能反映新技術(shù),對(duì)前人工作有改進(jìn)

4、或突破,或有獨(dú)特見解3完整性、實(shí)用性整體構(gòu)思后合理,理論依據(jù)充分,設(shè)計(jì)完整,實(shí)用性強(qiáng)4數(shù)據(jù)準(zhǔn)確、可靠數(shù)據(jù)準(zhǔn)確,算法設(shè)計(jì)合理5規(guī) 范 性設(shè)計(jì)格式、繪圖、實(shí)驗(yàn)數(shù)據(jù)、標(biāo)準(zhǔn)的運(yùn)用等符合有關(guān)標(biāo)準(zhǔn)和規(guī)定6紀(jì) 律 性遵守課程設(shè)計(jì)紀(jì)律,聽從指導(dǎo)教師安排,設(shè)計(jì)過程態(tài)度認(rèn)真7答 辯準(zhǔn)備充分,思路清晰、論點(diǎn)正確、對(duì)設(shè)計(jì)方案理解深入,問題回答有理有據(jù),簡明正確總 分綜合意見 指導(dǎo)教師 2015 年 7 月 12 日專心-專注-專業(yè)1 需求分析1、要求產(chǎn)生至少3個(gè)進(jìn)程:2、兩個(gè)進(jìn)程模擬需要進(jìn)入臨界區(qū)的用戶進(jìn)程,當(dāng)需要進(jìn)入臨界區(qū)時(shí),顯示:“進(jìn)程x請(qǐng)求進(jìn)入臨界區(qū)”,同時(shí)向管理進(jìn)程提出申請(qǐng);在臨界區(qū)中等待一段隨機(jī)時(shí)間,并顯示

5、:“進(jìn)程x正在臨界區(qū)”;當(dāng)時(shí)間結(jié)束,顯示:“進(jìn)程x退出臨界區(qū)”,同時(shí)向管理進(jìn)程提出退出申請(qǐng)。3、一個(gè)進(jìn)程作為原語級(jí)管理進(jìn)程,接受其他進(jìn)程的臨界區(qū)進(jìn)入請(qǐng)求:如果允許進(jìn)入,則設(shè)置相應(yīng)變量,然后返回;如果不允許進(jìn)入,則進(jìn)入循環(huán)等待,直到允許為止;4、對(duì)臨界區(qū)的訪問應(yīng)遵循空閑讓進(jìn)、忙則等待、有限等待、讓權(quán)等待的準(zhǔn)則。5、進(jìn)程間通信可以采用信號(hào)、消息傳遞、管道或網(wǎng)絡(luò)通信方式。2 概要設(shè)計(jì)2.1 其中包含兩個(gè)重要的數(shù)據(jù)結(jié)構(gòu):2.11 臨界區(qū):Struct crform Int sem; /臨界區(qū)的信號(hào)量值sem Int head; /臨界區(qū)等待隊(duì)列的頭,指向的是最先到的進(jìn)程 Int tail; /臨界區(qū)等

6、待隊(duì)列的尾,指向的是進(jìn)入等待隊(duì)列的進(jìn)程 Int duilie20; /存放的是等待的進(jìn)程的信息,以便喚醒待cr;Cr.sem=1; /初始臨界區(qū)信號(hào)量必須為一,因?yàn)橹辉试S一個(gè)進(jìn)程進(jìn)入臨界區(qū)Cr.head=0; /初始時(shí)指向等待隊(duì)列的第一個(gè)單元Cr.tail=0;2.12 消息隊(duì)列:Struct msgform Long msgtype; /消息的類型,在取消息隊(duì)列時(shí)用于區(qū)分哪些是該取的信息 Int mtext; /信息的內(nèi)容,在這里是申請(qǐng)|退出進(jìn)程的信息;2.2 進(jìn)程創(chuàng)建和控制:fork()系統(tǒng)調(diào)用: 關(guān)鍵的語句:int x,y;while(x=fork()=-1);/創(chuàng)建子進(jìn)程1if(x=0

7、) /子進(jìn)程1執(zhí)行程序段else while(y=fork()=-1); if(y=0) /子進(jìn)程2執(zhí)行程序段 else /父進(jìn)程執(zhí)行程序段2.3設(shè)計(jì)流程圖:圖1 用戶進(jìn)程流程圖圖 管理進(jìn)程圖3 申請(qǐng)進(jìn)入臨界區(qū)處理子進(jìn)程圖4 申請(qǐng)退出處理子程序3 運(yùn)行環(huán)境3.1 linux操作系統(tǒng)3.2 Gcc編譯器4 開發(fā)工具和編程語言4.1 開發(fā)工具:Gcc編譯器4.2 編程語言:C語言5 詳細(xì)設(shè)計(jì)子函數(shù)一:void into()/申請(qǐng)進(jìn)入臨界區(qū) struct msgform msg;key_t hh=ftok("OSP.c",1); int msgqid=msgget(hh,0666

8、|IPC_CREAT); cr.sem-;/一旦申請(qǐng)進(jìn)入臨界區(qū)就得減1 msgrcv(msgqid,&msg,4,1,0);/接收消息-申請(qǐng)進(jìn)入進(jìn)程發(fā)送的類型為1 msg.msgtype=(long)msg.mtext;/并把接收到的消息內(nèi)容作為回饋消息的消息類型 if(cr.sem>=0)/判斷此時(shí)進(jìn)程的狀態(tài),sem>=0 可以獲得臨界區(qū) if(msg.mtext=3) printf("進(jìn)程1: 進(jìn)入臨界區(qū)n"); else printf("進(jìn)程2: 進(jìn)入臨界區(qū)n"); msg.mtext=1;/現(xiàn)在允許進(jìn)入,發(fā)送內(nèi)容為1的消息給申

9、請(qǐng)進(jìn)程 msgsnd(msgqid,&msg,sizeof(int),0); Else/到等待隊(duì)列 if(msg.mtext=3) printf("進(jìn)程1: 進(jìn)入等待隊(duì)列n"); else printf("進(jìn)程2: 進(jìn)入等待隊(duì)列n"); cr.duiliecr.tail=msg.mtext; cr.tail+; if(cr.tail=20) cr.tail=0; msg.mtext=-1; msgsnd(msgqid,&msg,sizeof(int),0);/若臨界區(qū)忙,發(fā)送進(jìn)入等待隊(duì)列的消息給申請(qǐng)進(jìn)入的進(jìn)程 子函數(shù)二:void out(

10、)/申請(qǐng)退出臨界區(qū) struct msgform msg; key_t hh=ftok("OSP.c",1); int msgqid=msgget(hh,0666|IPC_CREAT); msgrcv(msgqid,&msg,4,2,0);/從消息隊(duì)列上取下申請(qǐng)退出的消息 cr.sem+; if(cr.tail!=cr.head)/查看等待隊(duì)列中是否有等待進(jìn)入臨界區(qū)的隊(duì)列 /有則喚醒等待隊(duì)列中等待的進(jìn)程,并允許申請(qǐng)退出的進(jìn)程退出 if(msg.mtext=3) printf("進(jìn)程1: 退出臨界區(qū)n"); else printf("進(jìn)程

11、2: 退出臨界區(qū)n"); msg.msgtype=msg.mtext; msg.mtext=0; msgsnd(msgqid,&msg,sizeof(int),0); int pid2=cr.duiliecr.head; cr.head+; if(cr.head=20) cr.head=0; msg.mtext=1; msg.msgtype=pid2; if(pid2=3) printf("進(jìn)程1: 進(jìn)入臨界區(qū)n"); else printf("進(jìn)程2: 進(jìn)入臨界區(qū)n"); msgsnd(msgqid,&msg,sizeof(i

12、nt),0); else /如果等待隊(duì)列上沒有等待進(jìn)入臨界區(qū)的進(jìn)程,直接向申請(qǐng)退出的進(jìn)程發(fā)送消息,允許退出 if(msg.mtext=3) printf("進(jìn)程1: 退出臨界區(qū)n"); else printf("進(jìn)程2: 退出臨界區(qū)n"); msg.msgtype=msg.mtext; msg.mtext=0; msgsnd(msgqid,&msg,sizeof(int),0); 6 調(diào)試分析在作這個(gè)課題過程中遇到了主要的這樣幾個(gè)問題:u 消息隊(duì)列不能正常使用錯(cuò)誤原因1: 消息隊(duì)列沒有建立成功解決辦法: 在用消息隊(duì)列之初先刪除這個(gè)隊(duì)列,然后再建立

13、使用錯(cuò)誤原因2: 取到的結(jié)果總出現(xiàn)錯(cuò)誤,沒有統(tǒng)一的消息類型解決辦法: 定制統(tǒng)一的消息類型規(guī)則,依照規(guī)則使用消息類型錯(cuò)誤原因3: 進(jìn)程需要的消息已經(jīng)被取走,使得進(jìn)程停留在取消息這一步不向下執(zhí)行解決辦法: 是程序邏輯上的問題,仔細(xì)查看程序流程并操控好使得可以處于正常邏輯u 申請(qǐng)到臨界區(qū)退出臨界區(qū)顯示滯后(如有時(shí)會(huì)顯示“進(jìn)程一 獲得臨界區(qū)”然后“進(jìn)程二 退出臨界區(qū)”)錯(cuò)誤原因: 在管理進(jìn)程中已經(jīng)將臨界區(qū)狀態(tài)修改為空閑,卻沒有顯示哪個(gè)進(jìn)程退出臨界區(qū),這個(gè)退出的信息必須等到子進(jìn)程上cpu時(shí)才會(huì)顯示出來,而這中間有別的進(jìn)程上cpu執(zhí)行申請(qǐng)的操作,就會(huì)獲得臨界區(qū),就會(huì)顯示“進(jìn)程獲得臨界區(qū)”,在此后退出臨界區(qū)

14、的進(jìn)程才上cpu顯示“退出臨界區(qū)”。解決辦法: 將顯示放到管理進(jìn)程中,一旦有進(jìn)程獲得臨界區(qū)或者退出臨界區(qū)就做出顯示。7 測試結(jié)果測試數(shù)據(jù):1,0; 1,2測試截圖:圖5 開始界面圖6 主程序運(yùn)行界面圖7 輸入1,暫停運(yùn)行圖8 輸入0,程序繼續(xù)運(yùn)行圖9 輸入2,程序退出運(yùn)行參考文獻(xiàn)1 任滿杰等操作系統(tǒng)原理實(shí)用教程 電子工業(yè)出版社 20062 湯子瀛 計(jì)算機(jī)操作系統(tǒng)(修訂版)西安電子科技大學(xué)出版社 20013 張堯?qū)W 史美林計(jì)算機(jī)操作系統(tǒng)教程實(shí)驗(yàn)指導(dǎo) 清華大學(xué)出版社 2000 4 羅宇等 操作系統(tǒng)課程設(shè)計(jì)機(jī)械工業(yè)出版社 20055 賽奎春、張雨 編著,Visual C+ 工程應(yīng)用與項(xiàng)目實(shí)踐,海洋出

15、版社,2005.1心得體會(huì)這次操作系統(tǒng)課設(shè)給了我很大的啟發(fā)和提高。一直以來自己我的編程基礎(chǔ)不太好,常出現(xiàn)邏輯混亂,不注重細(xì)節(jié)問題,在這門課中我有了更深的理解;科學(xué)是不允許錯(cuò)誤的,需要認(rèn)真嚴(yán)謹(jǐn)?shù)膽B(tài)度。也正是因?yàn)槿绱宋也庞辛诉M(jìn)步。理論聯(lián)系實(shí)際,總會(huì)有更深刻的收獲,通過這樣的實(shí)際思考,動(dòng)手修改操作,對(duì)理論有了深層次的理解,更加證實(shí)了理論,打消了心中不切實(shí)際的一些想法。慢慢的會(huì)形成自己的一個(gè)實(shí)際經(jīng)驗(yàn),為日后的工作學(xué)習(xí)打下心里和知識(shí)上的基礎(chǔ)。小學(xué)期的課程真是緊張而又充實(shí),確實(shí)是收獲很多,心中也增加了幾分自信,對(duì)未來的工作有更大的信息。程序源代碼(工程)第一部分:OSP.c#include <std

16、io.h>#include <stdlib.h>#include <unistd.h>#include <signal.h>#include <sys/types.h>#include <sys/msg.h>#include <sys/ipc.h>#include "ran.h"#define MSGKEY struct crform int sem; int head; int tail; int duilie20; cr;struct msgform long msgtype; int mte

17、xt; ;void into();void out();int main(void) puts("*提示信息*n");puts("在程序運(yùn)行過程中:n");puts("-輸入 0 繼續(xù)運(yùn)行程序n");puts("-輸入 1 暫停運(yùn)行程序n");puts("-輸入 2 退出程序n");puts("*n");int ppid=getpid();cr.sem = 1; cr.head=0; cr.tail=0;struct ShMeint num;int flags;int p1;

18、int p2;int shmid=shmget(IPC_PRIVATE,1024,0666|IPC_CREAT);if(shmid=-1)printf("共享內(nèi)存區(qū)創(chuàng)建錯(cuò)誤-n");exit(0); pid_t id = fork(); if (id<0) printf("新進(jìn)程創(chuàng)建錯(cuò)誤! 2秒后自動(dòng)退出。n"); sleep(2); exit(0); else if (id=0) pid_t id2 = fork(); if(id2<0) printf("新進(jìn)程創(chuàng)建錯(cuò)誤! 2秒后自動(dòng)退出。n"); sleep(2); e

19、xit(0); else if (id2=0) struct msgform msg; key_t hh=ftok("OSP.c",1); int msgqid=msgget(hh,0666|IPC_CREAT); struct ShMe * addr; addr=(struct ShMe*)shmat(shmid,0,0); if(addr=(struct ShMe*)-1) printf("映射內(nèi)存錯(cuò)誤1-n"); int flags=0; flags=addr->flags; (*addr).p1=getpid(); while(flags=

20、1|flags=0) if(flags=0) int q=10; msg.mtext=3; msg.msgtype=1; printf("進(jìn)程1: 申請(qǐng)進(jìn)入臨界區(qū)n"); msgsnd(msgqid,&msg,sizeof(int),0); kill(ppid,10); while(q>0) msgrcv(msgqid,&msg,sizeof(int),3,0); int m=msg.mtext; if(m=1) printf("進(jìn)程1: 進(jìn)入共享內(nèi)存區(qū)n"); int ny=addr->num; int dg=rannum(

21、); int uh=0; for(uh=0;uh<dg;uh+) ny+; ny=ny%(99999-10000+1)+10000; (*addr).num=ny; msg.msgtype=2; msg.mtext=3; printf("進(jìn)程1: 申請(qǐng)退出臨界區(qū)n"); msgsnd(msgqid,&msg,sizeof(int),0); kill(ppid,12); continue; else if(m=-1) q-; else if(m=0) int bb=rannum()%5; sleep(bb); flags=addr->flags; brea

22、k; else int bb=rannum()%5; sleep(bb); flags=addr->flags; else struct msgform msg; key_t hh=ftok("OSP.c",1); int msgqid=msgget(hh,0666|IPC_CREAT); struct ShMe * addr; addr=(struct ShMe*)shmat(shmid,0,0); if(addr=(struct ShMe*)-1) printf("映射內(nèi)存錯(cuò)誤1-n"); int flags=0; flags=addr->

23、;flags; (*addr).p2=getpid(); while(flags=1|flags=0) if(flags=0) int q=10; msg.mtext=4; msg.msgtype=1; printf("進(jìn)程2: 申請(qǐng)進(jìn)入臨界區(qū)n"); msgsnd(msgqid,&msg,sizeof(int),0); kill(ppid,10); while(q>0) msgrcv(msgqid,&msg,sizeof(int),4,0); int m=msg.mtext; if(m=1) printf("進(jìn)程2: 進(jìn)入臨界區(qū)n"

24、;); int ny=addr->num; int dg=rannum(); int uh=0; for(uh=0;uh<dg;uh+) ny+; ny=ny%(99999-10000+1)+10000; (*addr).num=ny; msg.msgtype=2; msg.mtext=4; printf("進(jìn)程2: 申請(qǐng)退出臨界區(qū)n"); msgsnd(msgqid,&msg,sizeof(int),0); kill(ppid,12); continue; else if(m=-1) q-; else if(m=0) int bb=rannum()%5

25、; sleep(bb); flags=addr->flags; break; else int bb=rannum()%5; sleep(bb); flags=addr->flags; else key_t hh=ftok("OSP.c",1); int msgqid=msgget(hh,0666|IPC_CREAT); struct ShMe * addr; addr=(struct ShMe*)shmat(shmid,0,0); if(addr=(struct ShMe*)-1) printf("映射內(nèi)存錯(cuò)誤3-n"); (*addr).

26、num=999; (*addr).flags=0; int flags=0; signal(10,into); signal(12,out); scanf("%d",&flags); while(flags=0 | flags=1) (*addr).flags=flags; scanf("%d",&flags); if(flags=2) (*addr).flags=flags; wait(addr->p1); wait(addr->p2); if(shmdt(addr)=-1) printf("共享內(nèi)存與控制進(jìn)程斷開

27、錯(cuò)誤.n"); if(shmctl(shmid,IPC_RMID,NULL)=-1) printf("shmctl delete errorn"); msgctl(msgqid,IPC_RMID, 0); printf("*程序退出n"); return EXIT_SUCCESS;void into() struct msgform msg;key_t hh=ftok("OSP.c",1); int msgqid=msgget(hh,0666|IPC_CREAT); cr.sem-; msgrcv(msgqid,&m

28、sg,4,1,0); msg.msgtype=(long)msg.mtext; if(cr.sem>=0) if(msg.mtext=3) printf("進(jìn)程1: 進(jìn)入臨界區(qū)n"); else printf("進(jìn)程2: 進(jìn)入臨界區(qū)n"); msg.mtext=1; msgsnd(msgqid,&msg,sizeof(int),0); else if(msg.mtext=3) printf("進(jìn)程1: 進(jìn)入等待隊(duì)列n"); else printf("進(jìn)程2: 進(jìn)入等待隊(duì)列n"); cr.duiliecr.tail=msg.mtext; cr.tail+; if(cr.tail=20) cr.tail=0; msg.mt

溫馨提示

  • 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)論