《課程設(shè)計任務(wù)書 進程同步模擬設(shè)計——司機和售票員問題》由會員分享,可在線閱讀,更多相關(guān)《課程設(shè)計任務(wù)書 進程同步模擬設(shè)計——司機和售票員問題(9頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、個人資料整理,僅供個人學(xué)習(xí)使用
課程設(shè)計任務(wù)書
學(xué)生姓名:丁光明 專業(yè)班級: 計算機 0506
指導(dǎo)教師:何克右 工作單位: 計算機科學(xué)與技術(shù)學(xué)院
題 目 : 進程同步模擬設(shè)計 —— 司機和售票員問題
初始條件:
1.預(yù)備內(nèi)容:閱讀操作系統(tǒng)的進程管理章節(jié)內(nèi)容,對進程的同步和互斥,以及信號量機制度有深入的理解。
2.實踐準備:掌握一種計算機高級語言的使用。
要求完成的主要任務(wù) : (包括課程設(shè)計工作量及其技術(shù)要求,以及說明書撰寫等具體要求)
1.模擬公共汽車司機和售票員開關(guān)門及行車操作的同步模型。
2.設(shè)計報告內(nèi)容應(yīng)說明:
2、
⑴ 課程設(shè)計目的與功能;
⑵ 需求分析,數(shù)據(jù)結(jié)構(gòu)或模塊說明 (功能與框圖 );
⑶ 源程序的主要部分;
⑷ 測試用例,運行結(jié)果與運行情況分析;
⑸ 自我評價與總結(jié):
i )你認為你完成的設(shè)計哪些地方做得比較好或比較出色;
ii )什么地方做得不太好,以后如何改正;
iii )從本設(shè)計得到的收獲(在編寫,調(diào)試,執(zhí)行過程中的經(jīng)驗和教訓(xùn)) ;矚慫潤厲釤瘞睞櫪廡賴賃
軔。
iv )完成本題是否有其他的其他方法(如果有,簡要說明該方法) ;
v)對實驗題的評價和改進意見,請你推薦設(shè)計題目。
時間安排:
設(shè)計安排一周:周
3、 1、周 2:完成程序分析及設(shè)計。
周 2、周 3:完成程序調(diào)試及測試。
周 4、周 5:驗收、撰寫課程設(shè)計報告。
(注意事項:嚴禁抄襲,一旦發(fā)現(xiàn),抄與被抄的一律按 0 分記)
指導(dǎo)教師簽名: 年 月 日
系主任(或責(zé)任教師)簽名: 年 月 日
題 目 : 進程同步模擬設(shè)計 —— 司機和售票員問題
1.初始條件:
1.預(yù)備內(nèi)容:閱讀操作系統(tǒng)的進程管理章節(jié)內(nèi)容,對進程的同步和互斥,以及信號量機制
度有深入的理解。
2.實踐準備:掌握一種計算機高級語言的使用。
2 要求完成的主要任務(wù) :
2.1.模擬公
4、共汽車司機和售票員開關(guān)門及行車操作的同步模型。
在汽車行駛過程中, 司機活動與售票員活動之間的同步關(guān)系為:
售票員關(guān)車門后, 向司機發(fā)
開車信號, 司機接到開車信號后啟動車輛,
在汽車正常行駛過程中售票員售票,
到站時司機
停車, 售票員在車停后開門讓乘客上下車。
因此,司機啟動車輛的動作必須與售票員關(guān)車門
的動作取得同步;售票員開車門的動作也必須與司機停車取得同步。
聞創(chuàng)溝燴鐺險愛氌譴凈禍測。
司機 P1 售票員 P2
①啟動②關(guān)門③到站停④開門
正常運行 -售票 -關(guān)門-啟動-行駛-停-開門
為了安全起見:
5、
1 / 7
個人資料整理,僅供個人學(xué)習(xí)使用
(1) 關(guān)車門后才能啟動車輛 -啟動在關(guān)門之后
(2) 到站停車后,才能開車門 -開車門在到站停車之后
在計算機系統(tǒng)中可以將司機和售票員分別看作 P1、P2 兩個進程, 當它們并發(fā)地向前推進時,
計算機系統(tǒng)所接受到的實際上是司機活動與售票員活動的許多交叉中的任意一個交叉, 這些
交叉有些滿足上述要求, 有些則不滿足, 而操作系統(tǒng)必須保證不發(fā)生不滿足上述要求的交叉,
即: 殘騖樓諍錈瀨濟溆塹籟婭騍。
如 P2 尚未推進到②處時,而 P1 已推進到①處,則 P1 應(yīng)等待直到
6、 P2 推進到②處為止;如 P1 尚未推進到③時, P2 已到④,則 P2 應(yīng)等待直到 P1 推進到③處為止。
P1
在①處發(fā)生了等待,則
P2 執(zhí)行到②處時應(yīng)將
P1 喚醒;
P2
在④處發(fā)生了等待,
P1 到③處應(yīng)將
P2 喚醒
應(yīng)設(shè)置兩個信號量: S1
、 S2 ;
S1
表示是否允許司機啟動汽車(其初值為
0 ) ;
S2
表示是否允許售票員開門(其初值為
0 )。
用 P 、 v 原語描述如下:
int s1=O;
int s2=O;
main()
{
cobegin
driver
7、();
conductor();
coend
}
driver()
{
while(1)
{
p(s1);
啟動車輛 ;
正常行車 ;
到站停車 ;
v(s2);
}
}
conductor()
{
while(1)
{
關(guān)車門 ;
v(s1);
售票 ;
p(s2);
開車門 ;
上下乘客 ;
2 / 7
個人資料整理,僅供個人學(xué)習(xí)使用
}
}
2.2.設(shè)計報告內(nèi)容應(yīng)說明:
2.2.1 課程
8、設(shè)計目的與功能;
實驗?zāi)康模?
對進程的同步和互斥,以及信號量機制度有深入的理解。
一組相互合作的并發(fā)進程, 為了協(xié)調(diào)其推進速度, 有時需要相互等待與相互喚醒,
進程之間
這種相互制約的關(guān)系稱作進程同步,
雖然進程同步僅發(fā)生在相互有邏輯關(guān)系的進程之間,
這
種相互制約的關(guān)系稱作進程同步,
進程同步現(xiàn)象僅發(fā)生在相互有邏輯關(guān)系的進程之間,
這點
與進程互斥不同,進程互斥現(xiàn)象發(fā)生在任意兩個進程之間。
釅錒極額閉鎮(zhèn)檜豬訣錐顧葒。
與進程同步相關(guān)的另一概念是進程合作,
一組進程如果它們單獨執(zhí)行不能正常進行,
但并發(fā)
執(zhí)行可以正常進行,
9、 這種現(xiàn)象稱為進程合作,
參與進程合作的進程稱為合作進程,
如司機與
售票員的例子, 二者單獨執(zhí)行都不能正常進行,
但二者并發(fā)反可以正常進行, 成為合作進程,
這種進程合作的現(xiàn)象在操作系統(tǒng)中經(jīng)常發(fā)生。
彈貿(mào)攝爾霽斃攬磚鹵廡詒爾。
實驗功能:
編寫完程序后, 通過輸入程序給定的操作符對程序進行操作來實現(xiàn)司機與
售票員之間的進程同步關(guān)系。 對輸入的錯誤操作符有識別功能給予正確的提示, 對于那些不
符合實際情況的操作給予限制和提示。 例如車上人滿的時候要給予不能再上車的提示, 車上
沒人的時候要給予不能在下車的提示等等。 謀蕎摶篋飆鐸懟類蔣薔
10、點鉍。
2.2.2. 需求分析,數(shù)據(jù)結(jié)構(gòu)或模塊說明 (功能與框圖 );
問題描述:
有兩組并發(fā)進程 :司機和售票員 ,共享一組數(shù)據(jù)區(qū),進行司機開車和乘客上下車操作,要
求任一時刻 “只允許司機開車或乘客上下車操作。 廈礴懇蹣駢時盡繼價騷巹癩。
規(guī)則:
允許乘客同時執(zhí)行上下車操作;
不允許司機開車、乘客上下車同時操作;
司機和售票員的相互關(guān)系:
司機開車 —— 乘客上下車
互斥關(guān)系
11、
乘客上車 —— 乘客下車
允許
開始
具體分析:
buffer=1 ,n=36
(),若未滿,則可將
司機進程:產(chǎn)生一個數(shù)據(jù),當要送入緩沖區(qū)時,要檢查緩沖區(qū)是否已滿
數(shù)據(jù)送入緩沖區(qū),并通知售票員進程;否則,等待;
煢楨廣鰳鯡選塊網(wǎng)羈淚鍍齊。
售票員進程:當它去取數(shù)據(jù)時,
P2
若不為空,則取走一個數(shù)
要檢查緩沖區(qū)中是否有數(shù)據(jù)可取,
據(jù),并通知司機進程,否則,等待。
鵝婭盡損鵪
12、慘歷蘢鴛賴縈詰。
N
因為緩沖區(qū)是個臨界資源,諸進程對緩沖區(qū)進行操作的臨界區(qū),需要進行
buffer=1
互斥操作的處理。
Y
程序流程圖如下:
輸入操作數(shù) a
其中 buffer 表示進程同步信號量
n 表示車上的空余作為數(shù)
Y
a=1&
13、&
a=2&&
n<
n>=
a<=0//
a=
a=
p1 表示司機進程
n>0
n<36
=0
36
a>4
3
4
p2 表示售票員進程
buff
a 為輸入的操作符
er=1
籟叢媽羥為贍僨蟶n練--淨櫧撻。
n++
buffer=0
2.2.3. 源程序的主要部分;
14、
a=4
N
P1
3 / 7
buffer=1
Y
個人資料整理,僅供個人學(xué)習(xí)使用
#include
using namespace std;
int buffer=1;// 進程同步信號量
#define SIZE 36
int n=SIZE;
char a;
int p1();
int p2();
int p1()// 司機開車進程
{
if(buffer==0)
{
15、
cout<<" 汽車啟動準備離站 "<>a;
if((a==1)&&(n>
16、0))
{
n--;
cout<<" 上了一名乘客 "<=SIZE)
{
break;
}
else
cout<<" 乘客未全部下車,等待乘客
17、下車 "<4))
{
cout<<" 操作錯誤,請輸入正確的操作符 1-4"<=SIZE)
{
cout<<" 乘客已全部下車 "<
18、車到達終點站,乘客已全部下車,一天行程結(jié)束 "<
19、
個人資料整理,僅供個人學(xué)習(xí)使用
cout<<" 行程開始,汽車在起點站準備啟動 "<
20、正確。 但由于對程序的操作次數(shù)有限, 所以并不能看到程序的全部功能。 當輸入的操作符不合要求的時候, 程序會給出輸入錯誤提示, 由于車的容量有限, 當乘客上滿后,再對程序進行上車操作,程序也會給出車上乘客已滿無法上車的提示。當車上沒有乘客時,
再對程序進行下車操作,程序會給出車上乘客已全部下車的提示。 預(yù)頌圣鉉儐歲齦訝驊糴買闥。
2.2.5 自我評價與總結(jié):
設(shè)計的比較好和比較出色的地方:
這次課程設(shè)計基本上完成了實驗要求, 實現(xiàn)了司機與售票員之間的同步關(guān)系。 程序?qū)懙暮芎啙嵜髁耍俣?,很容易看懂?但達到了設(shè)計要求,并且有健全的判斷錯誤操作的能力和對
不正常操
21、作給予提示的能力,也很切合實際情況。 滲釤嗆儼勻諤鱉調(diào)硯錦鋇絨。
6 / 7
個人資料整理,僅供個人學(xué)習(xí)使用
設(shè)計的不好的地方及如何改進:
但是程序?qū)懙糜行┖唵?,只能進行有限的幾個簡單操作,局限性很大并不能應(yīng)用于實
際情況。 再對乘客進行上下車操作時也未對乘客的情況進行統(tǒng)計和記錄,
僅僅是體現(xiàn)出同步
關(guān)系,完成實驗要求,而未考慮的更深更遠,使程序更加復(fù)雜,功能更加健全。在設(shè)計時我
們應(yīng)該考慮的更多一些,使得自己的設(shè)計更有用,像用在公交車上的無人售票系統(tǒng)中等等。
鐃誅臥瀉噦圣騁貺頂廡縫勵。
22、
iii )從本設(shè)計得到的收獲(在編寫,調(diào)試,執(zhí)行過程中的經(jīng)驗和教訓(xùn))
;擁締鳳襪備訊顎輪爛薔報
贏。
這次設(shè)計實驗使我懂得了如何用
C++ 代碼來表示進程間的同步關(guān)系,
而不是用 P,V 信號量來
表示。程序編寫時發(fā)現(xiàn)信號量只用一個就足以表達司機和售票員之間的同步關(guān)系,
而不需要
使用 2 個。剛做完時程序功能很不健全只有中間過程而無頭無尾,
p1,p2 2 個函數(shù)輪流調(diào)用
程序始終終止不了, 就像沒有起點站和終點站的汽車一樣,
后來通過加入一個操作符和巧妙
的應(yīng)用同步信號量來實現(xiàn)了結(jié)束
2 個進程的操作。 寫程序時往
23、往考慮的都不是很周全,
有很
多細節(jié)很可能自己沒考慮到, 這就需要我們再寫完程序后在對程序的調(diào)試過程中發(fā)現(xiàn)這些細
節(jié)并修正程序,這樣才能寫出更好功能更健全的程序。
贓熱俁閫歲匱閶鄴鎵騷鯛漢。
進程同步最典型的表示方法就時利用
PV 信號量來表示,這種表示方法在上文已經(jīng)給出了。
這次實驗只是進程同步模擬設(shè)計的一個簡單的例子,
現(xiàn)實生活中還有很多這樣的例子,
書上
也列舉了很多像讀者與寫者的問題,
生產(chǎn)者和消費者的問題,
哲學(xué)家就餐問題等等,
這些都
是很好的設(shè)計題目 壇摶鄉(xiāng)囂懺蔞鍥鈴氈淚躋馱。
7 / 7