《《實(shí)驗(yàn)指導(dǎo)書》word版.doc》由會(huì)員分享,可在線閱讀,更多相關(guān)《《實(shí)驗(yàn)指導(dǎo)書》word版.doc(69頁珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
操 作 系 統(tǒng)
實(shí) 驗(yàn) 指 導(dǎo) 書
適用專業(yè): 計(jì)算機(jī)科學(xué)技術(shù)
計(jì)算機(jī)應(yīng)用
電 子 專 業(yè)
安徽建筑工業(yè)學(xué)院 電子與信息工程 學(xué)院
2008 年 3 月
前 言
對(duì)計(jì)算機(jī)科學(xué)與技術(shù)及相關(guān)專業(yè)的學(xué)生而言,操作系統(tǒng)是一門重要的專業(yè)基礎(chǔ)課程。要學(xué)好操作系統(tǒng)的設(shè)計(jì)原理,除了聽課、看書、做習(xí)題外,最好的方法就是在實(shí)踐中進(jìn)行,包括使用操作系統(tǒng)、閱讀和分析已有操作系統(tǒng)的源代碼、自己設(shè)計(jì)小型系統(tǒng)/模塊或模擬算法等。從個(gè)人的角度而言,如果能夠完成MINUX源代碼的閱讀與分析,這將對(duì)掌握操作系統(tǒng)的原理與設(shè)計(jì)方法不無益處。這里,我沒有向大家推薦Linux或者FreeBSD之類的操作系統(tǒng)(雖然我從1997年就一直向?qū)W生推薦FreeBSD),是因?yàn)檫@里的閱讀源代碼的目標(biāo)是為了掌握操作系統(tǒng)的原理。孟子曰:“富貴不能淫,貧賤不能移,威武不能屈,此之謂大丈夫。”我的理解,即使不能夠按照孟老夫子的話去做大丈夫,如果能夠做到“時(shí)髦不能跟”,也就可以做真正的自己了。對(duì)我們課程的學(xué)習(xí),也就是這個(gè)道理吧。
對(duì)操作系統(tǒng)的實(shí)踐,教學(xué)計(jì)劃安排了8個(gè)課時(shí)的實(shí)驗(yàn)時(shí)間,這很不夠,希望大家能夠?qū)ψ约汉菀稽c(diǎn),創(chuàng)造自己進(jìn)行的操作系統(tǒng)實(shí)踐的環(huán)境與機(jī)會(huì)。
操作系統(tǒng)實(shí)踐,按深度可分為使用級(jí)、觀察級(jí)、系統(tǒng)管理級(jí)、源碼閱讀級(jí)和實(shí)現(xiàn)級(jí)等五個(gè)層次。具體地,
1. 使用級(jí):是指如何使用操作系統(tǒng),包括對(duì)命令(以及菜單和shell)、系統(tǒng)調(diào)用和系統(tǒng)文件的使用。
2. 觀察級(jí):是指通過使用級(jí)的接口,從外部觀察操作系統(tǒng)的內(nèi)部工作過程和結(jié)構(gòu)。
3. 系統(tǒng)管理級(jí):是指系統(tǒng)或設(shè)備的安裝、配置和性能調(diào)整。
4. 源碼閱讀級(jí):是指對(duì)現(xiàn)有操作系統(tǒng)部分內(nèi)核源代碼的閱讀。
5. 實(shí)現(xiàn)級(jí):是指編程模擬實(shí)現(xiàn)操作系統(tǒng)某些功能模塊。
上述五個(gè)層次的實(shí)踐,不同層次的實(shí)踐者可以根據(jù)自己的實(shí)際情況自主安排,在我給的實(shí)驗(yàn)指導(dǎo)中,當(dāng)前不會(huì)對(duì)各實(shí)驗(yàn)的層次明確區(qū)分,大家仁者見仁吧。
由于條件限制,只能夠提供Windows 2000 Professional/WindowsXP2作為大家實(shí)踐時(shí)使用的操作系統(tǒng)。希望大家能夠結(jié)合具體的實(shí)驗(yàn)要求以及實(shí)踐環(huán)境提前做好試驗(yàn)準(zhǔn)備。如果可能,給自己創(chuàng)造使用Unix或類Unix的實(shí)驗(yàn)環(huán)境。
上機(jī)前應(yīng)充分做好以下準(zhǔn)備工作:
1. 復(fù)習(xí)和掌握與本次實(shí)驗(yàn)有關(guān)的教學(xué)內(nèi)容。
2. 根據(jù)本次實(shí)驗(yàn)的內(nèi)容,在紙上編寫好準(zhǔn)備上機(jī)調(diào)試的程序,并初步檢查無誤。
3. 準(zhǔn)備好對(duì)程序進(jìn)行測(cè)試的數(shù)據(jù)。
4. 對(duì)每種測(cè)試數(shù)據(jù),給出預(yù)期的程序運(yùn)行結(jié)果。
5. 預(yù)習(xí)實(shí)驗(yàn)步驟,對(duì)實(shí)驗(yàn)步驟中提出的一些問題進(jìn)行思考。
上機(jī)實(shí)驗(yàn)后,應(yīng)及時(shí)寫出實(shí)驗(yàn)報(bào)告,實(shí)驗(yàn)報(bào)告應(yīng)包括以下內(nèi)容:
1. 實(shí)驗(yàn)?zāi)康暮蛢?nèi)容。
2. 程序說明,包括程序結(jié)構(gòu)、各模塊的算法。
3. 調(diào)試正確的源程序。
4. 程序運(yùn)行記錄(包括對(duì)不同測(cè)試數(shù)據(jù)的運(yùn)行結(jié)果)。
5. 針對(duì)實(shí)驗(yàn)中出現(xiàn)的問題,寫出解決辦法及對(duì)運(yùn)行結(jié)果的分析。
根據(jù)教學(xué)大綱與實(shí)驗(yàn)大綱的安排,本課程計(jì)劃進(jìn)行12課時(shí)上機(jī)試驗(yàn)。由于所有實(shí)驗(yàn)均涉及程序設(shè)計(jì)、數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計(jì)、操作系統(tǒng)等課程的多個(gè)知識(shí)點(diǎn),相關(guān)實(shí)驗(yàn)均為綜合實(shí)驗(yàn)。
針對(duì)具體的實(shí)驗(yàn)要求,本指導(dǎo)書附錄有大量的源代碼,供對(duì)相關(guān)算法不是很熟悉的同學(xué)參考。
本指導(dǎo)書適用于計(jì)算機(jī)科學(xué)技術(shù)、計(jì)算機(jī)應(yīng)用、電子專業(yè)學(xué)生學(xué)習(xí)計(jì)算機(jī)操作系統(tǒng)課程時(shí)實(shí)驗(yàn)使用,也適用于上述專業(yè)軟件實(shí)驗(yàn)課程中操作系統(tǒng)部分實(shí)驗(yàn)使用。
實(shí)驗(yàn)一:進(jìn)程管理
實(shí)驗(yàn)學(xué)時(shí):2
實(shí)驗(yàn)類型:(驗(yàn)證、綜合)
實(shí)驗(yàn)要求:(必修)
一、實(shí)驗(yàn)?zāi)康?
Windows NT內(nèi)核的操作系統(tǒng)是多任務(wù)操作系統(tǒng),對(duì)程與線程提供完整支持。本次實(shí)驗(yàn)意圖通過實(shí)踐掌握進(jìn)程的基本概念,理解進(jìn)程控制、進(jìn)程同步、經(jīng)典進(jìn)程的同步問題 、管程機(jī)制、進(jìn)程通信、線程;初步熟悉多進(jìn)程/多線程編程的特點(diǎn)。
二、實(shí)驗(yàn)內(nèi)容
本次實(shí)驗(yàn)的實(shí)驗(yàn)內(nèi)容包括:
1)使用taskmgr.exe觀察實(shí)驗(yàn)環(huán)境中的進(jìn)程信息;
2) 編程實(shí)現(xiàn)哲學(xué)家就餐問題或者讀寫者問題。
三、實(shí)驗(yàn)組織運(yùn)行要求
根據(jù)本實(shí)驗(yàn)的特點(diǎn)、要求和具體條件,宜采用“以學(xué)生自主訓(xùn)練為主的開放模式組織教學(xué)”。相關(guān)材料可以以書面資料(或電子版本)的形式分發(fā)給學(xué)生。學(xué)生自主練習(xí)、提問;教師針對(duì)性的輔導(dǎo)。
四、實(shí)驗(yàn)條件
- 硬件環(huán)境:Pentium 300MHz以上的微型計(jì)算機(jī);
- 操作系統(tǒng):Windows 2000或Windows XP;
- 編程環(huán)境:Visual C++ 6.0 企業(yè)版(算法模擬可以使用其它合適的C/C++編譯器或編程環(huán)境)。
五、實(shí)驗(yàn)步驟
具體實(shí)驗(yàn)步驟如下:
1. 首先使用taskmgr.exe程序觀察系統(tǒng)中運(yùn)行進(jìn)程的基本信息;
2. 使用taskmgr.exe程序觀察系統(tǒng)中運(yùn)行進(jìn)程的詳細(xì)信息;
3. 編碼實(shí)現(xiàn)哲學(xué)家就餐問題或者讀寫者問題。
六、思考題
1. 如何編程實(shí)現(xiàn)獲得進(jìn)程的詳細(xì)信息?
2. 編碼實(shí)現(xiàn)哲學(xué)家就餐問題時(shí)哲學(xué)家獲取筷子的策略是什么?
3. 讀寫者問題的實(shí)現(xiàn)中,什么是讀者優(yōu)先,什么是寫者優(yōu)先?
七、實(shí)驗(yàn)報(bào)告
學(xué)生在實(shí)驗(yàn)結(jié)束后必須完成實(shí)驗(yàn)報(bào)告。實(shí)驗(yàn)報(bào)告必須包括實(shí)驗(yàn)預(yù)習(xí)、實(shí)驗(yàn)記錄、思考題三部分內(nèi)容。實(shí)驗(yàn)記錄應(yīng)該忠實(shí)的描述操作過程,并提供操作步驟以及調(diào)試程序的源代碼。對(duì)思考題應(yīng)該能夠初步認(rèn)識(shí)。
具體實(shí)驗(yàn)報(bào)告的書寫按照實(shí)驗(yàn)報(bào)告紙的要求逐項(xiàng)完成。
八、其它說明
要求學(xué)生在實(shí)驗(yàn)過程中遵循如下的要求:
1. 準(zhǔn)時(shí)到達(dá)實(shí)驗(yàn)室,嚴(yán)格簽名方式的考勤制度。不允許代簽;
2. 遵循實(shí)驗(yàn)室的各種管理規(guī)定;
3. 服從教師和實(shí)驗(yàn)員的管理;
實(shí)驗(yàn)二:處理機(jī)調(diào)度
實(shí)驗(yàn)學(xué)時(shí):2
實(shí)驗(yàn)類型:(驗(yàn)證、綜合)
實(shí)驗(yàn)要求:(必修)
一、實(shí)驗(yàn)?zāi)康?
本實(shí)驗(yàn)?zāi)M在單處理機(jī)情況下的處理機(jī)調(diào)度,以期加深了解處理機(jī)調(diào)度算法;同時(shí),本次實(shí)驗(yàn)要求編程實(shí)現(xiàn)銀行家算法,以期加深對(duì)避免死鎖的理解。
二、實(shí)驗(yàn)內(nèi)容
1) 使用taskmgr.exe觀察實(shí)驗(yàn)環(huán)境中的進(jìn)程調(diào)度情況;
2) 編程實(shí)現(xiàn)一個(gè)調(diào)度算法,推薦實(shí)現(xiàn)ELLF算法。要求給出對(duì)隨機(jī)測(cè)試序列能夠給出調(diào)度次序;
3) 編程實(shí)現(xiàn)銀行家算法,要求在給定資源初始狀態(tài)后能夠動(dòng)態(tài)處理進(jìn)程的資源分配請(qǐng)求;
三、實(shí)驗(yàn)組織運(yùn)行要求
根據(jù)本實(shí)驗(yàn)的特點(diǎn)、要求和具體條件,宜采用“以學(xué)生自主訓(xùn)練為主的開放模式組織教學(xué)”。相關(guān)材料可以以書面資料(或電子版本)的形式分發(fā)給學(xué)生。學(xué)生自主練習(xí)、提問;教師針對(duì)性的輔導(dǎo)。
四、實(shí)驗(yàn)條件
- 硬件環(huán)境:Pentium 300MHz以上的微型計(jì)算機(jī);
- 操作系統(tǒng):Windows 2000或Windows XP;
- 編程環(huán)境:Visual C++ 6.0 企業(yè)版(算法模擬可以使用其它合適的C/C++編譯器或編程環(huán)境)。
五、思考題
1. ELLF算法與LLF算法的區(qū)別在什么地方?
2. 安全性檢查算法的邏輯基礎(chǔ)是什么?
六、實(shí)驗(yàn)報(bào)告
學(xué)生在實(shí)驗(yàn)結(jié)束后必須完成實(shí)驗(yàn)報(bào)告。實(shí)驗(yàn)報(bào)告必須包括實(shí)驗(yàn)預(yù)習(xí)、實(shí)驗(yàn)記錄、思考題三部分內(nèi)容。實(shí)驗(yàn)記錄應(yīng)該忠實(shí)的描述操作過程,并提供操作步驟以及調(diào)試程序的源代碼。對(duì)思考題應(yīng)該能夠初步認(rèn)識(shí)。
具體實(shí)驗(yàn)報(bào)告的書寫按照實(shí)驗(yàn)報(bào)告紙的要求逐項(xiàng)完成。
七、其它說明
要求學(xué)生在實(shí)驗(yàn)過程中遵循如下的要求:
1. 準(zhǔn)時(shí)到達(dá)實(shí)驗(yàn)室,嚴(yán)格簽名方式的考勤制度。不允許代簽;
2. 遵循實(shí)驗(yàn)室的各種管理規(guī)定;
3. 服從教師和實(shí)驗(yàn)員的管理;
實(shí)驗(yàn)三:存儲(chǔ)器管理
實(shí)驗(yàn)學(xué)時(shí):2
實(shí)驗(yàn)類型:(驗(yàn)證、綜合)
實(shí)驗(yàn)要求:(必修)
一、實(shí)驗(yàn)?zāi)康?
本次實(shí)驗(yàn)旨在通過使用操作系統(tǒng)內(nèi)存分配信息的動(dòng)態(tài)觀察以及存儲(chǔ)器管理算法的實(shí)現(xiàn),加深對(duì)內(nèi)存分配原理的理解(重點(diǎn)加深對(duì)請(qǐng)求式分頁存儲(chǔ)管理方式的理解)。同時(shí)通過相關(guān)算法的實(shí)現(xiàn),熟悉頁面置換算法及其性能。
二、實(shí)驗(yàn)內(nèi)容
1) 使用taskmgr.exe觀察實(shí)驗(yàn)環(huán)境中的進(jìn)程生命周期內(nèi)系統(tǒng)內(nèi)存分配變化情況;
2) 編程實(shí)現(xiàn)請(qǐng)求分頁管理方式時(shí)的地址變換過程;
3) 編程實(shí)現(xiàn)OPT或者FIFO算法
4) 編程實(shí)現(xiàn)LRU算法;
三、實(shí)驗(yàn)組織運(yùn)行要求
根據(jù)本實(shí)驗(yàn)的特點(diǎn)、要求和具體條件,宜采用“以學(xué)生自主訓(xùn)練為主的開放模式組織教學(xué)”。相關(guān)材料可以以書面資料(或電子版本)的形式分發(fā)給學(xué)生。學(xué)生自主練習(xí)、提問;教師針對(duì)性的輔導(dǎo)。
四、實(shí)驗(yàn)條件
- 硬件環(huán)境:Pentium 300MHz以上的微型計(jì)算機(jī);
- 操作系統(tǒng):Windows 2000或Windows XP;
- 編程環(huán)境:Visual C++ 6.0 企業(yè)版(算法模擬可以使用其它合適的C/C++編譯器或編程環(huán)境)。
五、思考題
1. OPT算法是否具備實(shí)用性??
2. OPT算法與LRU算法的區(qū)別是什么?
3. 虛擬存儲(chǔ)器的主要特征有哪些?
六、實(shí)驗(yàn)報(bào)告
學(xué)生在實(shí)驗(yàn)結(jié)束后必須完成實(shí)驗(yàn)報(bào)告。實(shí)驗(yàn)報(bào)告必須包括實(shí)驗(yàn)預(yù)習(xí)、實(shí)驗(yàn)記錄、思考題三部分內(nèi)容。實(shí)驗(yàn)記錄應(yīng)該忠實(shí)的描述操作過程,并提供操作步驟以及調(diào)試程序的源代碼。對(duì)思考題應(yīng)該能夠初步認(rèn)識(shí)。
具體實(shí)驗(yàn)報(bào)告的書寫按照實(shí)驗(yàn)報(bào)告紙的要求逐項(xiàng)完成。
七、其它說明
要求學(xué)生在實(shí)驗(yàn)過程中遵循如下的要求:
1. 準(zhǔn)時(shí)到達(dá)實(shí)驗(yàn)室,嚴(yán)格簽名方式的考勤制度。不允許代簽;
2. 遵循實(shí)驗(yàn)室的各種管理規(guī)定;
3. 服從教師和實(shí)驗(yàn)員的管理;
實(shí)驗(yàn)四:文件管理
實(shí)驗(yàn)學(xué)時(shí):2
實(shí)驗(yàn)類型:(驗(yàn)證、綜合)
實(shí)驗(yàn)要求:(必修)
一、實(shí)驗(yàn)?zāi)康?
本次實(shí)驗(yàn)旨在通過實(shí)踐了解文件管理原理與方法,重點(diǎn)加深對(duì)外存分配方式和文件空閑存儲(chǔ)空間的理解。
二、實(shí)驗(yàn)內(nèi)容
1) 了解使用計(jì)算機(jī)系統(tǒng)的文件系統(tǒng)的格式;
2) 編程實(shí)現(xiàn)連續(xù)分配、鏈接分配、索引分配等三種外存分配方式;
2) 編程實(shí)現(xiàn)空閑表法、位示圖法連續(xù)分配、成組鏈接法等三種文件存儲(chǔ)空間管理方式
三、實(shí)驗(yàn)組織運(yùn)行要求
根據(jù)本實(shí)驗(yàn)的特點(diǎn)、要求和具體條件,宜采用“以學(xué)生自主訓(xùn)練為主的開放模式組織教學(xué)”。相關(guān)材料可以以書面資料(或電子版本)的形式分發(fā)給學(xué)生。學(xué)生自主練習(xí)、提問;教師針對(duì)性的輔導(dǎo)。
本次實(shí)驗(yàn)內(nèi)容很多,閾于課時(shí)限制,編程可能無法全部完成。對(duì)實(shí)驗(yàn)內(nèi)容中2)、3)(外存分配方式、文件存儲(chǔ)空間管理方式)要求的6個(gè)編程要求,可以分成:a) 連續(xù)分配與鏈接分配、b) 索引分配、c) 空閑表法與位示圖法連續(xù)分配、d) 成組鏈接法等四組,要求在實(shí)驗(yàn)課時(shí)內(nèi)至少完成一組的編程。
四、實(shí)驗(yàn)條件
- 硬件環(huán)境:Pentium 300MHz以上的微型計(jì)算機(jī);
- 操作系統(tǒng):Windows 2000或Windows XP;
- 編程環(huán)境:Visual C++ 6.0 企業(yè)版(算法模擬可以使用其它合適的C/C++編譯器或編程環(huán)境)。
五、思考題
1. 實(shí)驗(yàn)使用的計(jì)算機(jī)系用中,術(shù)語文件夾與文件管理中的概念一致?
2. 連續(xù)分配、鏈接分配、索引分配等三種外存分配方式的特點(diǎn)以及彼此之間的差異是什么?
3. 空閑表法、位示圖法連續(xù)分配、成組鏈接法三種文件存儲(chǔ)空間管理方式的特點(diǎn)以及彼此之間的差異有哪些?
六、實(shí)驗(yàn)報(bào)告
學(xué)生在實(shí)驗(yàn)結(jié)束后必須完成實(shí)驗(yàn)報(bào)告。實(shí)驗(yàn)報(bào)告必須包括實(shí)驗(yàn)預(yù)習(xí)、實(shí)驗(yàn)記錄、思考題三部分內(nèi)容。實(shí)驗(yàn)記錄應(yīng)該忠實(shí)的描述操作過程,并提供操作步驟以及調(diào)試程序的源代碼。對(duì)思考題應(yīng)該能夠初步認(rèn)識(shí)。
具體實(shí)驗(yàn)報(bào)告的書寫按照實(shí)驗(yàn)報(bào)告紙的要求逐項(xiàng)完成。
七、其它說明
要求學(xué)生在實(shí)驗(yàn)過程中遵循如下的要求:
1. 準(zhǔn)時(shí)到達(dá)實(shí)驗(yàn)室,嚴(yán)格簽名方式的考勤制度。不允許代簽;
2. 遵循實(shí)驗(yàn)室的各種管理規(guī)定;
3. 服從教師和實(shí)驗(yàn)員的管理;
附錄一、讀寫者問題源代碼
#include "windows.h"
#include
#include
#include
#include
#include
#include
#define READER R
#define WRITER W
#define INTE_PER_SEC 1000
#define MAX_THREAD_NUM 64
#define MAX_FILE_NUM 32
#define MAX_STR_LEN 32
int readcount=0;
int writecount=0;
CRITICAL_SECTION RP_Write;
CRITICAL_SECTION cs_Write;
CRITICAL_SECTION cs_Read;
struct ThreadInfo
{int serial;
char entity;
double delay;
double persist;
};
////////////////////////////////////////////
//讀者優(yōu)先——讀者線程
// p 讀者線程信息
void RP_ReaderThread(void *p)
{
//互斥變量
HANDLE h_Mutex;
h_Mutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex for readcount");
DWORD wait_for_mutex; //等待互斥變量所有權(quán)
DWORD m_delay; //延遲時(shí)間
DWORD m_persist; //讀文件持續(xù)時(shí)間
int m_serial; //線程序號(hào)
//從參數(shù)中獲得信息
m_serial=((ThreadInfo *)(p))->serial;
m_delay=(DWORD)(((ThreadInfo *)(p))->delay*INTE_PER_SEC);
m_persist=(DWORD)(((ThreadInfo *)(p))->persist*INTE_PER_SEC);
Sleep(m_delay); //延遲等待
printf("reader thread %d sends the reading require.\n",m_serial);
//等待互斥信號(hào),保證對(duì)readcount的訪問、修改互斥
wait_for_mutex=WaitForSingleObject(h_Mutex,-1);
//讀者數(shù)目增加
readcount++;
if(readcount==1)
{
//第一個(gè)讀者,等待資源
EnterCriticalSection(&RP_Write);
}
ReleaseMutex(h_Mutex); //釋放互斥信號(hào)
//讀文件
printf("reader thread %d begins to read file.\n",m_serial);
Sleep(m_persist);
//退出線程
printf("reader thread %d finished the reading file.\n",m_serial);
//等待互斥信號(hào),保證對(duì)readcount的訪問,修改互斥
wait_for_mutex=WaitForSingleObject(h_Mutex,-1);
//讀者數(shù)目減少
readcount--;
if(readcount==0)
{
//如果所有讀者讀完,喚醒寫者
LeaveCriticalSection(&RP_Write);
}
ReleaseMutex(h_Mutex); //釋放互斥信號(hào)
}
////////////////////////////////////////////
//讀者優(yōu)先——寫者線程
// p 寫者線程信息
void RP_WriterThread(void *p)
{
DWORD m_delay; //延遲時(shí)間
DWORD m_persist; //讀文件持續(xù)時(shí)間
int m_serial; //線程序號(hào)
//從參數(shù)中獲得信息
m_serial=((ThreadInfo *)(p))->serial;
m_delay=(DWORD)(((ThreadInfo *)(p))->delay*INTE_PER_SEC);
m_persist=(DWORD)(((ThreadInfo *)(p))->persist*INTE_PER_SEC);
Sleep(m_delay); //延遲等待
printf("Writer thread %d sends the writing require.\n",m_serial);
//等待資源
EnterCriticalSection(&RP_Write);
//寫文件
printf("writer thread %d begins to write to the file.\n",m_serial);
Sleep(m_persist);
//退出線程
printf("writer thread %d finished the writting file.\n",m_serial);
//釋放資源
LeaveCriticalSection(&RP_Write);
}
////////////////////////////////////////////////////
//讀者優(yōu)先處理函數(shù)
//file 文件名
void ReaderPriority(char *file)
{DWORD n_thread=0; //線程數(shù)目
DWORD thread_ID; //線程ID
DWORD wait_for_all; //等待所有線程結(jié)束
//互斥對(duì)象
HANDLE h_Mutex;
h_Mutex=CreateMutex(NULL,FALSE,"mutex for read_counter");
//線程對(duì)象的數(shù)組
HANDLE h_Thread[MAX_THREAD_NUM];
ThreadInfo thread_info[MAX_THREAD_NUM];
readcount=0; //初始化readcount
InitializeCriticalSection(&RP_Write); //初始化臨界區(qū)
ifstream inFile(file);
//ifstream inFile;
//inFile.open(file); //打開文件
printf("reader Priority:\n\n");
/// if(!inFile) return;//如文件未打開,則返回
///while(!inFile.eof())//如文件未到文件尾,則讀文件信息
while(inFile)
{
//讀入每一個(gè)讀者、寫者的信息
inFile>>thread_info[n_thread].serial;
inFile>>thread_info[n_thread].entity;
inFile>>thread_info[n_thread].delay;
inFile>>thread_info[n_thread++].persist;
inFile.get();
}
for(int i=0;i<(int)(n_thread);i++)
{if(thread_info[i].entity==READER || thread_info[i].entity==r)
{ //創(chuàng)建讀者線程
h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (RP_ReaderThread),&thread_info[i],0,&thread_ID);
}
else
{ //創(chuàng)建寫者線程
h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (RP_WriterThread),&thread_info[i],0,&thread_ID);
}
}
//等待所有線程結(jié)束
wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1);
printf("All Reader and writer have finished operationg.\n");
}
////////////////////////////////////////////
//寫者優(yōu)先——讀者線程
// p 讀者線程信息
void WP_ReaderThread(void *p)
{
//互斥變量
HANDLE h_Mutex1;
h_Mutex1=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex1");
HANDLE h_Mutex2;
h_Mutex2=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex2");
DWORD wait_for_mutex1; //等待互斥變量所有權(quán)
DWORD wait_for_mutex2;
DWORD m_delay; //延遲時(shí)間
DWORD m_persist; //讀文件持續(xù)時(shí)間
int m_serial; //線程序號(hào)
//從參數(shù)中獲得信息
m_serial=((ThreadInfo *)(p))->serial;
m_delay=(DWORD)(((ThreadInfo *)(p))->delay*INTE_PER_SEC);
m_persist=(DWORD)(((ThreadInfo *)(p))->persist*INTE_PER_SEC);
Sleep(m_delay); //延遲等待
printf("reader thread %d sends the reading require.\n",m_serial);
//等待互斥信號(hào),保證對(duì)readcount的訪問、修改互斥
wait_for_mutex1=WaitForSingleObject(h_Mutex1,-1);
//進(jìn)入讀者臨界區(qū)
EnterCriticalSection(&cs_Read);
//阻塞互斥對(duì)象Mutex2,保證對(duì)readcount 的訪問、修改互斥
wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1);
//修改讀者數(shù)目
readcount++;
if(readcount==1)
{
//如果是第一個(gè)讀者,等待寫者寫完
EnterCriticalSection(&cs_Write);
}
ReleaseMutex(h_Mutex2); //釋放互斥信號(hào)mutex2
//讓其他讀者進(jìn)入臨界區(qū)
LeaveCriticalSection(&cs_Read);
ReleaseMutex(h_Mutex1);
//讀文件
printf("reader thread %d begins to read file.\n",m_serial);
Sleep(m_persist);
//退出線程
printf("reader thread %d finished the reading file.\n",m_serial);
//阻塞互斥對(duì)象mutex2,保證對(duì)readcount的訪問,修改互斥
wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1);
//讀者數(shù)目減少
readcount--;
if(readcount==0)
{
//最后一個(gè)讀者,喚醒寫者
LeaveCriticalSection(&cs_Write);
}
ReleaseMutex(h_Mutex2); //釋放互斥信號(hào)
}
////////////////////////////////////////////
//寫者優(yōu)先——寫者線程
// p 寫者線程信息
void WP_WriteThread(void *p)
{
DWORD m_delay; //延遲時(shí)間
DWORD m_persist; //讀文件持續(xù)時(shí)間
int m_serial; //線程序號(hào)
DWORD wait_for_mutex3 ;
//互斥對(duì)象
HANDLE h_Mutex3;
h_Mutex3=OpenMutex(MUTEX_ALL_ACCESS,FALSE,"mutex3");
//從參數(shù)中獲得信息
m_serial=((ThreadInfo *)(p))->serial;
m_delay=(DWORD)(((ThreadInfo *)(p))->delay*INTE_PER_SEC);
m_persist=(DWORD)(((ThreadInfo *)(p))->persist*INTE_PER_SEC);
Sleep(m_delay); //延遲等待
printf("Writer thread %d sends the writing require.\n",m_serial);
//阻塞互斥對(duì)象mutex3,保證對(duì)writecount的訪問,修改互斥
wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1);
writecount++;
if(writecount==1)
{//第一個(gè)寫者,等待讀者讀完
EnterCriticalSection(&cs_Read);
}
ReleaseMutex(h_Mutex3);
//進(jìn)入寫者臨界區(qū)
EnterCriticalSection(&cs_Write);
//寫文件
printf("writer thread %d begins to write to the file.\n",m_serial);
Sleep(m_persist);
//退出線程
printf("writer thread %d finished the writting file.\n",m_serial);
//離開臨界區(qū)
LeaveCriticalSection(&cs_Write);
//阻塞互斥對(duì)象mutex3,保證對(duì)writecount的訪問,修改互斥
wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1);
writecount--;
if(writecount==0)
{//寫者寫完,讀者可以讀
LeaveCriticalSection(&cs_Read);
}
ReleaseMutex(h_Mutex3);
}
////////////////////////////////////////////////////
//寫者優(yōu)先處理函數(shù)
//file 文件名
void WriterPriority(char *file)
{DWORD n_thread=0; //線程數(shù)目
DWORD thread_ID; //線程ID
DWORD wait_for_all; //等待所有線程結(jié)束
//互斥對(duì)象
HANDLE h_Mutex1;
h_Mutex1=CreateMutex(NULL,FALSE,"mutex1");
HANDLE h_Mutex2;
h_Mutex2=CreateMutex(NULL,FALSE,"mutex2");
HANDLE h_Mutex3;
h_Mutex3=CreateMutex(NULL,FALSE,"mutex3");
//線程對(duì)象的數(shù)組
HANDLE h_Thread[MAX_THREAD_NUM];
ThreadInfo thread_info[MAX_THREAD_NUM];
readcount=0; //初始化readcount
writecount=0; //初始化writecount
InitializeCriticalSection(&cs_Write); //初始化臨界區(qū)
InitializeCriticalSection(&cs_Read);
ifstream inFile(file);
//ifstream inFile;
//inFile.open(file); //打開文件
printf("writer Priority:\n\n");
///////////////while(inFile)
while(inFile)
{
//讀入每一個(gè)讀者、寫者的信息
inFile>>thread_info[n_thread].serial;
inFile>>thread_info[n_thread].entity;
inFile>>thread_info[n_thread].delay;
inFile>>thread_info[n_thread++].persist;
inFile.get();
}
for(int i=0;i<(int)(n_thread);i++)
{if(thread_info[i].entity==READER || thread_info[i].entity==r)
{ //創(chuàng)建讀者線程
// h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (RP_ReaderThread),&thread_info[i],0,&thread_ID);
h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (WP_ReaderThread),&thread_info[i],0,&thread_ID);
}
else
{ //創(chuàng)建寫者線程
// h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (RP_WriterThread),&thread_info[i],0,&thread_ID);
h_Thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (WP_WriteThread),&thread_info[i],0,&thread_ID);
}
}
//等待所有線程結(jié)束
wait_for_all=WaitForMultipleObjects(n_thread,h_Thread,TRUE,-1);
printf("All Reader and writer have finished operationg.\n");
}
int main(int argc,char *argv[])
{
char ch;
while(true)
{//打印提示信息
printf(" ==========================================\n");
printf(" ==== 讀者-寫者實(shí)驗(yàn)?zāi)M ====\n\n");
printf(" ==========================================\n");
printf("\n");
printf(" ***********************************\n");
printf(" 1:Reader Priority\n");
printf(" 2:Write Priority\n");
printf(" 3:Exit to Windows\n");
printf(" ***********************************\n");
printf(" Enter your choice(1、2、3):\n");
//如果輸入信息不正確,繼續(xù)輸入
do{
ch=(char)_getch();
}while(ch!=1&&ch!=2&&ch!=3);
/*system("cls");*/
//選擇3,返回
if(ch==3)
return 0;
//選擇1,讀者
if(ch==1)
ReaderPriority("thread.dat");
//選擇2,寫者優(yōu)先
else
WriterPriority("thread.dat");
//結(jié)束
printf("\n press any key to continue:");
_getch();
/*system("cls");*/
}
return 0;
}
附錄二、哲學(xué)家就餐問題
// PhilosopherDining.cpp : Defines the entry point for the console application.
#include "windows.h"
#include
#include
#include
#include
#include
using namespace std;
const unsigned int PHILOSOPHER_NUM=5;
const char THINKING=1;
const char HUNGRY=2;
const char DINING=3;
// each fork has a semaphore
HANDLE semph[PHILOSOPHER_NUM];
// Mutex for printing
HANDLE mutex;
void philosopherProc(void* param);
int main(int argc, char* argv[])
{ int i;
srand(time(0));
mutex = CreateMutex(NULL, false, NULL);
for (i=0; iname,&p->ts,&p->ntime,&p->resource);
p->state=W;
p->link=NULL;
if(head==NULL) head=q=p;
else{
q->link=p;
q=p;
}
}
}
fileinput(){
FILE *fp;
int i;
if((fp=fopen("os2.txt","r"))==NULL) printf(" open error!") ;
fscanf(fp,"%d\n",&n);
for(i=0;iname,&p->ts,&p->ntime,&p->resource);
p->state=W;
p->link=NULL;
if(head==NULL) head=q=p;
else{
q->link=p;
q=p;
}
}
fclose(fp);
}
void print(JCB *pr,int m){
JCB *p;
printf("\ntime=%d",time);
if(m==3){
printf("\nname\tstate\tts\tntime\tsuper\tsource\ttb\ttc\tti\twi\n");
printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n",
pr->name,pr->state,pr->ts,pr->ntime,pr->super,pr->resource,pr->tb,pr->tc,pr->ti,pr->wi);
}
else {
printf("\nname\tstate\tts\tntime\tsource\ttb\ttc\tti\twi\n");
printf("%s\t%c\t%d\t%d\t%s\t%d\t%d\t%4.2f\t%4.2f\n",
pr->name,pr->state,pr->ts,pr->ntime,pr->resource,pr->tb,pr->tc,pr->ti,pr->wi);
}
p=head;
do{
if(p->state==W)
if(m==3){
printf("%s\t%c\t%d\t%d\t%4.2f\t%s\n",
p->name,p->state,p->ts,p->ntime,p->super,p->resource);
}
else{
printf("%s\t%c\t%d\t%d\t%s\n",
p->name,p->state,p->ts,p->ntime,p->resource);
}
p=p->link;
}while(p!=NULL);
p=head;
do{
if(p->state==F)
if(m==3){
printf("%s\t%c\t%d\t%d\t%4.2f\t%s\t%d\t%d\t%4.2f\t%4.2f\n",
p->name,p->state,p->ts,p->ntime,p->super,p->resource,p->tb,p->tc,p->ti
鏈接地址:http://ioszen.com/p-7765689.html