版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 《操作系統(tǒng)》</b></p><p> 題 目: 司機(jī)與售票員 </p><p> 班 級(jí): </p><p> 學(xué) 號(hào): </p><p>
2、作者姓名: </p><p> 指導(dǎo)教師: </p><p> 2013年12月28日</p><p> 目 錄</p><p><b> 一、設(shè)計(jì)思想1</b></p><p><b&
3、gt; 1.1設(shè)計(jì)目的1</b></p><p><b> 1.2需求分析1</b></p><p><b> 二、概要設(shè)計(jì)1</b></p><p> 2.1 設(shè)計(jì)內(nèi)容1</p><p> 2.2 數(shù)據(jù)結(jié)構(gòu)及模塊說明2</p><p> 2
4、.3開發(fā)環(huán)境與工具2</p><p><b> 三、程序代碼3</b></p><p><b> 四、運(yùn)行結(jié)果9</b></p><p><b> 五、心得體會(huì)10</b></p><p><b> 六、參考文獻(xiàn)10</b></p&
5、gt;<p><b> 一、設(shè)計(jì)思想</b></p><p><b> 1.1設(shè)計(jì)目的</b></p><p> 掌握信號(hào)的使用方法和PV 操作的定義,掌握使用PV 操作實(shí)現(xiàn)進(jìn)程之間同步和互斥的方法,加深對(duì)進(jìn)程同步互斥概念的理解。</p><p><b> 1.2需求分析</b>
6、</p><p> 本程序的功能是模擬公車的司機(jī)和售票員的開門以及行車的過程,其實(shí)也就是一個(gè)典型的進(jìn)程同步互斥問題,其中主要的兩點(diǎn)是</p><p> 1、司機(jī)開車的時(shí)候,售票員不能開門,(這里體現(xiàn)的是進(jìn)程的互斥問題)車停之后,由司機(jī)通知售票員開門(這里體現(xiàn)的是進(jìn)程的同步問題);</p><p> 2、車門開著的時(shí)候,司機(jī)不能開車,等售票員把車門關(guān)上之后,由售
7、票員通知司機(jī)開車。</p><p><b> 二、概要設(shè)計(jì)</b></p><p><b> 2.1設(shè)計(jì)內(nèi)容</b></p><p> 創(chuàng)建兩個(gè)進(jìn)程模擬售票員和汽車司機(jī)的同步行為,具體設(shè)計(jì)內(nèi)容:司機(jī)的活動(dòng):?jiǎn)?dòng)車輛,正常行車,到站停車。售票員活動(dòng):關(guān)車門,售票,開車門。當(dāng)發(fā)車時(shí)間到,售票員關(guān)好車門后,司機(jī)才能啟動(dòng)車輛
8、,售票員才開始售票。當(dāng)?shù)秸緯r(shí),司機(jī)停穩(wěn)車后,售票員才能打開車門,車上乘客先下車,然后站牌乘客上車。</p><p> 司機(jī)與售票員要協(xié)同工作:一方面只有售票員把門關(guān)好之后司機(jī)才可開車,因此售票員關(guān)好門之后要通知司機(jī)開車,然后售票;另一方面,也只有司機(jī)把車停下之后售票員才能開門讓乘客下車和上車,因此,此時(shí)司機(jī)應(yīng)通知售票員。汽車當(dāng)前正在始發(fā)站停車讓乘客讓乘客上車,因此,必須設(shè)置一定的信號(hào)量來實(shí)現(xiàn)他們之間的同步問題。
9、</p><p> 2.2數(shù)據(jù)結(jié)構(gòu)及模塊說明</p><p> 本程序的設(shè)計(jì)原理比較簡(jiǎn)單,就是兩大部分,一是司機(jī)的行車操作過程,另一個(gè)是售票員的開車門和關(guān)車門(以及售票,本程序不討論售票過程)的過程。</p><p> 把司機(jī)與售票員的信號(hào)量設(shè)置為全局變量,并把客車上的人數(shù):現(xiàn)在人數(shù)、下車人數(shù)、上車人數(shù)設(shè)置為全局變量;設(shè)置司機(jī)與售票員各自的線程??紤]到第一站和
10、最后一站的問題,應(yīng)單獨(dú)處理,故在各自的線程中分情況討論:</p><p> 由于下車的人數(shù)是隨機(jī)的,設(shè)計(jì)時(shí)考慮到了人數(shù)可能會(huì)超過客車的最大上限的問題。具體的思路是下面的圖示。</p><p> (a)司機(jī)的工作流程 (b)售票員的工作流程</p><p> 2.3開發(fā)環(huán)境與工具</p><p> 系統(tǒng)平臺(tái):Windows
11、7</p><p><b> 實(shí)現(xiàn)語言:C++</b></p><p> 開發(fā)工具:VC++6.0</p><p><b> 三、程序代碼</b></p><p> #include<stdlib.h></p><p> #include<stdi
12、o.h></p><p> #include<windows.h></p><p> #include<time.h></p><p> #define Total_num 50 //客車的最大容量 </p><p> #define Total_stop 4 //總的站數(shù) <
13、;/p><p><b> //全局變量 </b></p><p> int Recent_num=0; //某一時(shí)刻的客車上的人數(shù) </p><p> int Get_on_num; //上車的人數(shù) </p><p> int Get_off_num; //
14、下車的人數(shù) </p><p> int stop=1; //客車到達(dá)路線的站數(shù) </p><p> HANDLE Semaphore_driver; //Driver的信號(hào)量 </p><p> HANDLE Semaphore_conductor;//Conductor的信號(hào)量 </p><p>
15、//產(chǎn)生一定范圍的隨機(jī)數(shù),可避免下面程序的判斷是否超出客車的最大容量問題 </p><p> int Get_random(int min,int max)</p><p><b> {</b></p><p><b> int a;</b></p><p> srand((int)time
16、(0));</p><p><b> while(1)</b></p><p><b> {</b></p><p> a=rand()%(Total_num+1);</p><p> if(a>=min && a<=max)</p><p&g
17、t;<b> return a;</b></p><p><b> }</b></p><p><b> }</b></p><p> //Driver的線程 </p><p> DWORD WINAPI Thread_Driver(LPVOID Driver) &l
18、t;/p><p><b> {</b></p><p> while(stop<=Total_num)</p><p><b> {</b></p><p> if(stop==Total_stop)</p><p><b> {</b>&l
19、t;/p><p> WaitForSingleObject(Semaphore_driver,INFINITE);</p><p> printf("終點(diǎn)站到了\n");</p><p> printf("最后乘客:%d名\n",Recent_num); </p><p> ReleaseSemap
20、hore(Semaphore_conductor,1,NULL);</p><p> return 0; </p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p>
21、; if(stop==1) printf("第%d站出發(fā)\n啟動(dòng)車輛\n",stop);</p><p> else printf("第%d站到了\n",stop);</p><p> if(stop!=1) printf("到站停車\n");</p><p> ReleaseSemaphore(S
22、emaphore_conductor,1,NULL);// 增加信號(hào)量</p><p> WaitForSingleObject(Semaphore_driver,INFINITE);</p><p> printf("正常行車\n");</p><p> ReleaseSemaphore(Semaphore_conductor,1,NUL
23、L);</p><p><b> }</b></p><p> Sleep(1000);</p><p><b> }</b></p><p><b> return 0;</b></p><p><b> } </b>
24、;</p><p> //Conductor的線程 </p><p> DWORD WINAPI Thread_Conductor(LPVOID Conductor) </p><p><b> {</b></p><p><b> while(1)</b></p><
25、;p><b> {</b></p><p> if(stop<Total_stop)</p><p><b> {</b></p><p> WaitForSingleObject(Semaphore_conductor,INFINITE);</p><p> if(stop=
26、=1)</p><p><b> {</b></p><p> Get_on_num=Get_random(0,Total_num-Recent_num);</p><p> printf("有%d名乘客上車\n",Get_on_num); </p><p> Recent_num+=Get_
27、on_num; </p><p><b> } </b></p><p><b> else </b></p><p><b> {</b></p><p> printf("開車門\n");</p><p> Ge
28、t_off_num=Get_random(0,Recent_num);</p><p> printf("有%d名乘客下車\n",Get_off_num,stop);</p><p> Sleep(1000);//避免了時(shí)間的問題帶來的不是隨機(jī)數(shù)的現(xiàn)象 </p><p> Recent_num-=Get_off_num;</p>
29、<p> Get_on_num=Get_random(0,Total_num-Recent_num);</p><p> printf("有%d名乘客上車\n",Get_on_num,stop); </p><p> Recent_num+=Get_on_num;</p><p><b> }</b>&
30、lt;/p><p> printf("此時(shí)乘客:%d名\n",Recent_num); </p><p> printf("關(guān)車門\n");</p><p> ReleaseSemaphore(Semaphore_driver,1,NULL);</p><p> WaitForSingleObjec
31、t(Semaphore_conductor,INFINITE);</p><p> printf("售票\n"); </p><p> printf("\n\n\n\n");</p><p><b> stop++;</b></p><p><b> }</
32、b></p><p> if(stop==Total_stop){</p><p> ReleaseSemaphore(Semaphore_driver,1,NULL);</p><p> WaitForSingleObject(Semaphore_conductor,INFINITE);</p><p> printf(&qu
33、ot;開車門\n");</p><p> printf("所有乘客下車\n");</p><p><b> return 0;</b></p><p><b> } </b></p><p> Sleep(1000); </p><p&
34、gt;<b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> //主函數(shù) </p><p> int main()</p><p><b> {&l
35、t;/b></p><p> HANDLE Driver;</p><p> HANDLE Conductor; </p><p> Semaphore_driver=CreateSemaphore(NULL,0,1,"semaphore_driver"); //創(chuàng)建Driver的信號(hào)量 </p>&l
36、t;p> Semaphore_conductor=CreateSemaphore(NULL,0,1,"semaphore_conductor");//創(chuàng)建Conductor的信號(hào)量 </p><p> Driver=CreateThread(NULL,0,Thread_Driver,&Driver,0,NULL); //創(chuàng)建Driver的線程</p&
37、gt;<p> Conductor=CreateThread(NULL,0,Thread_Conductor,&Conductor,0,NULL); //創(chuàng)建Conductor的線程 </p><p> CloseHandle(Driver); //關(guān)閉Driver的線程 </p><
38、;p> CloseHandle(Conductor);//關(guān)閉Conductor的線程 </p><p> //GetLastError();</p><p><b> while(1);</b></p><p> system("pause");</p><p><b>
39、return 0;</b></p><p><b> }</b></p><p><b> 四、運(yùn)行結(jié)果</b></p><p><b> 五、心得體會(huì)</b></p><p> 1、因?yàn)樗緳C(jī)與售票員是兩條單獨(dú)處理的線程。程序先對(duì)司機(jī)的線程進(jìn)行設(shè)計(jì),接著再進(jìn)
40、行售票員的線程設(shè)計(jì)。因?yàn)閮烧呤切枰嗷f(xié)調(diào),又先后順序的,所以編起程序來比較復(fù)雜,而且很亂,尤其對(duì)于第一次接觸的我們而言。</p><p> 2、上下車的人數(shù)是隨機(jī)的,所以要使程序能夠判斷所出現(xiàn)的隨機(jī)數(shù)在汽車可以承載的最大容量之內(nèi)。</p><p> 3、C++語言基礎(chǔ)不是很好,所以編起程序來比較費(fèi)力,這種設(shè)計(jì)性的實(shí)驗(yàn)對(duì)于我們而言還是有一定的難度的,所以部分程序是參照網(wǎng)上的類似程序。&
41、lt;/p><p><b> 六、參考文獻(xiàn)</b></p><p> 《計(jì)算機(jī)操作系統(tǒng)》 西安電子科技大學(xué)出版社 </p><p> 《操作系統(tǒng)實(shí)驗(yàn)教程》清華大學(xué)出版社</p><p> 《操作系統(tǒng)原理與實(shí)踐教程》清華大學(xué)出版社</p><p> 《Windows 操作系統(tǒng)核心編程實(shí)驗(yàn)教程》
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 操作系統(tǒng)售票員與乘客
- 進(jìn)程同步模擬課程設(shè)計(jì)——司機(jī)和售票員問題
- 操作系統(tǒng)課程設(shè)計(jì)——操作系統(tǒng)課程設(shè)計(jì)模擬操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)-- 操作系統(tǒng)
- 售票員和汽車司機(jī)的進(jìn)程同步問題
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---geekos操作系統(tǒng)的研究與實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)-- geekos操作系統(tǒng)的研究與實(shí)現(xiàn)
- 操作系統(tǒng)課程設(shè)計(jì)題目
- 操作系統(tǒng)課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)論文
- 操作系統(tǒng)課程設(shè)計(jì) (4)
- 操作系統(tǒng)課程設(shè)計(jì)1
- 課程設(shè)計(jì)報(bào)告--操作系統(tǒng)
評(píng)論
0/150
提交評(píng)論