




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、操 作 系 統(tǒng)實(shí) 驗(yàn) 指 導(dǎo) 書(shū)適用專業(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)是一門(mén)重要的專業(yè)基礎(chǔ)課程。要學(xué)好操作系統(tǒng)的設(shè)計(jì)原理,除了聽(tīng)課、看書(shū)、做習(xí)題外,最好的方法就是在實(shí)踐中進(jìn)行,包括使用操作系統(tǒng)、閱讀和分析已有操作系統(tǒng)的源代碼、自己設(shè)計(jì)小型系統(tǒng)/模塊或模擬算法等。從個(gè)人的角度而言,如果能夠完成MINUX源代碼的閱讀與分析,這將對(duì)掌握操作系統(tǒng)的原理與設(shè)計(jì)方法不無(wú)益處。這里,我沒(méi)有向大家推薦Linux或者FreeBSD之類(lèi)的操作系統(tǒng)(雖然我從1997年就一直向?qū)W生推薦Fr
2、eeBSD),是因?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è)層次。具體地,使用級(jí):是指如何使用操作系統(tǒng),包括對(duì)命令(以及菜單和shell)、系統(tǒng)調(diào)用和系統(tǒng)文件的使用。觀察級(jí):是指通過(guò)使用級(jí)
3、的接口,從外部觀察操作系統(tǒng)的內(nèi)部工作過(guò)程和結(jié)構(gòu)。系統(tǒng)管理級(jí):是指系統(tǒng)或設(shè)備的安裝、配置和性能調(diào)整。源碼閱讀級(jí):是指對(duì)現(xiàn)有操作系統(tǒng)部分內(nèi)核源代碼的閱讀。實(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ū)分,大家仁者見(jiàn)仁吧。由于條件限制,只能夠提供Windows 2000 Professional/WindowsXP2作為大家實(shí)踐時(shí)使用的操作系統(tǒng)。希望大家能夠結(jié)合具體的實(shí)驗(yàn)要求以及實(shí)踐環(huán)境提前做好試驗(yàn)準(zhǔn)備。如果可能,給自己創(chuàng)造使用Unix或類(lèi)Unix的實(shí)驗(yàn)環(huán)境。上機(jī)前應(yīng)充分做好以下準(zhǔn)備工
4、作:復(fù)習(xí)和掌握與本次實(shí)驗(yàn)有關(guān)的教學(xué)內(nèi)容。根據(jù)本次實(shí)驗(yàn)的內(nèi)容,在紙上編寫(xiě)好準(zhǔn)備上機(jī)調(diào)試的程序,并初步檢查無(wú)誤。準(zhǔn)備好對(duì)程序進(jìn)行測(cè)試的數(shù)據(jù)。對(duì)每種測(cè)試數(shù)據(jù),給出預(yù)期的程序運(yùn)行結(jié)果。預(yù)習(xí)實(shí)驗(yàn)步驟,對(duì)實(shí)驗(yàn)步驟中提出的一些問(wèn)題進(jìn)行思考。上機(jī)實(shí)驗(yàn)后,應(yīng)及時(shí)寫(xiě)出實(shí)驗(yàn)報(bào)告,實(shí)驗(yàn)報(bào)告應(yīng)包括以下內(nèi)容:實(shí)驗(yàn)?zāi)康暮蛢?nèi)容。程序說(shuō)明,包括程序結(jié)構(gòu)、各模塊的算法。調(diào)試正確的源程序。程序運(yùn)行記錄(包括對(duì)不同測(cè)試數(shù)據(jù)的運(yùn)行結(jié)果)。針對(duì)實(shí)驗(yàn)中出現(xiàn)的問(wèn)題,寫(xiě)出解決辦法及對(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)
5、均為綜合實(shí)驗(yàn)。針對(duì)具體的實(shí)驗(yàn)要求,本指導(dǎo)書(shū)附錄有大量的源代碼,供對(duì)相關(guān)算法不是很熟悉的同學(xué)參考。本指導(dǎo)書(shū)適用于計(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)類(lèi)型:(驗(yàn)證、綜合)實(shí)驗(yàn)要求:(必修)一、實(shí)驗(yàn)?zāi)康腤indows NT內(nèi)核的操作系統(tǒng)是多任務(wù)操作系統(tǒng),對(duì)程與線程提供完整支持。本次實(shí)驗(yàn)意圖通過(guò)實(shí)踐掌握進(jìn)程的基本概念,理解進(jìn)程控制、進(jìn)程同步、經(jīng)典進(jìn)程的同步問(wèn)題 、管程機(jī)制、進(jìn)程通信、線程;初步熟悉多進(jìn)程/多線程編程的特點(diǎn)。二、實(shí)驗(yàn)內(nèi)容本次實(shí)驗(yàn)的實(shí)驗(yàn)內(nèi)容包括:1)使用taskmgr.
6、exe觀察實(shí)驗(yàn)環(huán)境中的進(jìn)程信息;2) 編程實(shí)現(xiàn)哲學(xué)家就餐問(wèn)題或者讀寫(xiě)者問(wèn)題。三、實(shí)驗(yàn)組織運(yùn)行要求根據(jù)本實(shí)驗(yàn)的特點(diǎn)、要求和具體條件,宜采用“以學(xué)生自主訓(xùn)練為主的開(kāi)放模式組織教學(xué)”。相關(guān)材料可以以書(shū)面資料(或電子版本)的形式分發(fā)給學(xué)生。學(xué)生自主練習(xí)、提問(wèn);教師針對(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)步驟如下:首先使用taskmgr.exe程序觀察系統(tǒng)中運(yùn)行進(jìn)程的基本信息
7、;使用taskmgr.exe程序觀察系統(tǒng)中運(yùn)行進(jìn)程的詳細(xì)信息;編碼實(shí)現(xiàn)哲學(xué)家就餐問(wèn)題或者讀寫(xiě)者問(wèn)題。六、思考題如何編程實(shí)現(xiàn)獲得進(jìn)程的詳細(xì)信息? 編碼實(shí)現(xiàn)哲學(xué)家就餐問(wèn)題時(shí)哲學(xué)家獲取筷子的策略是什么?讀寫(xiě)者問(wèn)題的實(shí)現(xiàn)中,什么是讀者優(yōu)先,什么是寫(xiě)者優(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í)的描述操作過(guò)程,并提供操作步驟以及調(diào)試程序的源代碼。對(duì)思考題應(yīng)該能夠初步認(rèn)識(shí)。具體實(shí)驗(yàn)報(bào)告的書(shū)寫(xiě)按照實(shí)驗(yàn)報(bào)告紙的要求逐項(xiàng)完成。八、其它說(shuō)明要求學(xué)生在實(shí)驗(yàn)過(guò)程中遵循如下的要求:準(zhǔn)時(shí)到達(dá)實(shí)驗(yàn)室,嚴(yán)格簽名方式的考勤制度。不允許代簽;遵循實(shí)驗(yàn)室
8、的各種管理規(guī)定;服從教師和實(shí)驗(yàn)員的管理;實(shí)驗(yàn)二:處理機(jī)調(diào)度實(shí)驗(yàn)學(xué)時(shí):2實(shí)驗(yàn)類(lèi)型:(驗(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)練為主的開(kāi)放模式組織教學(xué)”。
9、相關(guān)材料可以以書(shū)面資料(或電子版本)的形式分發(fā)給學(xué)生。學(xué)生自主練習(xí)、提問(wèn);教師針對(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)境)。五、思考題ELLF算法與LLF算法的區(qū)別在什么地方?安全性檢查算法的邏輯基礎(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í)的描述操作過(guò)程,并提供操作步驟以及調(diào)試程序的源代碼。對(duì)思考題應(yīng)該能夠初
10、步認(rèn)識(shí)。具體實(shí)驗(yàn)報(bào)告的書(shū)寫(xiě)按照實(shí)驗(yàn)報(bào)告紙的要求逐項(xiàng)完成。七、其它說(shuō)明要求學(xué)生在實(shí)驗(yàn)過(guò)程中遵循如下的要求:準(zhǔn)時(shí)到達(dá)實(shí)驗(yàn)室,嚴(yán)格簽名方式的考勤制度。不允許代簽;遵循實(shí)驗(yàn)室的各種管理規(guī)定;服從教師和實(shí)驗(yàn)員的管理;實(shí)驗(yàn)三:存儲(chǔ)器管理實(shí)驗(yàn)學(xué)時(shí):2實(shí)驗(yàn)類(lèi)型:(驗(yàn)證、綜合)實(shí)驗(yàn)要求:(必修)一、實(shí)驗(yàn)?zāi)康谋敬螌?shí)驗(yàn)旨在通過(guò)使用操作系統(tǒng)內(nèi)存分配信息的動(dòng)態(tài)觀察以及存儲(chǔ)器管理算法的實(shí)現(xiàn),加深對(duì)內(nèi)存分配原理的理解(重點(diǎn)加深對(duì)請(qǐng)求式分頁(yè)存儲(chǔ)管理方式的理解)。同時(shí)通過(guò)相關(guān)算法的實(shí)現(xiàn),熟悉頁(yè)面置換算法及其性能。二、實(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)求分
11、頁(yè)管理方式時(shí)的地址變換過(guò)程;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)練為主的開(kāi)放模式組織教學(xué)”。相關(guān)材料可以以書(shū)面資料(或電子版本)的形式分發(fā)給學(xué)生。學(xué)生自主練習(xí)、提問(wèn);教師針對(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)境)。五、思考題OPT算法是否具備實(shí)用性?OPT算法與LRU算法的區(qū)別是什么?虛擬存
12、儲(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í)的描述操作過(guò)程,并提供操作步驟以及調(diào)試程序的源代碼。對(duì)思考題應(yīng)該能夠初步認(rèn)識(shí)。具體實(shí)驗(yàn)報(bào)告的書(shū)寫(xiě)按照實(shí)驗(yàn)報(bào)告紙的要求逐項(xiàng)完成。七、其它說(shuō)明要求學(xué)生在實(shí)驗(yàn)過(guò)程中遵循如下的要求:準(zhǔn)時(shí)到達(dá)實(shí)驗(yàn)室,嚴(yán)格簽名方式的考勤制度。不允許代簽;遵循實(shí)驗(yàn)室的各種管理規(guī)定;服從教師和實(shí)驗(yàn)員的管理;實(shí)驗(yàn)四:文件管理實(shí)驗(yàn)學(xué)時(shí):2實(shí)驗(yàn)類(lèi)型:(驗(yàn)證、綜合)實(shí)驗(yàn)要求:(必修)一、實(shí)驗(yàn)?zāi)康谋敬螌?shí)驗(yàn)旨在通過(guò)實(shí)踐了解文件管理原理與方法,重點(diǎn)加深對(duì)外存分配方式和文件空閑存儲(chǔ)空間的理解。二、實(shí)驗(yàn)內(nèi)容
13、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)練為主的開(kāi)放模式組織教學(xué)”。相關(guān)材料可以以書(shū)面資料(或電子版本)的形式分發(fā)給學(xué)生。學(xué)生自主練習(xí)、提問(wèn);教師針對(duì)性的輔導(dǎo)。本次實(shí)驗(yàn)內(nèi)容很多,閾于課時(shí)限制,編程可能無(wú)法全部完成。對(duì)實(shí)驗(yàn)內(nèi)容中2)、3)(外存分配方式、文件存儲(chǔ)空間管理方式)要求的6個(gè)編程要求,可以分成:a) 連續(xù)分配與鏈接分配、b) 索引分配、c) 空閑表法與位示圖法連續(xù)分配、d)
14、 成組鏈接法等四組,要求在實(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)境)。五、思考題實(shí)驗(yàn)使用的計(jì)算機(jī)系用中,術(shù)語(yǔ)文件夾與文件管理中的概念一致?連續(xù)分配、鏈接分配、索引分配等三種外存分配方式的特點(diǎn)以及彼此之間的差異是什么?空閑表法、位示圖法連續(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í)
15、驗(yàn)預(yù)習(xí)、實(shí)驗(yàn)記錄、思考題三部分內(nèi)容。實(shí)驗(yàn)記錄應(yīng)該忠實(shí)的描述操作過(guò)程,并提供操作步驟以及調(diào)試程序的源代碼。對(duì)思考題應(yīng)該能夠初步認(rèn)識(shí)。具體實(shí)驗(yàn)報(bào)告的書(shū)寫(xiě)按照實(shí)驗(yàn)報(bào)告紙的要求逐項(xiàng)完成。七、其它說(shuō)明要求學(xué)生在實(shí)驗(yàn)過(guò)程中遵循如下的要求:準(zhǔn)時(shí)到達(dá)實(shí)驗(yàn)室,嚴(yán)格簽名方式的考勤制度。不允許代簽;遵循實(shí)驗(yàn)室的各種管理規(guī)定;服從教師和實(shí)驗(yàn)員的管理;附錄一、讀寫(xiě)者問(wèn)題源代碼#include windows.h#include #include #include #include #include #include #define READER R #define WRITER W#define INTE_PER_SE
16、C 1000#define MAX_THREAD_NUM 64#define MAX_FILE_NUM 32#define MAX_STR_LEN 32int readcount=0;int writecount=0;CRITICAL_SECTION RP_Write;CRITICAL_SECTION cs_Write;CRITICAL_SECTION cs_Read;struct ThreadInfoint serial; char entity; double delay; double persist;/讀者優(yōu)先讀者線程/ p 讀者線程信息void RP_ReaderThread(voi
17、d *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)(T
18、hreadInfo *)(p)-persist*INTE_PER_SEC); Sleep(m_delay); /延遲等待printf(reader thread %d sends the reading require.n,m_serial);/等待互斥信號(hào),保證對(duì)readcount的訪問(wèn)、修改互斥wait_for_mutex=WaitForSingleObject(h_Mutex,-1);/讀者數(shù)目增加readcount+;if(readcount=1)/第一個(gè)讀者,等待資源EnterCriticalSection(&RP_Write);ReleaseMutex(h_Mutex); /釋放互
19、斥信號(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的訪問(wèn),修改互斥wait_for_mutex=WaitForSingleObject(h_Mutex,-1);/讀者數(shù)目減少readcount-; if(readcount=0)/如果所有讀者讀完,喚醒寫(xiě)者LeaveCriticalSection(&RP_Writ
20、e);ReleaseMutex(h_Mutex); /釋放互斥信號(hào)/讀者優(yōu)先寫(xiě)者線程/ p 寫(xiě)者線程信息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);
21、 Sleep(m_delay); /延遲等待printf(Writer thread %d sends the writing require.n,m_serial);/等待資源EnterCriticalSection(&RP_Write);/寫(xiě)文件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(
22、&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_ThreadMAX_THREAD_NUM; ThreadInfo thread_infoMAX_THREAD_NUM; readcou
23、nt=0; /初始化readcount InitializeCriticalSection(&RP_Write); /初始化臨界區(qū) ifstream inFile(file); /ifstream inFile; /inFile.open(file); /打開(kāi)文件 printf(reader Priority:nn);/ if(!inFile) return;/如文件未打開(kāi),則返回 /while(!inFile.eof()/如文件未到文件尾,則讀文件信息 while(inFile) /讀入每一個(gè)讀者、寫(xiě)者的信息 inFilethread_infon_thread.serial; inFilet
24、hread_infon_thread.entity; inFilethread_infon_thread.delay; inFilethread_infon_thread+.persist; inFile.get(); for(int i=0;iserial;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 rea
25、ding require.n,m_serial);/等待互斥信號(hào),保證對(duì)readcount的訪問(wèn)、修改互斥wait_for_mutex1=WaitForSingleObject(h_Mutex1,-1);/進(jìn)入讀者臨界區(qū)EnterCriticalSection(&cs_Read);/阻塞互斥對(duì)象Mutex2,保證對(duì)readcount 的訪問(wèn)、修改互斥 wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1);/修改讀者數(shù)目readcount+;if(readcount=1)/如果是第一個(gè)讀者,等待寫(xiě)者寫(xiě)完EnterCriticalSection(&cs_
26、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的訪問(wèn),修改互斥wait_for_mut
27、ex2=WaitForSingleObject(h_Mutex2,-1);/讀者數(shù)目減少readcount-; if(readcount=0)/最后一個(gè)讀者,喚醒寫(xiě)者LeaveCriticalSection(&cs_Write);ReleaseMutex(h_Mutex2); /釋放互斥信號(hào)/寫(xiě)者優(yōu)先寫(xiě)者線程/ p 寫(xiě)者線程信息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_Mutex
28、3;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ì)象mu
29、tex3,保證對(duì)writecount的訪問(wèn),修改互斥wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1);writecount+;if(writecount=1)/第一個(gè)寫(xiě)者,等待讀者讀完 EnterCriticalSection(&cs_Read);ReleaseMutex(h_Mutex3);/進(jìn)入寫(xiě)者臨界區(qū)EnterCriticalSection(&cs_Write);/寫(xiě)文件printf(writer thread %d begins to write to the file.n,m_serial);Sleep(m_persist);/退出線
30、程printf(writer thread %d finished the writting file.n,m_serial);/離開(kāi)臨界區(qū)LeaveCriticalSection(&cs_Write);/阻塞互斥對(duì)象mutex3,保證對(duì)writecount的訪問(wèn),修改互斥wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1);writecount-;if(writecount=0)/寫(xiě)者寫(xiě)完,讀者可以讀LeaveCriticalSection(&cs_Read);ReleaseMutex(h_Mutex3);/寫(xiě)者優(yōu)先處理函數(shù)/file 文件名voi
31、d 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
32、h_ThreadMAX_THREAD_NUM; ThreadInfo thread_infoMAX_THREAD_NUM; readcount=0; /初始化readcount writecount=0; /初始化writecount InitializeCriticalSection(&cs_Write); /初始化臨界區(qū) InitializeCriticalSection(&cs_Read); ifstream inFile(file); /ifstream inFile; /inFile.open(file); /打開(kāi)文件 printf(writer Priority:nn); /whi
33、le(inFile) while(inFile) /讀入每一個(gè)讀者、寫(xiě)者的信息 inFilethread_infon_thread.serial; inFilethread_infon_thread.entity; inFilethread_infon_thread.delay; inFilethread_infon_thread+.persist; inFile.get(); for(int i=0;i(int)(n_thread);i+) if(thread_infoi.entity=READER | thread_infoi.entity=r) /創(chuàng)建讀者線程/ h_Threadi=Cr
34、eateThread(NULL,0,(LPTHREAD_START_ROUTINE) (RP_ReaderThread),&thread_infoi,0,&thread_ID); h_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (WP_ReaderThread),&thread_infoi,0,&thread_ID); else /創(chuàng)建寫(xiě)者線程/ h_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (RP_WriterThread),&thread_infoi,0,&thre
35、ad_ID); h_Threadi=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE) (WP_WriteThread),&thread_infoi,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)/打印提示信息 pri
36、ntf( =n); printf( = 讀者-寫(xiě)者實(shí)驗(yàn)?zāi)M =nn); printf( =n); printf(n); printf( *n); printf( 1:Reader Priorityn); printf( 2:Write Priorityn); printf( 3:Exit to Windowsn); 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
37、(ch=3) return 0; /選擇1,讀者 if(ch=1) ReaderPriority(thread.dat); /選擇2,寫(xiě)者優(yōu)先 else WriterPriority(thread.dat); /結(jié)束 printf(n press any key to continue:); _getch(); /*system(cls);*/return 0; 附錄二、哲學(xué)家就餐問(wèn)題/ PhilosopherDining.cpp : Defines the entry point for the console application.#include windows.h#include #
38、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 semaphoreHANDLE semphPHILOSOPHER_NUM;/ Mutex for printingHANDLE mutex;void philosopherProc(void* param);int main(int argc, char*
39、 argv) int i; srand(time(0); mutex = CreateMutex(NULL, false, NULL); for (i=0; iPHILOSOPHER_NUM; i+) semphi = CreateSemaphore(NULL, 1, 1, NULL); _beginthread(philosopherProc, 0, (void*)&i); Sleep(10); Sleep(2000); return 0;void philosopherProc(void* param) int myid; char idStr128; char stateStr128;
40、char mystate; int ret; unsigned int leftFork; unsigned int rightFork; myid = *(int*)(param); itoa(myid, idStr, 10); /cout philosopher myid begin endl; Sleep(10); / initial state is THINKING mystate = THINKING; leftFork = (myid) % PHILOSOPHER_NUM; rightFork = (myid + 1) % PHILOSOPHER_NUM; while (true
41、) switch(mystate) case THINKING: / changing my state mystate = HUNGRY; strcpy(stateStr, HUNGRY); break; case HUNGRY: strcpy(stateStr, HUNGRY); / first test the left fork . ret = WaitForSingleObject(semphleftFork, 0); if (ret = WAIT_OBJECT_0) / left fork is ok, take it up ! / then test the right fork
42、 . ret = WaitForSingleObject(semphrightFork, 0); if (ret = WAIT_OBJECT_0) / right fork is also ok ! / changing my state mystate = DINING; strcpy(stateStr, DINING); else / right fork is being used by others, so I must put down / the left fork. ReleaseSemaphore(semphleftFork, 1, NULL); break; case DIN
43、ING: / put down both the left and right fork ReleaseSemaphore(semphleftFork, 1, NULL); ReleaseSemaphore(semphrightFork, 1, NULL); / changing my state mystate = THINKING; strcpy(stateStr, THINKING); break; / print my state WaitForSingleObject(mutex, INFINITE); cout philosopher myid is : stateStr endl
44、; ReleaseMutex(mutex); / sleep a random time : between 1 - 5 s int sleepTime; sleepTime = 1 + (int)(5.0*rand()/(RAND_MAX+1.0); Sleep(sleepTime*10); 附錄三、調(diào)度算法模擬#include stdio.h#define getjcb(type) (type*)malloc(sizeof(type)#define NULL 0int n=0,time=0;float eti,ewi;struct jcb char name10; /* 作業(yè)名 */ ch
45、ar state; /* 作業(yè)狀態(tài) */ int ts; /* 提交時(shí)間 */ float super; /* 優(yōu)先權(quán) */ int tb; /* 開(kāi)始運(yùn)行時(shí)間 */ int tc; /* 完成時(shí)間 */ float ti; /* 周轉(zhuǎn)時(shí)間 */ float wi; /* 帶權(quán)周轉(zhuǎn)時(shí)間 */ int ntime; /* 作業(yè)所需運(yùn)行時(shí)間 */ char resource10; /* 所需資源 */ struct jcb *link; /* 結(jié)構(gòu)體指針 */ *p,*q,*head=NULL;typedef struct jcb JCB;inital()int i;printf(nInput j
46、cb numn);scanf(%d,&n);printf(Inputnnamettstntimetresourcen);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,%dn,&n);for(i=0;iname,&p-ts,&p-ntime,&p-r
47、esource); 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(nnametstatettstntimetsupertsourcettbttcttitwin); printf(%st%ct%dt%dt%4.2ft%st%dt%dt%4.2ft%4.2fn, pr-name,pr-state,pr-ts,pr-ntime,pr-super,pr
48、-resource,pr-tb,pr-tc,pr-ti,pr-wi); else printf(nnametstatettstntimetsourcettbttcttitwin); printf(%st%ct%dt%dt%st%dt%dt%4.2ft%4.2fn, 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(%st%ct%dt%dt%4.2ft%sn, p-name,p-state,p-ts,p-ntime,p-supe
49、r,p-resource); else printf(%st%ct%dt%dt%sn, 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(%st%ct%dt%dt%4.2ft%st%dt%dt%4.2ft%4.2fn, p-name,p-state,p-ts,p-ntime,p-super,p-resource,p-tb,p-tc,p-ti,p-wi); else printf(%st%ct%dt%dt%st%dt%dt%4.2ft
50、%4.2fn, p-name,p-state,p-ts,p-ntime,p-resource,p-tb,p-tc,p-ti,p-wi); p=p-link; while(p!=NULL);void last() eti/=n;ewi/=n; printf(neti=%7.3ftewi=%7.3fn,eti,ewi);super()JCB *padv;padv=head;do if(padv-state=W&padv-tssuper=(float)(time-padv-ts+padv-ntime)/padv-ntime; padv=padv-link;while(padv!=NULL);void
51、 hrn(m)JCB *min;int i,iden;for(i=0;istate=W&p-tssupermin-super) min=p; p=p-link; while(p!=NULL); if(iden) i-;time+;printf(ntime=%d:tno JCB submib.wait.,time); if(time1000)printf(nruntime is too long.error.);getch(); else running(min,m); void sjf(int m) JCB *min; int i,iden; for(i=0;istate=W&p-tsntim
52、entime) min=p; p=p-link; while(p!=NULL) ; if(iden) i-;printf(ntime=%d:tno JCB submib.wait.,time);time+; if(time100)printf(nruntime is too long.error);getch(); else running(min,m); fcfs(int m) int i,iden; printf(nnthe jcb is runing.); for(i=0;istate=W&p-tslink; while(p!=NULL&iden) ; if(iden) i-;print
53、f(ntime=%d:tno JCB submib.wait.,time);time+; if(time100)printf(nruntime is too long.error);getch(); else running(p,m); running(JCB *p,int m) p-tb=time;p-state=R; p-tc=p-tb+p-ntime; p-ti=(float)(p-tc-p-ts); p-wi=(float)(p-ti/p-ntime); eti+=p-ti; ewi+=p-wi; print(p,m); time+=p-ntime; p-state=F; printf
54、(n%s has been finished!npress any key to continue.n,p-name); getch(); void runjcb(int m) printf(nnstart running jcb.); switch(m) case 1:fcfs(m);break; case 2:sjf(m);break; case 3:hrn(m);break; default:printf(nrunjcb error.n);exit(); fileway() printf(nadopts the file way to input the datas.y/n:) ; if
55、(getch()=y) fileinput(); else inital();start() int m; char str100=nselect algorithmn1.FCFSn2.SJFn3.HRNn ; printf(%s,str); m=getch()-48; fileway(); if(1=m&m=3) runjcb(m); else printf(nselect error!try again.n); start(); last();main() start(); printf(nfinished!); getch();附錄四、銀行家算法模擬/銀行家算法問(wèn)題的模擬實(shí)現(xiàn) #incl
56、ude malloc.h#include stdio.h#define alloclen sizeof(struct allocation)#define maxlen sizeof(struct max)#define avalen sizeof(struct available)#define needlen sizeof(struct need)#define finilen sizeof(struct finish)#define pathlen sizeof(struct path)struct allocationint value;struct allocation *next;
57、struct max int value;struct max *next;struct available int value;struct available *next;struct need int value;struct need *next;struct path int value;struct path *next;struct finish int stat;struct finish *next;int main() int row,colum,status=0,i,j,t,temp,processtest;struct allocation *allochead,*al
58、loc1,*alloc2,*alloctemp;struct max *maxhead,*maxium1,*maxium2,*maxtemp;struct available *avahead, *available1, *available2, *availabletemp, *workhead, *work1, *work2, *worktemp, *worktemp1;struct need *needhead,*need1,*need2,*needtemp;struct finish *finihead,*finish1,*finish2,*finishtemp;struct path
59、 *pathhead,*path1,*path2,*pathtemp;char c;printf(nPlease enter the type of sources the system has:n);scanf(%d,&colum);printf(Please enter the number of processes now in the memory:n);scanf(%d,&row);printf(Please enter the allocation array:n);for(i=0;irow;i+) printf(The allocation for process p%d:n,i
60、);for (j=0;jnext=alloc2-next=NULL;scanf(%d,&allochead-value);status+;else alloc2=(struct allocation *)malloc(alloclen);scanf(%d,%d,&alloc2-value);if(status=1) allochead-next=alloc2;status+;alloc1-next=alloc2;alloc1=alloc2;alloc2-next=NULL;status=0;printf(Please enter the max array:n);for(i=0;irow;i+
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 代理記賬勞務(wù)合同標(biāo)準(zhǔn)文本
- 三方協(xié)議代付款合同樣本
- 代繳公積金合同樣本
- 公司委托公司合同樣本
- 公寓房源合同標(biāo)準(zhǔn)文本
- 2025中外合作生產(chǎn)、零部件組裝合同
- 2025中小學(xué)教育服務(wù)合同范例
- 公寓項(xiàng)目運(yùn)營(yíng)管理合同樣本
- 人防門(mén)施工合同標(biāo)準(zhǔn)文本
- 個(gè)人贊助合作合同標(biāo)準(zhǔn)文本
- 《幼兒園混齡民間游戲的研究》課題研究方案
- 《脊柱腫瘤》課件
- 禮儀部計(jì)劃書(shū)
- H酒店品牌管理策略研究
- 物業(yè)費(fèi)用測(cè)算表
- S7-200-SMART-PLC-應(yīng)用教程電課件
- 無(wú)人機(jī)地形匹配導(dǎo)航
- 新人教版高中英語(yǔ)必修第二冊(cè)-Unit-5THE-VIRTUAL-CHOIR精美課件
- 一身邊的“雷鋒”(課件)五年級(jí)下冊(cè)綜合實(shí)踐活動(dòng)
- 高考語(yǔ)文復(fù)習(xí):詩(shī)歌語(yǔ)言鑒賞
- 工程造價(jià)司法鑒定報(bào)告案例
評(píng)論
0/150
提交評(píng)論