版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p> 《操作系統(tǒng)》課程設(shè)計(jì)說(shuō)明書(shū)</p><p> 設(shè)計(jì)題目: 存儲(chǔ)管理 </p><p> 專 業(yè): 計(jì)算機(jī)科學(xué)與技術(shù) </p><p> 指導(dǎo)教師: </p><p> 班 級(jí):
2、</p><p> 學(xué) 號(hào): </p><p> 姓 名: </p><p> 同 組 人: </p><p><b> 計(jì)算機(jī)科學(xué)與工程系</b></p>
3、<p> 2013年 01 月 10 日</p><p><b> 前言</b></p><p> 本模擬系統(tǒng)實(shí)現(xiàn)了先進(jìn)先出頁(yè)面淘汰算法(FIFO)、最近最少使用LRU頁(yè)面淘汰算法、最近未使用算法NUR、最少訪問(wèn)頁(yè)面算法LFU和最佳淘汰算法OPT。同時(shí)系統(tǒng)可以隨意設(shè)置當(dāng)前分配給作業(yè)的物理塊數(shù)。</p><p> 系統(tǒng)運(yùn)行時(shí),
4、任意輸入一個(gè)頁(yè)面訪問(wèn)序列,可以設(shè)定不同的頁(yè)面置換算法和物理塊數(shù),輸出其頁(yè)面淘汰的情況,計(jì)算其缺頁(yè)次數(shù)和缺頁(yè)率。系統(tǒng)結(jié)束后,比較同一個(gè)頁(yè)面訪問(wèn)序列,可以得出在不同的頁(yè)面置換算法和物理塊數(shù)的情況下,其產(chǎn)生的缺頁(yè)次數(shù)和缺頁(yè)率。</p><p> 使用FIFO算法,由于測(cè)試數(shù)據(jù)相同的頁(yè)面比較少,所以采用FIFO算法時(shí),需要置換的頁(yè)面多,比較繁瑣,沒(méi)有優(yōu)化效果,所以FIFO算法性能不好。使用LRU的算法,此組數(shù)據(jù)顯示LR
5、U的算法使用比較繁瑣,總的來(lái)說(shuō),NUR、LFU、LRU算法介于FIFO和Optimial之間。通過(guò)系統(tǒng)模擬得出,optimal算法的性能高,LRU、NUR、LRU算法的性能次之,F(xiàn)IFO的算法性能最差,較少應(yīng)用;由于optimal算法在實(shí)際上難于實(shí)現(xiàn),所以實(shí)際應(yīng)用一般用LRU算法。</p><p> 本設(shè)計(jì)的目的是是熟悉存儲(chǔ)管理的設(shè)計(jì)方法,加深對(duì)請(qǐng)求分頁(yè)式存儲(chǔ)管理的</p><p>
6、認(rèn)識(shí)。設(shè)計(jì)中用到了數(shù)據(jù)結(jié)構(gòu)中的相關(guān)知識(shí),鏈表的操作,通過(guò)本設(shè)計(jì)可以加深的數(shù)據(jù)結(jié)構(gòu)的理解。設(shè)計(jì)代碼語(yǔ)言用到的是C語(yǔ)言,使用起來(lái)比較方便,可以在虛擬機(jī)和VC上直接運(yùn)行。</p><p><b> 目錄</b></p><p><b> 目錄3</b></p><p><b> 一、系統(tǒng)環(huán)境4</b&g
7、t;</p><p> 1.1、硬件環(huán)境4</p><p> 1.2、軟件環(huán)境4</p><p><b> 二、設(shè)計(jì)目的5</b></p><p><b> 三、總體設(shè)計(jì)6</b></p><p> 3.1、程序設(shè)計(jì)組成框圖6</p><
8、;p><b> 3.2、流程圖7</b></p><p><b> 四、詳細(xì)設(shè)計(jì)11</b></p><p> 4.1、數(shù)據(jù)結(jié)構(gòu)11</p><p> 4.1.1頁(yè)面類型11</p><p> 4.1.2頁(yè)面控制結(jié)構(gòu)11</p><p> 4.2.
9、函數(shù)定義12</p><p> 4.3.變量定義12</p><p> 4.4.算法分析12</p><p> 五、調(diào)試與測(cè)試14</p><p> 5.1、調(diào)試方法14</p><p> 5.2、測(cè)試結(jié)果的分析與討論14</p><p> 六、設(shè)計(jì)中遇到的問(wèn)題15&l
10、t;/p><p> 七、源程序清單16</p><p> 八、總結(jié),收獲與體會(huì)25</p><p><b> 九、參考文獻(xiàn)26</b></p><p><b> 一、系統(tǒng)環(huán)境</b></p><p><b> 1.1、硬件環(huán)境</b><
11、/p><p> PC機(jī)一臺(tái),內(nèi)存,2.0GHZ主頻</p><p><b> 1.2、軟件環(huán)境</b></p><p> 設(shè)計(jì)和實(shí)驗(yàn)將Windows環(huán)境下,gcc和虛擬機(jī)軟件VMWare。 </p><p><b> 二、設(shè)計(jì)目的</b></p><p> 存儲(chǔ)管理的主
12、要功能之一是合理地分配空間。請(qǐng)求頁(yè)式管理是一種常用的虛擬存儲(chǔ)管理技術(shù)。本設(shè)計(jì)的目的是通過(guò)請(qǐng)求頁(yè)式存儲(chǔ)管理中頁(yè)面置換算法模擬設(shè)計(jì),了解虛擬存儲(chǔ)技術(shù)的特點(diǎn),掌握請(qǐng)求頁(yè)式存儲(chǔ)管理的頁(yè)面置換算法。要求:</p><p> (1)通過(guò)隨機(jī)數(shù)產(chǎn)生一個(gè)指令序列,共320條指令。指令的地址按下述原則生成:</p><p> ?、?0%的指令是順序執(zhí)行的;②25%的指令是均勻分布在前地址部分;③25%的指
13、令是均勻分布在后地址部分。</p><p> 具體的實(shí)施方法是:①在[0,319]的指令地址之間隨機(jī)選取一起點(diǎn)m;②順序執(zhí)行一條指令,即執(zhí)行地址為m+l的指令;③在前地址[0,m+1]中隨機(jī)選取一條指令并執(zhí)行,該指令的地址為m’;④順序執(zhí)行一條指令,其地址為m’+1;⑤在后地址[m’+2,319]中隨機(jī)選取一條指令并執(zhí)行;⑥重復(fù)上述步驟①~⑤,直到執(zhí)行320次指令。</p><p>
14、(2)將指令序列變換成為頁(yè)地址流。設(shè):①頁(yè)面大小為1K;②用戶內(nèi)存容量為4頁(yè)到32頁(yè);③用戶虛存容量為32K。</p><p> 在用戶虛存中,按每頁(yè)存放10條指令排列虛存地址,即320條指令在虛存中的存放方式為:</p><p> 第0條~第9條指令為第0頁(yè)(對(duì)應(yīng)虛存地址為[0,9]);</p><p> 第10條~第19條指令為第1頁(yè)(對(duì)應(yīng)虛存地址為[10
15、,19]);</p><p><b> … … … </b></p><p> 第310條~第319條指令為第31頁(yè)(對(duì)應(yīng)虛存地址為[310,319])。</p><p> 按以上方式,用戶指令可組成32頁(yè)。</p><p> (3)計(jì)算并輸出下述各種算法在不同內(nèi)存容量下的命中率(要為以下各種算法定義數(shù)據(jù)結(jié)構(gòu))。
16、</p><p> ?、傧冗M(jìn)先出的算法(FIFO);</p><p> ?、谧罱钌偈褂盟惴?LRU);</p><p> ?、圩罱畈唤?jīng)常使用算法(NUR/NRU/CLOCK)。</p><p><b> 三、總體設(shè)計(jì)</b></p><p> 3.1、程序設(shè)計(jì)組成框圖</p>
17、<p><b> 程序設(shè)計(jì)組成框圖</b></p><p><b> 3.2、流程圖</b></p><p> FIFO LRU</p><p><b> Y</b></p><p><
18、;b> Y</b></p><p><b> Y</b></p><p><b> N</b></p><p><b> LRU算法</b></p><p><b> NUR算法</b></p><p>
19、<b> OPT算法</b></p><p><b> 四、詳細(xì)設(shè)計(jì)</b></p><p> 本程序設(shè)計(jì)基本按照題目的要求進(jìn)行。即首先用srand()和rand()函數(shù)定義和產(chǎn)生指令序列,然后將指令序列變成相應(yīng)的頁(yè)地址流,并針對(duì)不同的算法計(jì)算出相應(yīng)的命中率。</p><p><b> 4.1、數(shù)據(jù)結(jié)構(gòu)&
20、lt;/b></p><p><b> 4.1.1頁(yè)面類型</b></p><p> Typedef struct{</p><p> Int pn,pfn,count,time;</p><p><b> }pl_type;</b></p><p> 其中p
21、n為頁(yè)號(hào),pfn為面號(hào),count為個(gè)周期內(nèi)訪問(wèn)該頁(yè)面次數(shù)time為訪問(wèn)時(shí)間。</p><p> 4.1.2頁(yè)面控制結(jié)構(gòu)</p><p> pfc_struct{</p><p> intpn,pfn;</p><p> struct pfc_struct*next;</p><p><b>
22、}</b></p><p> typedefstruct pfc_struct pfc_type;</p><p> pfc_typepfc[xy],*free_head,*busy_head;</p><p> pfc_type*busy_tail;</p><p><b> 其中:</b>&
23、lt;/p><p> pfc[xy]定義用戶進(jìn)程虛頁(yè)控制結(jié)構(gòu),</p><p> *free_head為空頁(yè)面頭的指針,</p><p> *busy_head為忙頁(yè)面頭的指針,</p><p> *busy_tail為忙頁(yè)面尾的指針。</p><p><b> 4.2.函數(shù)定義</b>&l
24、t;/p><p> (1)void initialize():初始化函數(shù),給每個(gè)相關(guān)的頁(yè)面賦值。</p><p> (2)void FIFO():計(jì)算使用FIFO算法時(shí)的命中率。</p><p> (3)void LRU():計(jì)算使用LRU算法時(shí)的命中率。</p><p> (4)void OPT():計(jì)算使用OPT算法時(shí)的命中率。<
25、;/p><p> (5)void LFU():計(jì)算使用LFU算法時(shí)的命中率。</p><p> (6)void NUR():計(jì)算使用NUR算法時(shí)的命中率。</p><p><b> 4.3.變量定義</b></p><p> (1)int a[zllc];指令流數(shù)據(jù)組。</p><p> (
26、2)int page[zllc];每條指令所屬頁(yè)號(hào)。</p><p> (3)int offset[zllc];每頁(yè)裝入10條指令后取模運(yùn)算頁(yè)號(hào)偏移值。</p><p> (4)int pf:用戶進(jìn)程的內(nèi)存頁(yè)面數(shù)。</p><p> (5)int zhihuan:頁(yè)面失效次數(shù)。</p><p><b> 4.4.算法分析&l
27、t;/b></p><p> 先進(jìn)先出算法,即FIFO算法(First-In First-Out algorithm)。這種算法選擇最先調(diào)入主存儲(chǔ)器的頁(yè)面作為被替換的頁(yè)面。它的優(yōu)點(diǎn)是比較容易實(shí)現(xiàn),能夠利用主儲(chǔ)存器中頁(yè)面調(diào)度情況的歷史信息,但是沒(méi)有反應(yīng)程序的局部性。因?yàn)樽钕日{(diào)入主存的頁(yè)面,很有可能是經(jīng)常使用的頁(yè)面。</p><p> 最近最少使用算法,即LFU(Least Freq
28、uently used algorithm)。這種算法選擇近期最少訪問(wèn)的頁(yè)面作為被替換的頁(yè)面。顯然這是一種非常合理的算法,因?yàn)榈侥壳盀橹棺钌偈褂玫捻?yè)面,和可能也是將來(lái)最少訪問(wèn)的頁(yè)面。該算法即充分利用了主存中嗎調(diào)度的歷史信息,又正確反映了程序的局部性。但是這種算法實(shí)現(xiàn)起來(lái)非常的困難,它要為每個(gè)頁(yè)面設(shè)置一個(gè)很長(zhǎng)的計(jì)數(shù)器,并且要選擇一個(gè)固定的時(shí)鐘為每個(gè)計(jì)數(shù)器定時(shí)計(jì)數(shù)。在選擇被替換頁(yè)面時(shí),要從所有的計(jì)數(shù)器中選擇一個(gè)計(jì)數(shù)值最大的計(jì)數(shù)器。因此,通常
29、使用如下一種簡(jiǎn)單的方法。</p><p> 最久沒(méi)有使用算法。即LRU(Least Recently Used Algorithm)。這種算法把近期最久沒(méi)有被訪問(wèn)的頁(yè)面作為被替換的頁(yè)面。它把LFU算法中要記錄數(shù)量上的多與少簡(jiǎn)化成判斷有于無(wú),因此實(shí)現(xiàn)起來(lái)比較容易。</p><p> NUR算法在需要淘汰一頁(yè)時(shí),從哪些最近一個(gè)時(shí)期內(nèi)未被訪問(wèn)的頁(yè)面中任選一頁(yè)淘汰。只要在頁(yè)面中增加一個(gè)訪問(wèn)位即
30、可實(shí)現(xiàn)。當(dāng)某頁(yè)被訪問(wèn)時(shí),訪問(wèn)位置1.否則,訪問(wèn)位置0.系統(tǒng)周期性第對(duì)所有的引用位清零。當(dāng)須淘汰一頁(yè)時(shí)從那些訪問(wèn)位為0 的頁(yè)中選擇一頁(yè)進(jìn)行淘汰。如果引用位全為1或0,NRU算法退化為FIFO算法。</p><p> 最優(yōu)替換算法,即OPT(Optimal Replacement Algorithm).s上面介紹的幾種頁(yè)面替換算法主要是以主存儲(chǔ)器中頁(yè)面調(diào)度情況的歷史信息為依據(jù)的,它假設(shè)將來(lái)主存儲(chǔ)器中的頁(yè)面調(diào)度情況與
31、過(guò)去一段時(shí)間內(nèi)主存儲(chǔ)器中的頁(yè)面調(diào)度情況是相同的。當(dāng)然這種假設(shè)不總是正確的。最好的算法是選擇將來(lái)醉酒不被訪問(wèn)的頁(yè)面作為被替換的頁(yè)面,這種算法的命中率是最高的,它就是最有替換算法。要實(shí)現(xiàn)OPT算法,唯一的辦法就是讓程序先執(zhí)行一遍,記錄下實(shí)際的頁(yè)地址流情況。根據(jù)這個(gè)頁(yè)地址流才能找到藥被替換的頁(yè)面。顯然這樣做是不現(xiàn)實(shí)的。因此OPT算法只是一種理想化的算法,然而它也是一種很用的算法。實(shí)際上,經(jīng)常把這種算法作為評(píng)價(jià)其他頁(yè)面替換算法好壞的標(biāo)準(zhǔn)。在其他
32、條件相同的情況下,哪一種算法的命中率與OPT算法最接近,那么,它就是一種比較好的頁(yè)面替換算法。</p><p><b> 五、調(diào)試與測(cè)試</b></p><p><b> 5.1、調(diào)試方法</b></p><p> 利用Vware虛擬機(jī)的命令,用touch創(chuàng)建文件,vi 進(jìn)入文件,然后編寫代碼,運(yùn)行程序。</p
33、><p> 2、測(cè)試結(jié)果的分析與討論</p><p><b> 調(diào)試運(yùn)行結(jié)果圖</b></p><p> 5.2、測(cè)試結(jié)果的分析與討論</p><p> 使用FIFO算法需要置換的頁(yè)面多,比較繁瑣,沒(méi)有優(yōu)化效果,所以FIFO算法性能不好。LRU的算法,此組數(shù)據(jù)顯示LRU的算法使用比較繁瑣,總的來(lái)說(shuō),NUR、LFU、L
34、RU算法介于FIFO和Optimial之間。通過(guò)系統(tǒng)模擬得出,optimal算法的性能高,LRU、NUR、LRU算法的性能次之,F(xiàn)IFO的算法性能最差,較少應(yīng)用;由于optimal算法在實(shí)際上難于實(shí)現(xiàn),所以實(shí)際應(yīng)用一般用LRU算法。</p><p> 六、設(shè)計(jì)中遇到的問(wèn)題</p><p> 本次課程設(shè)計(jì)中我們遇到的問(wèn)題是,一開(kāi)始沒(méi)有弄清楚rand和sand函數(shù)的使用方法,以至于運(yùn)行時(shí)的
35、到的結(jié)果與實(shí)際算起來(lái)的不相符,后來(lái)查閱資料,上網(wǎng)瀏覽搜索相關(guān)信息后,終于弄明白了是怎么回事。</p><p> 函數(shù)rand()是真正的隨機(jī)數(shù)生成器,而srand()會(huì)設(shè)置供rand()使用的隨機(jī)數(shù)種子。如果你在第一次調(diào)用rand()之前沒(méi)有調(diào)用srand(),那么系統(tǒng)會(huì)為你自動(dòng)調(diào)用srand()。而使用同種子相同的數(shù)調(diào)用 srand()會(huì)導(dǎo)致相同的隨機(jī)數(shù)序列被生成。 </p><p>
36、 srand((unsigned)time(NULL))則使用系統(tǒng)定時(shí)/計(jì)數(shù)器的值做為隨機(jī)種子。每個(gè)種子對(duì)應(yīng)一組根據(jù)算法預(yù)先生成的隨機(jī)數(shù),所以,在相同的平臺(tái)環(huán)境下,不同時(shí)間產(chǎn)生的隨機(jī)數(shù)會(huì)是不同的,相應(yīng)的,若將srand(unsigned)time(NULL)改為srand(TP)(TP為任一常量),則無(wú)論何時(shí)運(yùn)行、運(yùn)行多少次得到的“隨機(jī)數(shù)”都會(huì)是一組固定的序列,因此srand生成的隨機(jī)數(shù)是偽隨機(jī)數(shù)。</p><p&
37、gt; 還有就是開(kāi)始代碼編寫完了之后,運(yùn)行時(shí)OPT算法結(jié)果出錯(cuò)。這個(gè)問(wèn)題是在我們討論并仔細(xì)查看OPT算法的內(nèi)容后修改的。</p><p><b> 七、源程序清單</b></p><p> #include<stdlib.h></p><p> #include<stdio.h></p><p
38、> #include<time.h></p><p> #define TRUE 1</p><p> #define FALSE 0</p><p> #define INVALID -1</p><p> #define zllc 320 //指令流長(zhǎng)</p><p> #define
39、 xy 32 //虛頁(yè)長(zhǎng)</p><p> #define clear 50 //清零周期</p><p> typedef struct //頁(yè)面結(jié)構(gòu)</p><p><b> {</b></p><p> int pn;//頁(yè)號(hào)</p><p> int pfn;//頁(yè)面框架號(hào)<
40、;/p><p> int count; //計(jì)數(shù)器</p><p> int time;//時(shí)間</p><p><b> }pc;</b></p><p> pc pl[xy];//頁(yè)面線性結(jié)構(gòu)</p><p> typedef struct pfc_struct//頁(yè)面控制結(jié)構(gòu),調(diào)度算法
41、的控制結(jié)構(gòu)</p><p><b> {</b></p><p><b> int pn;</b></p><p><b> int pfn;</b></p><p> struct pfc_struct *next;</p><p> }pf
42、c_type;</p><p> pfc_type pfc[xy],*free_head,*busy_head,*busy_tail;</p><p> int zhihuan,a[zllc];//a[] 為指令序列</p><p> int page[zllc],offset[zllc];//地址信息</p><p> int in
43、itialize(int);//初始化模塊</p><p> int FIFO(int);//FIFO調(diào)度算法</p><p> int LRU(int);//LRU調(diào)度算法</p><p> int LFU(int);//LFU調(diào)度算法</p><p> int NUR(int);//NUR調(diào)度算法</p><p
44、> int OPT(int);//OPT調(diào)度算法</p><p><b> /*主函數(shù)*/</b></p><p> int main()</p><p><b> {</b></p><p><b> int s,i;</b></p><p
45、> srand((unsigned)time(NULL));</p><p> s = rand()%320;</p><p> for(i=0;i<zllc;i += 4)</p><p><b> {</b></p><p> if(s<0||s>319)</p>&l
46、t;p><b> {</b></p><p> printf("When i == %d,Error,s==%d",i,s);</p><p><b> exit(0);</b></p><p><b> }</b></p><p><b
47、> a[i] = s;</b></p><p> a[i+1] = a[i]+1;</p><p> a[i+2] = rand()%(a[i+1]+1);</p><p> a[i+3] = a[i+2] + 1;</p><p> s = rand()%(319-a[i+3]) +a[i+3]+1;</p
48、><p> if(a[i+2]>318||s>319)</p><p><b> {</b></p><p> printf("a[%d+2],a number which is:%d and s == %d\n",i,a[i+2],s);</p><p><b> }<
49、;/b></p><p><b> }</b></p><p> for(i=0;i<zllc;i++)//將指令序列變換為頁(yè)地址流</p><p><b> {</b></p><p> page[i] = a[i]/10;</p><p> offs
50、et[i] = a[i]%10;</p><p><b> }</b></p><p> for(i=4;i<=32;i++)</p><p><b> {</b></p><p> printf("%2d page frames:\t",i);</p>
51、<p><b> FIFO(i);</b></p><p><b> LRU(i);</b></p><p><b> LFU(i);</b></p><p><b> NUR(i);</b></p><p><b> O
52、PT(i);</b></p><p><b> }</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> /*初始化相關(guān)的數(shù)據(jù)結(jié)構(gòu),pf表示內(nèi)存的塊數(shù)*/</p><p>
53、; int initialize(int pf)</p><p><b> {</b></p><p><b> int i;</b></p><p> zhihuan = 0;</p><p> for(i=0;i<xy;i++)</p><p><b
54、> {</b></p><p> pl[i].pn = i;</p><p> pl[i].pfn = INVALID;//質(zhì)頁(yè)面控制結(jié)構(gòu)中的頁(yè)號(hào),頁(yè)面為空</p><p> pl[i].count = 0;//頁(yè)面控制結(jié)構(gòu)中訪問(wèn)次數(shù)</p><p> pl[i].time = -1;//訪問(wèn)時(shí)間</p>
55、;<p><b> }</b></p><p> for(i=0;i<pf-1;i++)//建立pfc[i-1]與pfc[i]之間的聯(lián)系</p><p><b> {</b></p><p> pfc[i].next = &pfc[i+1];</p><p>
56、pfc[i].pfn = i;</p><p><b> }</b></p><p> pfc[pf-1].next = NULL;</p><p> pfc[pf-1].pfn = pf-1;</p><p> free_head = &pfc[0];//空頁(yè)面隊(duì)列的頭指針為pfc[0]</p&g
57、t;<p><b> return 0;</b></p><p><b> }</b></p><p> /*先進(jìn)先出算法,pf為用戶進(jìn)程的內(nèi)存頁(yè)面數(shù)*/</p><p> int FIFO(int pf)</p><p><b> {</b></
58、p><p><b> int i;</b></p><p> pfc_type *p;//中間變量</p><p> initialize(pf);//初始化數(shù)據(jù)結(jié)構(gòu)</p><p> busy_head = busy_tail = NULL;//忙頁(yè)面頭隊(duì)列,為隊(duì)列鏈接</p><p>
59、for(i=0;i<zllc;i++)</p><p><b> {</b></p><p> if(pl[page[i]].pfn == INVALID)//頁(yè)面失效</p><p><b> {</b></p><p> zhihuan++;//失效次數(shù)</p>&l
60、t;p> if(free_head == NULL)//無(wú)空閑頁(yè)面</p><p><b> {</b></p><p> p = busy_head->next;//保存忙頁(yè)面的下一個(gè)頁(yè)面</p><p> pl[busy_head->pn].pfn = INVALID;//把這個(gè)頁(yè)面換出,更新它的數(shù)據(jù)成員</
61、p><p> free_head = busy_head;//釋放忙頁(yè)面隊(duì)列的第一個(gè)頁(yè)面</p><p> free_head->next = NULL;//表明此頁(yè)面是空的組后一面</p><p> busy_head = p;//更新頁(yè)面的頭隊(duì)列指針</p><p><b> }</b></p>
62、<p> p = free_head->next;</p><p> free_head->pn = page[i];</p><p> pl[page[i]].pfn = free_head->pfn;</p><p> free_head->next = NULL;//使busy的尾為空</p><
63、;p> if(busy_tail == NULL)</p><p><b> {</b></p><p> busy_tail = busy_head = free_head;</p><p><b> }</b></p><p><b> else</b>&l
64、t;/p><p><b> {</b></p><p> //把剛剛換進(jìn)來(lái)的接在busy_tail的后面</p><p> busy_tail->next = free_head;</p><p> busy_tail = free_head;</p><p><b> }&
65、lt;/b></p><p> free_head = p;//下一個(gè)空頁(yè)面</p><p><b> }</b></p><p><b> }</b></p><p> printf("FIFO:%6.4f|",1-(float)zhihuan/320);<
66、;/p><p><b> return 0;</b></p><p><b> }</b></p><p> /*最近最久未使用算法*/</p><p> int LRU(int pf)</p><p><b> {</b></p>
67、<p> int min,minj,i,j,present_time;//minj為最小值下標(biāo)</p><p> initialize(pf);</p><p> present_time=0;</p><p> for(i=0;i<zllc;i++)</p><p><b> {</b><
68、;/p><p> if(pl[page[i]].pfn == INVALID)//頁(yè)面失效</p><p><b> {</b></p><p> zhihuan++;</p><p> if(free_head == NULL)//無(wú)空閑頁(yè)面</p><p><b> {<
69、/b></p><p> min = 32767;//設(shè)置最大值</p><p> for(j=0;j<xy;j++)//找出time最下值</p><p><b> {</b></p><p> if(min>pl[j].time&&pl[j].pfn!=INVALID)<
70、;/p><p><b> {</b></p><p> min = pl[j].time;</p><p><b> minj = j;</b></p><p><b> }</b></p><p><b> }</b><
71、;/p><p> free_head = &pfc[pl[minj].pfn];//騰出一個(gè)單元</p><p> pl[minj].pfn = INVALID;</p><p> pl[minj].time = 0;</p><p> free_head->next= NULL;</p><p>&
72、lt;b> }</b></p><p> pl[page[i]].pfn = free_head->pfn;//有空閑頁(yè)面改為有效</p><p> pl[page[i]].time =present_time;</p><p> free_head = free_head->next;//減少一個(gè)free頁(yè)面</p>
73、;<p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> pl[page[i]].time = present_time;//命中則增加該頁(yè)面的訪問(wèn)次數(shù)</p><p><b&
74、gt; }</b></p><p> present_time++;</p><p><b> }</b></p><p> printf("LRU:%6.4f|",1-(float)zhihuan/320);</p><p><b> return 0;</b
75、></p><p><b> }</b></p><p> /*最近未使用算法*/</p><p> int NUR(int pf)</p><p><b> {</b></p><p> int i,j,dp,cont_flag,old_dp;//這個(gè)算法用
76、count用于訪問(wèn)位</p><p> initialize(pf);</p><p><b> dp = 0;</b></p><p> for(i=0;i<zllc;i++)</p><p><b> {</b></p><p> if(pl[page[i
77、]].pfn == INVALID)//頁(yè)面失效</p><p><b> {</b></p><p> zhihuan++;</p><p> if(free_head == NULL)//無(wú)空閑頁(yè)</p><p><b> {</b></p><p> cont
78、_flag = TRUE;</p><p> old_dp = dp;</p><p> while(cont_flag)//找到一訪問(wèn)位count為0的頁(yè)面</p><p><b> {</b></p><p> if(pl[dp].count == 0 && pl[dp].pfn != INV
79、ALID)</p><p><b> {</b></p><p> cont_flag = FALSE;</p><p><b> }</b></p><p> else//下一個(gè)頁(yè)面</p><p><b> {</b></p>
80、<p> pl[dp].count = 0;</p><p><b> dp++;</b></p><p> if(dp==xy)//32個(gè)頁(yè)面找一遍,開(kāi)始新的循環(huán)</p><p><b> dp=0;</b></p><p><b> }</b><
81、/p><p><b> }</b></p><p> free_head = &pfc[pl[dp].pfn];</p><p> pl[dp].pfn = INVALID;</p><p> free_head->next = NULL;</p><p><b>
82、}</b></p><p> pl[page[i]].pfn = free_head->pfn;</p><p> pl[page[i]].count = 1;</p><p> free_head->pn = page[i];</p><p> free_head = free_head->next;&
83、lt;/p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> pl[page[i]].count = 1;</p><p><b> }</b>&
84、lt;/p><p> if(i%clear == 0)</p><p> for(j=0;j<xy;j++)</p><p> pl[j].count = 0;</p><p><b> }</b></p><p> printf("NUR:%6.4f|",1-(
85、float)zhihuan/320);</p><p><b> return 0;</b></p><p><b> }</b></p><p> /*最少訪問(wèn)頁(yè)面算法*/</p><p> int LFU(int pf)</p><p><b> {&
86、lt;/b></p><p> int i,j,min,minpage;</p><p> initialize(pf);</p><p> for(i=0;i<zllc;i++)</p><p><b> {</b></p><p> if(pl[page[i]].pfn
87、== INVALID)//頁(yè)面失效</p><p><b> {</b></p><p> zhihuan++;</p><p> if(free_head == NULL)//無(wú)空閑頁(yè)面</p><p><b> {</b></p><p> min = 3276
88、7;//獲取count的使用頻率最小的內(nèi)存</p><p> for(j=0;j<xy;j++)</p><p><b> {</b></p><p> if(min>pl[j].count&&pl[j].pfn!=INVALID)</p><p><b> {</b&
89、gt;</p><p> min = pl[j].count;</p><p> minpage=j;</p><p><b> }</b></p><p><b> }</b></p><p> free_head = &pfc[pl[minpage].p
90、fn];</p><p> pl[minpage].pfn = INVALID;</p><p> pl[minpage].count=0;</p><p> free_head->next=NULL;</p><p><b> }</b></p><p> pl[page[i]]
91、.pfn = free_head->pfn;</p><p> pl[page[i]].count++;</p><p> free_head = free_head->next;//減少一個(gè)free頁(yè)面</p><p><b> }</b></p><p><b> else</b&
92、gt;</p><p><b> {</b></p><p> pl[page[i]].count = pl[page[i]].count+1;</p><p><b> }</b></p><p><b> }</b></p><p> pr
93、intf("LFU:%6.4f",1-(float)zhihuan/320);</p><p><b> return 0;</b></p><p><b> }</b></p><p> /*最佳置換算法*/</p><p> int OPT(int pf)</
94、p><p><b> {</b></p><p> int i,j,k,l,max,maxpage;</p><p> initialize(pf);</p><p> for(i = 0; i < zllc; i++)</p><p><b> {</b><
95、;/p><p> if(pl[page[i]].pfn == INVALID)//頁(yè)面失效</p><p><b> { </b></p><p> zhihuan++;</p><p> max = maxpage = 0;</p><p> if(free_head == NULL)
96、//無(wú)頁(yè)面空閑</p><p><b> {</b></p><p> for(j = 0; j < pf; j++)</p><p><b> {</b></p><p><b> l = 1;</b></p><p> for(k =
97、 i + 1; k < zllc; k++)</p><p><b> {</b></p><p> if(pfc[j].pn == page[k])</p><p><b> {</b></p><p> if(max < l)</p><p><
98、b> {</b></p><p><b> max = l;</b></p><p> maxpage = j;</p><p><b> }</b></p><p><b> break;</b></p><p><b
99、> }</b></p><p><b> l++;</b></p><p><b> }</b></p><p> if(k == 320)</p><p> maxpage = j;</p><p><b> }</b>&
100、lt;/p><p> free_head = &pfc[maxpage];</p><p> free_head->next = NULL;</p><p> pl[pfc[maxpage].pn].pfn = INVALID;</p><p><b> }</b></p><p&g
101、t; pl[page[i]].pfn = free_head->pfn;</p><p> free_head->pn = pl[page[i]].pn ;</p><p> free_head = free_head->next ;</p><p><b> }</b></p><p><
102、;b> }</b></p><p> printf("OPT:%6.4f\n",1-(float)zhihuan/320);</p><p><b> return 0;</b></p><p><b> }</b></p><p> 八、總結(jié),收獲
103、與體會(huì)</p><p> 在本次操作系統(tǒng)課程設(shè)計(jì),我采用C實(shí)現(xiàn)請(qǐng)求頁(yè)式管理缺頁(yè)中段模擬設(shè)計(jì)的隨機(jī)和LRU淘汰算法。首先,應(yīng)了解虛擬存儲(chǔ)器和頁(yè)式存儲(chǔ)管理的有關(guān)內(nèi)容,并掌握隨機(jī)和LRU淘汰算法的核心思想及具體的流程。然后,在這個(gè)基礎(chǔ)上,結(jié)合所掌握的C編程方法和技巧,編寫正確的算法。</p><p> 隨機(jī)淘汰算法比較容易實(shí)現(xiàn),當(dāng)需要調(diào)入一個(gè)新頁(yè)面進(jìn)入內(nèi)存時(shí),用rand()函數(shù)產(chǎn)生的隨機(jī)數(shù),
104、作為將要被淘汰的內(nèi)存物理塊號(hào),然后修改頁(yè)表內(nèi)容即可。LRU算法就顯得復(fù)雜一些,其核心問(wèn)題在于怎樣找到內(nèi)存中最近最少使用的那個(gè)頁(yè)面。 最初設(shè)計(jì)這個(gè)算法時(shí),出現(xiàn)了一點(diǎn)問(wèn)題,在某種情況下,會(huì)淘汰剛剛被訪問(wèn)過(guò)的頁(yè)面。經(jīng)過(guò)修改,彌補(bǔ)了這個(gè)不足之處,算法的運(yùn)行結(jié)果正確。 </p><p> 從這次的課程設(shè)計(jì)中,我有很大收獲。首先,鞏固了所學(xué)的有關(guān)頁(yè)式存儲(chǔ)管理的相關(guān)知識(shí),更深層次地理解并掌握了LRU和隨機(jī)淘汰算法的
105、精髓。通過(guò)使用C語(yǔ)言模擬LRU和隨機(jī)算法實(shí)現(xiàn)請(qǐng)求頁(yè)式管理,進(jìn)一步提高了我的編程能力,并且有助于將操作系統(tǒng)和C有機(jī)地結(jié)合起來(lái),使我更加明白了學(xué)科之間是緊密聯(lián)系的。 此外,經(jīng)過(guò)這次課程設(shè)計(jì),我更加感悟到了,僅僅學(xué)習(xí)書(shū)本上的理論知識(shí)是不夠的,要在平時(shí)多進(jìn)行實(shí)際操作,這樣才能融會(huì)貫通,更加牢固地掌握所學(xué)知識(shí)。在以后的學(xué)習(xí)過(guò)程中,我應(yīng)該更加深入學(xué)習(xí)有關(guān)C的內(nèi)容,提高自己的動(dòng)手能力。</p><p><b> 九
溫馨提示
- 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ù)僅提供信息存儲(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 模擬頁(yè)式存儲(chǔ)管理-操作系統(tǒng)課程設(shè)計(jì)
- 模擬頁(yè)式存儲(chǔ)管理 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)--請(qǐng)求頁(yè)式存儲(chǔ)管理
- 操作系統(tǒng)課程設(shè)計(jì)--請(qǐng)求頁(yè)式存儲(chǔ)管理
- 操作系統(tǒng)課程設(shè)計(jì)--- 請(qǐng)求調(diào)頁(yè)存儲(chǔ)管理
- 操作系統(tǒng)課程設(shè)計(jì)--請(qǐng)求頁(yè)式存儲(chǔ)管理
- 虛擬存儲(chǔ)器管理系統(tǒng)操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---文件加密存儲(chǔ)
- 操作系統(tǒng)課程設(shè)計(jì)——操作系統(tǒng)課程設(shè)計(jì)模擬操作系統(tǒng)
- 內(nèi)存管理(操作系統(tǒng))操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)---動(dòng)態(tài)分區(qū)分配存儲(chǔ)管理
- 操作系統(tǒng)課程設(shè)計(jì)--模擬實(shí)現(xiàn)可變分區(qū)存儲(chǔ)管理
- 操作系統(tǒng)原理課程設(shè)計(jì)報(bào)告-可變分區(qū)存儲(chǔ)管理
- 模擬頁(yè)式存儲(chǔ)管理-操作系統(tǒng)課程設(shè)計(jì)報(bào)告
- 操作系統(tǒng)課程設(shè)計(jì)-- 操作系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)--模擬請(qǐng)求頁(yè)式存儲(chǔ)管理
- 操作系統(tǒng)課程設(shè)計(jì)---進(jìn)程管理系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)--文件管理系統(tǒng)
- 操作系統(tǒng)課程設(shè)計(jì)
- 操作系統(tǒng)課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論