一、實習準備工作
1、熟悉實習任務,明確實習內容
根據實習任務書給定的或收集的原始資料和資料,結合實習要求,理清思路,明確實習內容。
2、規劃實習方案,準備實驗環境和工具
二、實習過程內容及方法、步驟
任務:生產者與消費者者問題應用—寄信人向郵箱投信和工作人員從郵箱中取信的多執行緒同步與互斥問題的模擬。
【任務描述】本系統會生成兩個執行緒,乙個是寄信人執行緒,模擬寄信人投信過程,它以隨機時間間隔向郵箱中投信;乙個是郵局工作人員執行緒,模擬工作人員取信的過程,它不定期地從郵箱中取信(之後,發往全國各地)。
【任務規格】
1、郵箱中總共有十個格仔;
2、寄信人每次只能投一封信,每封投入信箱的信件單獨佔乙個格仔;
3、工作人員取信時,每次只能取一封信,取完信後,所有郵件向右移動乙個格仔;
4、當信箱中十個格仔全空時,不能取信;(同步問題)
5、當郵箱中十個格仔全滿時,不能再向其中投信(同步問題)
6、寄信人執行緒和工作人員執行緒不能同時占用郵箱,即不能同時向郵箱中投信和取信(互斥問題)
說明:作業系統為了保證程序併發執行的可再現性,要求程式部分有序。這一部分有序的要求為併發程序間的相互制約關係。分同步與互斥兩類
--同步關係:多個程序共同完成乙個任務,它們之間必須協同動作, 互相配合,以達到同步。多個相關程序在執行速度上的制約,稱為同步關係。
--互斥關係 :系統中互斥資源的使用具有排它性,因此程序間往往因競爭同一資源而受到其它程序的制約。互斥關係是同步關係的特例。
【任務要求】
1、在單文件/檢視架下,使用多執行緒技術,在檢視類中模擬寄信取信過程。
【過程指導】
1、在檢視類的建構函式中,完成對郵箱變數、訊號量變數等的初始化。
(1)郵箱。十個格仔的郵箱用乙個陣列來實現。在標頭檔案中宣告變數:
int mailbox[10]。陣列中的每個元素表示乙個格仔,可以容納一封信。mailbox[i] = -1 :
表示第i個格仔中沒有信件;mailbox[i] 的值大於等於0 : 表示第i個格仔中已投放了信件。在建構函式中,該陣列的所有元素的值為-1(沒有信件)。
(2)郵箱與執行緒狀態。
在標頭檔案中宣告int id , 在建構函式中賦其值為0即:id= 0; 表示當前處理信件的編號;
在標頭檔案中宣告:
int front; // 可以存放郵件的起始位置
int rear; // 存放了郵件的終止位置
bool interruptput; // 是否中斷投信者執行緒
bool interruptget; // 是否中斷取信者執行緒
建構函式中,做如下的初始化:
front =9;
rear = 9;
interruptput = false;
interruptget = false;
郵箱示例:
上圖front的值為7,rear的值為9,表示:可以放郵件的位置為7,最後乙個郵件的編號為9。
若取了一封信後,第九的位置為空,所有郵件向右移動乙個格仔,front值變為8,狀態如下圖所示:
若投放了一封信後,第8號格仔放信,front值減1變為7,狀態如下圖所示:
(2)空訊號量:empty。用來同步執行緒。其計數大於0時,可以向信箱中投信,等於0時,投信過程掛起(等待)。
在檢視標頭檔案中宣告變數:handle empty;
在檢視類建構函式中建立建立該訊號量:
empty = createsemaphore(null,10,10,null);
注:函式createsemaphore原型:
handle createsemaphore(
lpsecurity_attributes lpsemaphoreattributes,
long linitialcount,
long lmaximumcount,
lpctstr lpname
);linitialcount表示訊號量中起始資源的數目;lmaximumcount表示訊號量中最大資源計數。
上例中,表示起始訊號量資源計數為10,最大數資源數為10。
(2)滿訊號量:full。用來同步執行緒。其計數大於0時,可以從信箱中取信,等於0時,取信過程掛起(無信可取,等待)。
在檢視標頭檔案中宣告變數:handle full;
在檢視類建構函式中建立建立該訊號量:
full = createsemaphore(null,0,10,null);
上例初值表示:有full訊號量開始時沒有資源(無信件),最大值為10。
(3)互斥訊號量:mutex。用來執行緒互斥。即保證每一時刻只有乙個執行緒占用郵箱。
在檢視標頭檔案中宣告變數:handle mutex;
在檢視類建構函式中建立建立該訊號量:
mutex = createmutex( null, false,"_mailbox_");
2、在檢視類的析構函式中完成對訊號量資源的釋放:
closehandle(mutex);
closehandle(empty);
closehandle(full);
3、修改選單,如圖所示:
4、執行緒的啟動。
參照作業系統《實驗七》。
5、執行緒的終止
參考**:
void cthreadssynchronizeview::onputstop投信者執行緒的終止
void cthreadssynchronizeview::ongetstop取信者執行緒的終止
注:**程的執行函式中,應對上述變數進行判斷,若其值為真,則退出函式的執行,此時也就終止了執行緒的執行。
6、參考框架程式(作業系統的理論**,若在windows上執行,還要進行改造)
寄信者執行緒:
…p(empty申請可用空緩衝
p(mutex申請訪問緩衝單元資源
c1完成投信過程,此處的過程要顯示在視窗中
v(mutex ); //釋放訪問緩衝單元資源
v(full釋放乙個滿緩衝, 取信者執行緒被喚醒
…取信者執行緒:
…p(full申請乙個滿緩衝
p(mutex申請訪問緩衝單元資源
c2將資料送入buffer
提取指標++
v(mutex ); //釋放訪問緩衝單元資源
v(empty釋放乙個空緩衝,投信者執行緒被喚醒…注:
(1)p(mutex)的實現:
waitforsingleobject(mutex,infinite);
(2)v(mutex )的實現
releasemutex(mutex);
(3)p(empty)的實現:
waitforsingleobject(empty,infinite);
(4)v(empty )的實現
releasesemaphore(empty,1,null);
(5)p(full)的實現:
waitforsingleobject(full,infinite);
(6)v(full )的實現
releasesemaphore(full,1,null);
三、實習中應考慮的主要問題
1、作業系統程式介面的作用
2、程序同步的api程式設計方法
3、多執行緒的建立方法
4、單執行緒與多執行緒的比較
四、實習資料說明
1、需完成的實習資料
實習報告、實習日誌、有關方案。
2、實習報告內容要求
(1)實習目的和任務
(2)簡述任務相關的知識和所需完成的功能。
(3)任務實驗結果、結果分析。附實驗資料、系統軟硬體環境、及有關說明
(4)實驗中遇到的主要問題及解決辦法。
(5)若有**,進行關鍵**段分析
(6)實習總結、心得體會。
五、主要參考資料
1、網路作業系統應用,高等教育出版社,柳青,(linux)
2、vc++授課資料
網路作業系統實習報告
1.理解網路作業系統的功能 2.掌握windows 2000中的使用者管理方法 3.掌握windows 2000網路常用元件的功能 屬性檢視及安裝方法 4.掌握windows 2000資料夾 印表機共享設定 訪問方法及安全設定。1.建立使用者,修改使用者屬性,設定使用者許可權 2.建立使用者組,設定...
作業系統課程實習報告
石家莊經濟學院 實習報告 學院 系 資訊工程學院 專業 電腦科學與技術 姓名 呂曉凱 班級 5111090303 學號 511109030316 指導教師 張有華 2012年 6 月 22 日 學號 511109030316 姓名 呂曉凱起迄日期 2012 6 13 2012 6 22 指導教師 張...
作業系統課程設計指導
一 本課程的教學目的及基本要求 1 教學目的 作業系統課程設計是作業系統課程的重要實踐環節,是作業系統課程內實驗的有益補充,它旨在培養學生的實踐能力,促進理論與實踐的結合。要求學生通過上機程式設計,了解如何模擬作業系統原理的實現,從而加深對作業系統原理的領會,加深對作業系統實現方法的理解,與此同時使...