




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、一、課程設(shè)計(jì)目的本課程設(shè)計(jì)是學(xué)生學(xué)習(xí)完計(jì)算機(jī)操作系統(tǒng)課程后,進(jìn)行的一次全面的綜合訓(xùn)練,通過(guò)課程設(shè)計(jì),讓學(xué)生更好地掌握操作系統(tǒng)的原理及實(shí)現(xiàn)方法,加深對(duì)操作系統(tǒng)基礎(chǔ)理論和重要算法的理解,加強(qiáng)學(xué)生的動(dòng)手能力。二、課程設(shè)計(jì)要求從課程設(shè)計(jì)的目的出發(fā),通過(guò)設(shè)計(jì)工作的各個(gè)環(huán)節(jié),達(dá)到以下教學(xué)要求:每位同學(xué)從所給題目中任選一個(gè)(如自擬題目,需經(jīng)教師同意),且必須獨(dú)立完成課程設(shè)計(jì),不能相互抄襲。設(shè)計(jì)完成后,將所完成的作品交由老師檢查。要求寫(xiě)出一份詳細(xì)的設(shè)計(jì)報(bào)告。三、課程設(shè)計(jì)題目編程模擬多進(jìn)程共享臨界資源四、課程設(shè)計(jì)功能和目標(biāo)1、要求產(chǎn)生至少3個(gè)進(jìn)程:2、兩個(gè)進(jìn)程模擬需要進(jìn)入臨界區(qū)的用戶(hù)進(jìn)程,當(dāng)需要進(jìn)入臨界區(qū)時(shí),顯
2、示:“進(jìn)程x請(qǐng)求進(jìn)入臨界區(qū)”,同時(shí)向管理進(jìn)程提出申請(qǐng);在臨界區(qū)中等待一段隨機(jī)時(shí)間,并顯示:“進(jìn)程x正在臨界區(qū)”;當(dāng)時(shí)間結(jié)束,顯示:“進(jìn)程x退出臨界區(qū)”,同時(shí)向管理進(jìn)程提出退出申請(qǐng)。3、一個(gè)進(jìn)程作為原語(yǔ)級(jí)管理進(jìn)程,接受其他進(jìn)程的臨界區(qū)進(jìn)入請(qǐng)求:如果允許進(jìn)入,則設(shè)置相應(yīng)變量,然后返回;如果不允許進(jìn)入,則進(jìn)入循環(huán)等待,直到允許為止;4、對(duì)臨界區(qū)的訪問(wèn)應(yīng)遵循空閑讓進(jìn)、忙則等待、有限等待、讓權(quán)等待的準(zhǔn)則。5、進(jìn)程間通信可以采用信號(hào)、消息傳遞、管道或網(wǎng)絡(luò)通信方式。五、課程設(shè)計(jì)實(shí)現(xiàn)原理 通過(guò)編寫(xiě),創(chuàng)建兩個(gè)進(jìn)程模擬需要進(jìn)入臨界區(qū),另外編寫(xiě)一個(gè)進(jìn)程作為原語(yǔ)的管理進(jìn)程,其負(fù)責(zé)兩個(gè)進(jìn)程的進(jìn)入!接著設(shè)置一個(gè)臨界區(qū),讓
3、其進(jìn)程在其中訪問(wèn)遵循空閑讓進(jìn)、忙則等待、有限等待、讓權(quán)等待的準(zhǔn)則。當(dāng)進(jìn)程和臨界區(qū)建立好后,臨界區(qū)的數(shù)據(jù)傳輸,受到了系統(tǒng)硬件的支持,不耗費(fèi)多余的資源;而進(jìn)程間通信傳遞,由軟件進(jìn)行控制和實(shí)現(xiàn),需要消耗一定的CPU資源。從這個(gè)意義上講,臨界區(qū)更適合頻繁和大量的數(shù)據(jù)傳輸。進(jìn)程信息的傳遞,自身就帶有同步的控制。當(dāng)?shù)鹊叫畔⒌臅r(shí)候,進(jìn)程進(jìn)入睡眠狀態(tài),不再消耗CPU資源。而共享隊(duì)列如果不借助其他機(jī)制進(jìn)行同步,接收數(shù)據(jù)的一方必須進(jìn)行不斷的查詢(xún),白白浪費(fèi)了大量的CPU資源。六、課程設(shè)計(jì)思想、方法和技術(shù)(含數(shù)據(jù)結(jié)構(gòu)、算法、流程圖)6.1、 設(shè)計(jì)思想和設(shè)計(jì)函數(shù)功能:6.1.1 、總體構(gòu)思:軟件主要是由兩部分組成:用戶(hù)
4、進(jìn)程和管理進(jìn)程; 管理進(jìn)程:控制設(shè)置相應(yīng)的臨界區(qū),實(shí)現(xiàn)對(duì)臨界區(qū)的訪問(wèn)應(yīng)遵循空閑讓進(jìn)、忙則等待、有限等待、讓權(quán)等待的準(zhǔn)則。用戶(hù)進(jìn)程:循環(huán)的隨機(jī)申請(qǐng)進(jìn)入臨界區(qū),進(jìn)入臨界區(qū)執(zhí)行一段時(shí)間,再申請(qǐng)結(jié)束。6.1.2 、具體功能:用戶(hù)進(jìn)程隨機(jī)的進(jìn)入cpu執(zhí)行,先向在信息隊(duì)列中寫(xiě)入自己的信息(已經(jīng)約定好的信息類(lèi)型)然后給管理進(jìn)程發(fā)送信號(hào)(告知管理進(jìn)程申請(qǐng)進(jìn)入臨界區(qū)并已在消息隊(duì)列中寫(xiě)入自己的信息)。然后循環(huán)的讀取管理進(jìn)程給用戶(hù)進(jìn)程發(fā)回的回饋信息(針對(duì)當(dāng)前臨界區(qū)的狀態(tài))允許進(jìn)入、臨界區(qū)忙等待。如果允許進(jìn)入則在臨界區(qū)執(zhí)行一段時(shí)間以后,申請(qǐng)退出,給管理進(jìn)程發(fā)退出的信號(hào),管理進(jìn)程再給用戶(hù)進(jìn)程發(fā)送回饋信息。取會(huì)指導(dǎo)回饋信
5、息以后則這次過(guò)程結(jié)束,進(jìn)入新的過(guò)程。 管理進(jìn)程接收申請(qǐng)進(jìn)入的信號(hào),在消息隊(duì)列中取下申請(qǐng)進(jìn)入隊(duì)列的用戶(hù)進(jìn)程的信息,針對(duì)當(dāng)前臨界區(qū)狀態(tài),寫(xiě)一個(gè)回饋信息放入消息隊(duì)列。6.2、包含的數(shù)據(jù)結(jié)構(gòu)6.1.1 、臨界區(qū):Struct crform Int sem; /臨界區(qū)的信號(hào)量值sem Int head; /臨界區(qū)等待隊(duì)列的頭,指向的是最先到的進(jìn)程Int tail; /臨界區(qū)等待隊(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ì)列的
6、第一個(gè)單元Cr.tail=0;6.1.2 、消息隊(duì)列:Struct msgform Long msgtype; /消息的類(lèi)型,在取消息隊(duì)列時(shí)用于區(qū)分哪些是該取的信息 Int mtext; /信息的內(nèi)容,在這里是申請(qǐng)退出進(jìn)程的信息 ;6.3、主要用到的技術(shù)6.3.1進(jìn)程創(chuàng)建和控制:系統(tǒng)調(diào)用:fork()包含頭文件<unistd.h> 關(guān)鍵的語(yǔ)句: int x,y; while(x=fork()=-1);/創(chuàng)建子進(jìn)程1 if(x=0) /子進(jìn)程1執(zhí)行程序段 else while(y=fork()=-1); if(y=0) /子進(jìn)程2執(zhí)行程序段 else /父進(jìn)程執(zhí)行程序段 6.3.2軟
7、中斷:系統(tǒng)調(diào)用kill()和signal()包含頭文件:<sys/types.h>和<signal.h> Kill(pid,signalname) 發(fā)送信號(hào)給pid號(hào)為pid的進(jìn)程,中斷類(lèi)型為signalname6.3.3消息隊(duì)列:系統(tǒng)調(diào)用msgget()、msgsnd()、msgrev()、msgctl()包含頭文件:<sys/msg.h>6.4、設(shè)計(jì)流程圖圖1 用戶(hù)進(jìn)程流程圖圖2 管理進(jìn)程圖3 申請(qǐng)進(jìn)入臨界區(qū)處理子進(jìn)程圖4 申請(qǐng)退出處理子程序七、運(yùn)行環(huán)境Linux操作系統(tǒng)C+編譯器八、開(kāi)發(fā)工具和編程語(yǔ)言開(kāi)發(fā)工具:C+編譯器編程語(yǔ)言:C語(yǔ)言九、詳細(xì)設(shè)計(jì)子函
8、數(shù)一:void into()/申請(qǐng)進(jìn)入臨界區(qū) msgqid=msgget(MSGKEY,0777|IPC_CREAT); sem-;一旦申請(qǐng)進(jìn)入臨界區(qū),減一 msgrcv(msgqid,&msg,4,1,0); /接收消息-申請(qǐng)進(jìn)入進(jìn)程發(fā)送的類(lèi)型為1 msg.msgtype=msg.mtext; /并把接收到的消息內(nèi)容作為回饋消息的消息類(lèi)型 if(sem>=0) /判斷此時(shí)進(jìn)程的狀態(tài),sem>=0 可以獲得臨界區(qū) if(msg.mtext=3) printf(" p1 IN areann"); else printf(" p2 IN arean
9、n"); msg.mtext=1; /現(xiàn)在允許進(jìn)入,發(fā)送內(nèi)容為1的消息給申請(qǐng)進(jìn)程 msgsnd(msgqid,&msg,sizeof(int),0); else if(msg.mtext=3) printf(" p1 IN waitingnn"); else printf(" p2 IN waitingnn"); cr.duilietail=msg.mtext; tail+; msg.mtext=-1; msgsnd(msgqid,&msg,sizeof(int),0); /若臨界區(qū)忙,發(fā)送進(jìn)入等待隊(duì)列的消息給申請(qǐng)進(jìn)入的進(jìn)程 子
10、函數(shù)二: void out() msgqid=msgget(MSGKEY,0777|IPC_CREAT); msgrcv(msgqid,&msg,4,2,0); /從消息隊(duì)列上取下申請(qǐng)退出的消息 sem+; if(tail!=head) /查看等待隊(duì)列中是否有等待進(jìn)入臨界區(qū)的隊(duì)列 /有則喚醒等待隊(duì)列中等待的進(jìn)程,并允許申請(qǐng)退出的進(jìn)程退出 if(msg.mtext=3) printf(" p1 OUT areann"); else printf(" p2 OUT areann"); msg.msgtype=msg.mtext; msg.mtext=
11、0; msgsnd(msgqid,&msg,sizeof(int),0); pid2=cr.duilietail; tail+; msg.mtext=1; msg.msgtype=pid2; if(pid2=3) printf(" p1 IN areann"); else printf(" p2 IN areann"); msgsnd(msgqid,&msg,sizeof(int),0); msg.mtext=1; else/如果等待隊(duì)列上沒(méi)有等待進(jìn)入臨界區(qū)的進(jìn)程,直接向申請(qǐng)退出的進(jìn)程發(fā)送消息,允許退出 if(msg.mtext=3) p
12、rintf(" p1 OUT areann"); else printf(" p2 OUT areann"); msg.msgtype=msg.mtext; msg.mtext=0; msgsnd(msgqid,&msg,sizeof(int),0); int main() int sem=1; int head=0; int tail=0; int msgqid1; msgqid1=msgget(MSGKEY,0777); msgctl(msgqid1,IPC_RMID,NULL); int m1,m2; int q,t; int pid; q
13、=MAXTIMES; t=MAXTIMES; int count1,count2; struct msgform msg; int msgqid; pid=getpid(); signal(10,into); /建立連接,收到軟中斷后轉(zhuǎn)向INTO子處理程序signal(12,out); / 建立連接,收到軟中斷后轉(zhuǎn)向OUT子處理程序 msgqid=msgget(MSGKEY,0777|IPC_CREAT); /獲取消息隊(duì)列的隊(duì)列號(hào) while(p1=fork()=-1); if(p1=0) count1=10; while(count1>0) q=MAXTIMES; /設(shè)置有限等待次數(shù)
14、msg.mtext=3; msg.msgtype=1; /申請(qǐng)進(jìn)入臨界區(qū)的消息類(lèi)型都為1 printf(" p1 Qing IN areann"); msgsnd(msgqid,&msg,sizeof(int),0); /發(fā)送申請(qǐng)進(jìn)入的消息 kill(pid,10); /發(fā)送申請(qǐng)進(jìn)入的信號(hào) while(q>0) msgrcv(msgqid,&msg,sizeof(int),3,0); /接收管理進(jìn)程發(fā)送的回饋信息 m1=msg.mtext; if(m1=1) /判斷回饋信息,有三種情況:允許進(jìn)入,忙進(jìn)入等待隊(duì)列、允許退出 msg.msgtype=2;
15、msg.mtext=3; printf(" p1 Qing OUT areann"); msgsnd(msgqid,&msg,sizeof(int),0); kill(pid,12); continue; else if(m1=-1) q-; else if(m1=0) break; sleep(8); count1-; else while(p2=fork()=-1); if(p2=0) count2=10; while(count2>0) t=MAXTIMES; msg.mtext=4; msg.msgtype=1; printf(" p2 Qi
16、ng IN areann"); msgsnd(msgqid,&msg,sizeof(int),0); kill(pid,10); while(t>0) msgrcv(msgqid,&msg,4,4,0); m2=msg.mtext; if(m2=1) msg.msgtype=2; msg.mtext=4; printf(" p2 Qing OUT areann"); msgsnd(msgqid,&msg,sizeof(int),0); kill(pid,12); continue; else if(m2=0) break; sleep
17、(8); count2-; else while(1) sleep(8); 十 調(diào)試分析在作這個(gè)課題過(guò)程中遇到了主要的這樣幾個(gè)問(wèn)題:u 消息隊(duì)列不能正常使用錯(cuò)誤原因1: 消息隊(duì)列沒(méi)有建立成功解決辦法: 在用消息隊(duì)列之初先刪除這個(gè)隊(duì)列,然后再建立使用錯(cuò)誤原因2: 取到的結(jié)果總出現(xiàn)錯(cuò)誤,沒(méi)有統(tǒng)一的消息類(lèi)型解決辦法: 定制統(tǒng)一的消息類(lèi)型規(guī)則,依照規(guī)則使用消息類(lèi)型錯(cuò)誤原因3: 進(jìn)程需要的消息已經(jīng)被取走,使得進(jìn)程停留在取消息這一步不向下執(zhí)行解決辦法: 是程序邏輯上的問(wèn)題,仔細(xì)查看程序流程并操控好使得可以處于正常邏輯u 申請(qǐng)到臨界區(qū)退出臨界區(qū)顯示滯后(如有時(shí)會(huì)顯示“進(jìn)程一 獲得臨界區(qū)”然后“進(jìn)程二 退出臨
18、界區(qū)”)錯(cuò)誤原因: 在管理進(jìn)程中已經(jīng)將臨界區(qū)狀態(tài)修改為空閑,卻沒(méi)有顯示哪個(gè)進(jìn)程退出臨界區(qū),這個(gè)退出的信息必須等到子進(jìn)程上cpu時(shí)才會(huì)顯示出來(lái),而這中間有別的進(jìn)程上cpu執(zhí)行申請(qǐng)的操作,就會(huì)獲得臨界區(qū),就會(huì)顯示“進(jìn)程獲得臨界區(qū)”,在此后退出臨界區(qū)的進(jìn)程才上cpu顯示“退出臨界區(qū)”。解決辦法: 將顯示放到管理進(jìn)程中,一旦有進(jìn)程獲得臨界區(qū)或者退出臨界區(qū)就做出顯示。7 測(cè)試結(jié)果測(cè)試截圖:圖1 主程序運(yùn)行界面圖2 主程序運(yùn)行界面 圖3 主程序運(yùn)行界面參考文獻(xiàn)1 任滿(mǎn)杰等操作系統(tǒng)原理實(shí)用教程 電子工業(yè)出版社 2006任滿(mǎn)杰/dp/B0011BURI2/475-6225805-5830756?ie=UTF8
19、&*Version*=1&*entries*=02 張堯?qū)W 宋紅 張高編著計(jì)算機(jī)操作系統(tǒng)教程實(shí)驗(yàn)指導(dǎo) 清華大學(xué)出版社 第四版5 賽奎春、張雨 編著,Visual C+ 工程應(yīng)用與項(xiàng)目實(shí)踐,海洋出版社,2005.1心得體會(huì)這次操作系統(tǒng)課設(shè)給了我很大的啟發(fā)和提高。一直以來(lái)自己我的編程基礎(chǔ)不太好,常出現(xiàn)邏輯混亂,不注重細(xì)節(jié)問(wèn)題,在這門(mén)課中我有了更深的理解;科學(xué)是不允許錯(cuò)誤的,需要認(rèn)真嚴(yán)謹(jǐn)?shù)膽B(tài)度。也正是因?yàn)槿绱宋也庞辛诉M(jìn)步。理論聯(lián)系實(shí)際,總會(huì)有更深刻的收獲,通過(guò)這樣的實(shí)際思考,動(dòng)手修改操作,對(duì)理論有了深層次的理解,更加證實(shí)了理論,打消了心中不切實(shí)際的一些想法。慢慢的會(huì)形成自己的一個(gè)實(shí)際
20、經(jīng)驗(yàn),為日后的工作學(xué)習(xí)打下心里和知識(shí)上的基礎(chǔ)。小學(xué)期的課程真是緊張而又充實(shí),確實(shí)是收獲很多,心中也增加了幾分自信,對(duì)未來(lái)的工作有更大的信息。程序源代碼(工程)#include<stdio.h>#include<unistd.h>#include<stdlib.h>#include<sys/types.h>#include<sys/ipc.h>#include<sys/msg.h>#include<signal.h>#define MAXTIMES 5#define MSGKEY 56int p,p1,p2,pi
21、d1,pid2,pid3,pid4;int msgqid,*pint1,*pint2,*pint3,*pint4;struct crform int sem; int head; int tail; int duilie10;cr;int sem=1;int head=0;int tail=0;struct msgform long msgtype; int mtext;msg;void into() msgqid=msgget(MSGKEY,0777|IPC_CREAT); sem-; msgrcv(msgqid,&msg,4,1,0); msg.msgtype=msg.mtext;
22、 if(sem>=0) if(msg.mtext=3) printf(" p1 IN areann"); else printf(" p2 IN areann"); msg.mtext=1; msgsnd(msgqid,&msg,sizeof(int),0); else if(msg.mtext=3) printf(" p1 IN waitingnn"); else printf(" p2 IN waitingnn"); cr.duilietail=msg.mtext; tail+; msg.mtex
23、t=-1; msgsnd(msgqid,&msg,sizeof(int),0); void out() msgqid=msgget(MSGKEY,0777|IPC_CREAT); msgrcv(msgqid,&msg,4,2,0); sem+; if(tail!=head) if(msg.mtext=3) printf(" p1 OUT areann"); else printf(" p2 OUT areann"); msg.msgtype=msg.mtext; msg.mtext=0; msgsnd(msgqid,&msg,si
24、zeof(int),0); pid2=cr.duilietail; tail+; msg.mtext=1; msg.msgtype=pid2; if(pid2=3) printf(" p1 IN areann"); else printf(" p2 IN areann"); msgsnd(msgqid,&msg,sizeof(int),0); msg.mtext=1; else if(msg.mtext=3) printf(" p1 OUT areann"); else printf(" p2 OUT areann&
25、quot;); msg.msgtype=msg.mtext; msg.mtext=0; msgsnd(msgqid,&msg,sizeof(int),0); int main() int sem=1; int head=0; int tail=0; int msgqid1; msgqid1=msgget(MSGKEY,0777); msgctl(msgqid1,IPC_RMID,NULL); int m1,m2; int q,t; int pid; q=MAXTIMES; t=MAXTIMES; int count1,count2; struct msgform msg; int msgqid; pid=getpid(); signal(10,into); signal(12,out); msgqid=msgget(MSGKEY,0777|IPC_CREAT); while(p1=fork()=-1); if(p1=0) count1=10; while(count1>0) q=MAXTIMES; m
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 玻璃鋼管材的制造工藝與性能研究考核試卷
- 童車(chē)制造企業(yè)質(zhì)量控制與品質(zhì)提升策略考核試卷
- 會(huì)展智能多媒體信息發(fā)布考核試卷
- 畜牧業(yè)市場(chǎng)渠道拓展考核試卷
- 禮儀用品企業(yè)人力資源開(kāi)發(fā)考核試卷
- 電池材料合成與性能調(diào)控考核試卷
- 電機(jī)在電力安全監(jiān)控的應(yīng)用考核試卷
- 篷布企業(yè)團(tuán)隊(duì)建設(shè)考核試卷
- 四川職業(yè)技術(shù)學(xué)院《企業(yè)價(jià)值創(chuàng)造實(shí)戰(zhàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 四川省成都市都江堰市2025屆初三下學(xué)期尖子生化學(xué)試題含解析
- 扶濟(jì)復(fù)新獲獎(jiǎng)?wù)n件
- 外協(xié)救援服務(wù)協(xié)議
- 工業(yè)機(jī)器人的發(fā)展歷史
- DL∕T 2547-2022 交流斷面失電監(jiān)測(cè)裝置技術(shù)規(guī)范
- 2024年(中級(jí))嵌入式系統(tǒng)設(shè)計(jì)師軟考試題庫(kù)(含答案)
- 高齡患者的麻醉管理策略
- 小小科學(xué)家《物理》模擬試卷A(附答案)
- 2024年安徽蚌埠市國(guó)有資本運(yùn)營(yíng)控股集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 江蘇省無(wú)錫市2023-2024學(xué)年五年級(jí)下學(xué)期期中綜合測(cè)試數(shù)學(xué)試卷(蘇教版)
- 心內(nèi)科入科教育培訓(xùn)
- 題眾籌筑屋規(guī)劃方案設(shè)計(jì)樣本
評(píng)論
0/150
提交評(píng)論