![《實驗指導(dǎo)書》word版_第1頁](http://file4.renrendoc.com/view/c39f568acb47fe0d750fd41bb997384d/c39f568acb47fe0d750fd41bb997384d1.gif)
![《實驗指導(dǎo)書》word版_第2頁](http://file4.renrendoc.com/view/c39f568acb47fe0d750fd41bb997384d/c39f568acb47fe0d750fd41bb997384d2.gif)
![《實驗指導(dǎo)書》word版_第3頁](http://file4.renrendoc.com/view/c39f568acb47fe0d750fd41bb997384d/c39f568acb47fe0d750fd41bb997384d3.gif)
![《實驗指導(dǎo)書》word版_第4頁](http://file4.renrendoc.com/view/c39f568acb47fe0d750fd41bb997384d/c39f568acb47fe0d750fd41bb997384d4.gif)
![《實驗指導(dǎo)書》word版_第5頁](http://file4.renrendoc.com/view/c39f568acb47fe0d750fd41bb997384d/c39f568acb47fe0d750fd41bb997384d5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、操 作 系 統(tǒng)實 驗 指 導(dǎo) 書適用專業(yè): 計算機(jī)科學(xué)技術(shù) 計算機(jī)應(yīng)用 電 子 專 業(yè) 安徽建筑工業(yè)學(xué)院 電子與信息工程 學(xué)院2008 年 3 月前 言對計算機(jī)科學(xué)與技術(shù)及相關(guān)專業(yè)的學(xué)生而言,操作系統(tǒng)是一門重要的專業(yè)基礎(chǔ)課程。要學(xué)好操作系統(tǒng)的設(shè)計原理,除了聽課、看書、做習(xí)題外,最好的方法就是在實踐中進(jìn)行,包括使用操作系統(tǒng)、閱讀和分析已有操作系統(tǒng)的源代碼、自己設(shè)計小型系統(tǒng)/模塊或模擬算法等。從個人的角度而言,如果能夠完成MINUX源代碼的閱讀與分析,這將對掌握操作系統(tǒng)的原理與設(shè)計方法不無益處。這里,我沒有向大家推薦Linux或者FreeBSD之類的操作系統(tǒng)(雖然我從1997年就一直向?qū)W生推薦Fr
2、eeBSD),是因為這里的閱讀源代碼的目標(biāo)是為了掌握操作系統(tǒng)的原理。孟子曰:“富貴不能淫,貧賤不能移,威武不能屈,此之謂大丈夫?!蔽业睦斫?,即使不能夠按照孟老夫子的話去做大丈夫,如果能夠做到“時髦不能跟”,也就可以做真正的自己了。對我們課程的學(xué)習(xí),也就是這個道理吧。對操作系統(tǒng)的實踐,教學(xué)計劃安排了8個課時的實驗時間,這很不夠,希望大家能夠?qū)ψ约汉菀稽c,創(chuàng)造自己進(jìn)行的操作系統(tǒng)實踐的環(huán)境與機(jī)會。操作系統(tǒng)實踐,按深度可分為使用級、觀察級、系統(tǒng)管理級、源碼閱讀級和實現(xiàn)級等五個層次。具體地,使用級:是指如何使用操作系統(tǒng),包括對命令(以及菜單和shell)、系統(tǒng)調(diào)用和系統(tǒng)文件的使用。觀察級:是指通過使用級
3、的接口,從外部觀察操作系統(tǒng)的內(nèi)部工作過程和結(jié)構(gòu)。系統(tǒng)管理級:是指系統(tǒng)或設(shè)備的安裝、配置和性能調(diào)整。源碼閱讀級:是指對現(xiàn)有操作系統(tǒng)部分內(nèi)核源代碼的閱讀。實現(xiàn)級:是指編程模擬實現(xiàn)操作系統(tǒng)某些功能模塊。上述五個層次的實踐,不同層次的實踐者可以根據(jù)自己的實際情況自主安排,在我給的實驗指導(dǎo)中,當(dāng)前不會對各實驗的層次明確區(qū)分,大家仁者見仁吧。由于條件限制,只能夠提供Windows 2000 Professional/WindowsXP2作為大家實踐時使用的操作系統(tǒng)。希望大家能夠結(jié)合具體的實驗要求以及實踐環(huán)境提前做好試驗準(zhǔn)備。如果可能,給自己創(chuàng)造使用Unix或類Unix的實驗環(huán)境。上機(jī)前應(yīng)充分做好以下準(zhǔn)備工
4、作:復(fù)習(xí)和掌握與本次實驗有關(guān)的教學(xué)內(nèi)容。根據(jù)本次實驗的內(nèi)容,在紙上編寫好準(zhǔn)備上機(jī)調(diào)試的程序,并初步檢查無誤。準(zhǔn)備好對程序進(jìn)行測試的數(shù)據(jù)。對每種測試數(shù)據(jù),給出預(yù)期的程序運(yùn)行結(jié)果。預(yù)習(xí)實驗步驟,對實驗步驟中提出的一些問題進(jìn)行思考。上機(jī)實驗后,應(yīng)及時寫出實驗報告,實驗報告應(yīng)包括以下內(nèi)容:實驗?zāi)康暮蛢?nèi)容。程序說明,包括程序結(jié)構(gòu)、各模塊的算法。調(diào)試正確的源程序。程序運(yùn)行記錄(包括對不同測試數(shù)據(jù)的運(yùn)行結(jié)果)。針對實驗中出現(xiàn)的問題,寫出解決辦法及對運(yùn)行結(jié)果的分析。根據(jù)教學(xué)大綱與實驗大綱的安排,本課程計劃進(jìn)行12課時上機(jī)試驗。由于所有實驗均涉及程序設(shè)計、數(shù)據(jù)結(jié)構(gòu)與算法設(shè)計、操作系統(tǒng)等課程的多個知識點,相關(guān)實驗
5、均為綜合實驗。針對具體的實驗要求,本指導(dǎo)書附錄有大量的源代碼,供對相關(guān)算法不是很熟悉的同學(xué)參考。本指導(dǎo)書適用于計算機(jī)科學(xué)技術(shù)、計算機(jī)應(yīng)用、電子專業(yè)學(xué)生學(xué)習(xí)計算機(jī)操作系統(tǒng)課程時實驗使用,也適用于上述專業(yè)軟件實驗課程中操作系統(tǒng)部分實驗使用。實驗一:進(jìn)程管理實驗學(xué)時:2實驗類型:(驗證、綜合)實驗要求:(必修)一、實驗?zāi)康腤indows NT內(nèi)核的操作系統(tǒng)是多任務(wù)操作系統(tǒng),對程與線程提供完整支持。本次實驗意圖通過實踐掌握進(jìn)程的基本概念,理解進(jìn)程控制、進(jìn)程同步、經(jīng)典進(jìn)程的同步問題 、管程機(jī)制、進(jìn)程通信、線程;初步熟悉多進(jìn)程/多線程編程的特點。二、實驗內(nèi)容本次實驗的實驗內(nèi)容包括:1)使用taskmgr.
6、exe觀察實驗環(huán)境中的進(jìn)程信息;2) 編程實現(xiàn)哲學(xué)家就餐問題或者讀寫者問題。三、實驗組織運(yùn)行要求根據(jù)本實驗的特點、要求和具體條件,宜采用“以學(xué)生自主訓(xùn)練為主的開放模式組織教學(xué)”。相關(guān)材料可以以書面資料(或電子版本)的形式分發(fā)給學(xué)生。學(xué)生自主練習(xí)、提問;教師針對性的輔導(dǎo)。四、實驗條件- 硬件環(huán)境:Pentium 300MHz以上的微型計算機(jī);- 操作系統(tǒng):Windows 2000或Windows XP;- 編程環(huán)境:Visual C+ 6.0 企業(yè)版(算法模擬可以使用其它合適的C/C+編譯器或編程環(huán)境)。五、實驗步驟具體實驗步驟如下:首先使用taskmgr.exe程序觀察系統(tǒng)中運(yùn)行進(jìn)程的基本信息
7、;使用taskmgr.exe程序觀察系統(tǒng)中運(yùn)行進(jìn)程的詳細(xì)信息;編碼實現(xiàn)哲學(xué)家就餐問題或者讀寫者問題。六、思考題如何編程實現(xiàn)獲得進(jìn)程的詳細(xì)信息? 編碼實現(xiàn)哲學(xué)家就餐問題時哲學(xué)家獲取筷子的策略是什么?讀寫者問題的實現(xiàn)中,什么是讀者優(yōu)先,什么是寫者優(yōu)先?七、實驗報告學(xué)生在實驗結(jié)束后必須完成實驗報告。實驗報告必須包括實驗預(yù)習(xí)、實驗記錄、思考題三部分內(nèi)容。實驗記錄應(yīng)該忠實的描述操作過程,并提供操作步驟以及調(diào)試程序的源代碼。對思考題應(yīng)該能夠初步認(rèn)識。具體實驗報告的書寫按照實驗報告紙的要求逐項完成。八、其它說明要求學(xué)生在實驗過程中遵循如下的要求:準(zhǔn)時到達(dá)實驗室,嚴(yán)格簽名方式的考勤制度。不允許代簽;遵循實驗室
8、的各種管理規(guī)定;服從教師和實驗員的管理;實驗二:處理機(jī)調(diào)度實驗學(xué)時:2實驗類型:(驗證、綜合)實驗要求:(必修)一、實驗?zāi)康谋緦嶒災(zāi)M在單處理機(jī)情況下的處理機(jī)調(diào)度,以期加深了解處理機(jī)調(diào)度算法;同時,本次實驗要求編程實現(xiàn)銀行家算法,以期加深對避免死鎖的理解。二、實驗內(nèi)容1)使用taskmgr.exe觀察實驗環(huán)境中的進(jìn)程調(diào)度情況;2)編程實現(xiàn)一個調(diào)度算法,推薦實現(xiàn)ELLF算法。要求給出對隨機(jī)測試序列能夠給出調(diào)度次序;3) 編程實現(xiàn)銀行家算法,要求在給定資源初始狀態(tài)后能夠動態(tài)處理進(jìn)程的資源分配請求;三、實驗組織運(yùn)行要求根據(jù)本實驗的特點、要求和具體條件,宜采用“以學(xué)生自主訓(xùn)練為主的開放模式組織教學(xué)”。
9、相關(guān)材料可以以書面資料(或電子版本)的形式分發(fā)給學(xué)生。學(xué)生自主練習(xí)、提問;教師針對性的輔導(dǎo)。四、實驗條件- 硬件環(huán)境:Pentium 300MHz以上的微型計算機(jī);- 操作系統(tǒng):Windows 2000或Windows XP;- 編程環(huán)境:Visual C+ 6.0 企業(yè)版(算法模擬可以使用其它合適的C/C+編譯器或編程環(huán)境)。五、思考題ELLF算法與LLF算法的區(qū)別在什么地方?安全性檢查算法的邏輯基礎(chǔ)是什么?六、實驗報告學(xué)生在實驗結(jié)束后必須完成實驗報告。實驗報告必須包括實驗預(yù)習(xí)、實驗記錄、思考題三部分內(nèi)容。實驗記錄應(yīng)該忠實的描述操作過程,并提供操作步驟以及調(diào)試程序的源代碼。對思考題應(yīng)該能夠初
10、步認(rèn)識。具體實驗報告的書寫按照實驗報告紙的要求逐項完成。七、其它說明要求學(xué)生在實驗過程中遵循如下的要求:準(zhǔn)時到達(dá)實驗室,嚴(yán)格簽名方式的考勤制度。不允許代簽;遵循實驗室的各種管理規(guī)定;服從教師和實驗員的管理;實驗三:存儲器管理實驗學(xué)時:2實驗類型:(驗證、綜合)實驗要求:(必修)一、實驗?zāi)康谋敬螌嶒炛荚谕ㄟ^使用操作系統(tǒng)內(nèi)存分配信息的動態(tài)觀察以及存儲器管理算法的實現(xiàn),加深對內(nèi)存分配原理的理解(重點加深對請求式分頁存儲管理方式的理解)。同時通過相關(guān)算法的實現(xiàn),熟悉頁面置換算法及其性能。二、實驗內(nèi)容1) 使用taskmgr.exe觀察實驗環(huán)境中的進(jìn)程生命周期內(nèi)系統(tǒng)內(nèi)存分配變化情況;2) 編程實現(xiàn)請求分
11、頁管理方式時的地址變換過程;3) 編程實現(xiàn)OPT或者FIFO算法4) 編程實現(xiàn)LRU算法;三、實驗組織運(yùn)行要求根據(jù)本實驗的特點、要求和具體條件,宜采用“以學(xué)生自主訓(xùn)練為主的開放模式組織教學(xué)”。相關(guān)材料可以以書面資料(或電子版本)的形式分發(fā)給學(xué)生。學(xué)生自主練習(xí)、提問;教師針對性的輔導(dǎo)。四、實驗條件- 硬件環(huán)境:Pentium 300MHz以上的微型計算機(jī);- 操作系統(tǒng):Windows 2000或Windows XP;- 編程環(huán)境:Visual C+ 6.0 企業(yè)版(算法模擬可以使用其它合適的C/C+編譯器或編程環(huán)境)。五、思考題OPT算法是否具備實用性?OPT算法與LRU算法的區(qū)別是什么?虛擬存
12、儲器的主要特征有哪些?六、實驗報告學(xué)生在實驗結(jié)束后必須完成實驗報告。實驗報告必須包括實驗預(yù)習(xí)、實驗記錄、思考題三部分內(nèi)容。實驗記錄應(yīng)該忠實的描述操作過程,并提供操作步驟以及調(diào)試程序的源代碼。對思考題應(yīng)該能夠初步認(rèn)識。具體實驗報告的書寫按照實驗報告紙的要求逐項完成。七、其它說明要求學(xué)生在實驗過程中遵循如下的要求:準(zhǔn)時到達(dá)實驗室,嚴(yán)格簽名方式的考勤制度。不允許代簽;遵循實驗室的各種管理規(guī)定;服從教師和實驗員的管理;實驗四:文件管理實驗學(xué)時:2實驗類型:(驗證、綜合)實驗要求:(必修)一、實驗?zāi)康谋敬螌嶒炛荚谕ㄟ^實踐了解文件管理原理與方法,重點加深對外存分配方式和文件空閑存儲空間的理解。二、實驗內(nèi)容
13、1) 了解使用計算機(jī)系統(tǒng)的文件系統(tǒng)的格式;2) 編程實現(xiàn)連續(xù)分配、鏈接分配、索引分配等三種外存分配方式;2) 編程實現(xiàn)空閑表法、位示圖法連續(xù)分配、成組鏈接法等三種文件存儲空間管理方式三、實驗組織運(yùn)行要求根據(jù)本實驗的特點、要求和具體條件,宜采用“以學(xué)生自主訓(xùn)練為主的開放模式組織教學(xué)”。相關(guān)材料可以以書面資料(或電子版本)的形式分發(fā)給學(xué)生。學(xué)生自主練習(xí)、提問;教師針對性的輔導(dǎo)。本次實驗內(nèi)容很多,閾于課時限制,編程可能無法全部完成。對實驗內(nèi)容中2)、3)(外存分配方式、文件存儲空間管理方式)要求的6個編程要求,可以分成:a) 連續(xù)分配與鏈接分配、b) 索引分配、c) 空閑表法與位示圖法連續(xù)分配、d)
14、 成組鏈接法等四組,要求在實驗課時內(nèi)至少完成一組的編程。四、實驗條件- 硬件環(huán)境:Pentium 300MHz以上的微型計算機(jī);- 操作系統(tǒng):Windows 2000或Windows XP;- 編程環(huán)境:Visual C+ 6.0 企業(yè)版(算法模擬可以使用其它合適的C/C+編譯器或編程環(huán)境)。五、思考題實驗使用的計算機(jī)系用中,術(shù)語文件夾與文件管理中的概念一致?連續(xù)分配、鏈接分配、索引分配等三種外存分配方式的特點以及彼此之間的差異是什么?空閑表法、位示圖法連續(xù)分配、成組鏈接法三種文件存儲空間管理方式的特點以及彼此之間的差異有哪些? 六、實驗報告學(xué)生在實驗結(jié)束后必須完成實驗報告。實驗報告必須包括實
15、驗預(yù)習(xí)、實驗記錄、思考題三部分內(nèi)容。實驗記錄應(yīng)該忠實的描述操作過程,并提供操作步驟以及調(diào)試程序的源代碼。對思考題應(yīng)該能夠初步認(rèn)識。具體實驗報告的書寫按照實驗報告紙的要求逐項完成。七、其它說明要求學(xué)生在實驗過程中遵循如下的要求:準(zhǔn)時到達(dá)實驗室,嚴(yán)格簽名方式的考勤制度。不允許代簽;遵循實驗室的各種管理規(guī)定;服從教師和實驗員的管理;附錄一、讀寫者問題源代碼#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; /延遲時間DWORD m_persist; /讀文件持續(xù)時間int m_serial; /線程序號/從參數(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);/等待互斥信號,保證對readcount的訪問、修改互斥wait_for_mutex=WaitForSingleObject(h_Mutex,-1);/讀者數(shù)目增加readcount+;if(readcount=1)/第一個讀者,等待資源EnterCriticalSection(&RP_Write);ReleaseMutex(h_Mutex); /釋放互
19、斥信號 /讀文件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);/等待互斥信號,保證對readcount的訪問,修改互斥wait_for_mutex=WaitForSingleObject(h_Mutex,-1);/讀者數(shù)目減少readcount-; if(readcount=0)/如果所有讀者讀完,喚醒寫者LeaveCriticalSection(&RP_Writ
20、e);ReleaseMutex(h_Mutex); /釋放互斥信號/讀者優(yōu)先寫者線程/ p 寫者線程信息void RP_WriterThread(void *p)DWORD m_delay; /延遲時間DWORD m_persist; /讀文件持續(xù)時間int m_serial; /線程序號/從參數(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);/寫文件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é)束 /互斥對象 HANDLE h_Mutex; h_Mutex=CreateMutex(NULL,FALSE,mutex for read_counter); /線程對象的數(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); /打開文件 printf(reader Priority:nn);/ if(!inFile) return;/如文件未打開,則返回 /while(!inFile.eof()/如文件未到文件尾,則讀文件信息 while(inFile) /讀入每一個讀者、寫者的信息 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);/等待互斥信號,保證對readcount的訪問、修改互斥wait_for_mutex1=WaitForSingleObject(h_Mutex1,-1);/進(jìn)入讀者臨界區(qū)EnterCriticalSection(&cs_Read);/阻塞互斥對象Mutex2,保證對readcount 的訪問、修改互斥 wait_for_mutex2=WaitForSingleObject(h_Mutex2,-1);/修改讀者數(shù)目readcount+;if(readcount=1)/如果是第一個讀者,等待寫者寫完EnterCriticalSection(&cs_
26、Write);ReleaseMutex(h_Mutex2); /釋放互斥信號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);/阻塞互斥對象mutex2,保證對readcount的訪問,修改互斥wait_for_mut
27、ex2=WaitForSingleObject(h_Mutex2,-1);/讀者數(shù)目減少readcount-; if(readcount=0)/最后一個讀者,喚醒寫者LeaveCriticalSection(&cs_Write);ReleaseMutex(h_Mutex2); /釋放互斥信號/寫者優(yōu)先寫者線程/ p 寫者線程信息void WP_WriteThread(void *p)DWORD m_delay; /延遲時間DWORD m_persist; /讀文件持續(xù)時間int m_serial; /線程序號 DWORD wait_for_mutex3 ;/互斥對象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);/阻塞互斥對象mu
29、tex3,保證對writecount的訪問,修改互斥wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1);writecount+;if(writecount=1)/第一個寫者,等待讀者讀完 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);/退出線
30、程printf(writer thread %d finished the writting file.n,m_serial);/離開臨界區(qū)LeaveCriticalSection(&cs_Write);/阻塞互斥對象mutex3,保證對writecount的訪問,修改互斥wait_for_mutex3=WaitForSingleObject(h_Mutex3,-1);writecount-;if(writecount=0)/寫者寫完,讀者可以讀LeaveCriticalSection(&cs_Read);ReleaseMutex(h_Mutex3);/寫者優(yōu)先處理函數(shù)/file 文件名voi
31、d WriterPriority(char *file)DWORD n_thread=0; /線程數(shù)目 DWORD thread_ID; /線程ID DWORD wait_for_all; /等待所有線程結(jié)束 /互斥對象 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); /線程對象的數(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); /打開文件 printf(writer Priority:nn); /whi
33、le(inFile) while(inFile) /讀入每一個讀者、寫者的信息 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)建寫者線程/ 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( = 讀者-寫者實驗?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,寫者優(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 #
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; /* 提交時間 */ float super; /* 優(yōu)先權(quán) */ int tb; /* 開始運(yùn)行時間 */ int tc; /* 完成時間 */ float ti; /* 周轉(zhuǎn)時間 */ float wi; /* 帶權(quán)周轉(zhuǎn)時間 */ int ntime; /* 作業(yè)所需運(yùn)行時間 */ 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();附錄四、銀行家算法模擬/銀行家算法問題的模擬實現(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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 電力市場中的電氣化鐵路供電策略分析
- 未來科技在辦公室的應(yīng)用如何通過太陽能取暖提高工作效率
- 現(xiàn)代辦公工具在醫(yī)療診斷中的應(yīng)用研究
- 現(xiàn)代藝術(shù)鑒賞從基礎(chǔ)到高階的創(chuàng)作之路
- 溝通技巧在醫(yī)療職場中的心理健康作用
- 電子商務(wù)中的供應(yīng)鏈管理策略與實踐
- 生態(tài)旅游景區(qū)的品牌建設(shè)與經(jīng)濟(jì)效益提升
- 生態(tài)農(nóng)業(yè)與鄉(xiāng)村旅游的融合發(fā)展策略
- 現(xiàn)代辦公空間的布局與動線規(guī)劃
- 醫(yī)療設(shè)備在風(fēng)濕性疾病治療中的作用考核試卷
- 全面新編部編版四年級下冊語文教材解讀分析
- 《建筑工程質(zhì)量檢驗評定標(biāo)準(zhǔn)》
- 教學(xué)能力大賽-教學(xué)實施報告《大學(xué)英語2c》
- 江蘇農(nóng)牧科技職業(yè)學(xué)院單招《職業(yè)技能測試》參考試題庫(含答案)
- VDA6.3 2023過程審核教材
- 高職應(yīng)用語文教程(第二版)教案 3管晏列傳
- 高中物理《光電效應(yīng)》
- 烹飪實訓(xùn)室安全隱患分析報告
- 《金屬加工的基礎(chǔ)》課件
- 運(yùn)輸行業(yè)春節(jié)安全生產(chǎn)培訓(xùn) 文明駕駛保平安
- 體驗式沙盤-收獲季節(jié)
評論
0/150
提交評論