操作系統(tǒng)課程設(shè)計(jì)-張為曉_第1頁(yè)
操作系統(tǒng)課程設(shè)計(jì)-張為曉_第2頁(yè)
操作系統(tǒng)課程設(shè)計(jì)-張為曉_第3頁(yè)
操作系統(tǒng)課程設(shè)計(jì)-張為曉_第4頁(yè)
操作系統(tǒng)課程設(shè)計(jì)-張為曉_第5頁(yè)
已閱讀5頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、課程設(shè)計(jì)說(shuō)明書(shū)課程名稱(chēng):操作系統(tǒng)課程設(shè)計(jì)專(zhuān)業(yè):計(jì)算機(jī)科學(xué)與技術(shù)班級(jí):2012-2 設(shè) 計(jì) 人:晁子墨山東科技大學(xué)2015 年 1 月 14 日2山東科技大學(xué)課 程 設(shè) 計(jì) 任 務(wù) 書(shū)一、課程設(shè)計(jì)題目:操作系統(tǒng)二、設(shè)計(jì)原始資料:操作系統(tǒng) (第三版)、 現(xiàn)代操作系統(tǒng)三、設(shè)計(jì)應(yīng)解決下列各主要問(wèn)題:1、生產(chǎn)者 - 消費(fèi)者問(wèn)題 2、內(nèi)存管理3、快速文件系統(tǒng)四、設(shè)計(jì)說(shuō)明書(shū)應(yīng)附有下列圖紙:五、小組分工說(shuō)明:晁子墨生產(chǎn)者- 消費(fèi)者問(wèn)題、內(nèi)存管理、快速文件系統(tǒng)六、命題發(fā)出日期:2014-9-24 設(shè)計(jì)完成日期:2015-1-15 3指導(dǎo)教師評(píng)語(yǔ)成績(jī):指導(dǎo)教師(簽章):年月日4目錄題目一生產(chǎn)者 - 消費(fèi)者問(wèn)題1需

2、求分析說(shuō)明51.1 問(wèn)題描述5 1.2 原理分析6 2概要設(shè)計(jì)說(shuō)明62.1 功能描述6 2.2 數(shù)據(jù)結(jié)構(gòu)分析7 2.3 數(shù)據(jù)結(jié)構(gòu)圖7 3詳細(xì)設(shè)計(jì)說(shuō)明83.1 主函數(shù)模塊8 3.2 程序流程圖8 3.2.1 生產(chǎn)者9 3.2.2 消費(fèi)者10 4調(diào)試分析 114.1 遇到的問(wèn)題11 4.2 測(cè)試結(jié)果13 5用戶使用說(shuō)明13 題目二 內(nèi)存管理系統(tǒng)1 需求分析說(shuō)明171.1 問(wèn)題描述 17 1.2 原理分析 18 2 概要設(shè)計(jì)說(shuō)明182.1 函數(shù)定義說(shuō)明19 53 詳細(xì)設(shè)計(jì)說(shuō)明213. 1代 碼實(shí) 現(xiàn) 26 4 調(diào)試分析 264. 1運(yùn) 行 結(jié) 果 2 7 4.2 運(yùn)行結(jié)果分析28 5 用戶使用說(shuō)明3

3、0 題目三 快速文件系統(tǒng)1 需求分析說(shuō)明371.1 設(shè)計(jì)目的37 1.2 問(wèn)題描述38 1.3 原理說(shuō)明38 2 概要設(shè)計(jì)說(shuō)明392.1 函數(shù)定義說(shuō)明40 3 詳細(xì)設(shè)計(jì)說(shuō)明413. 1代 碼實(shí) 現(xiàn) 43 4 調(diào)試分析 434. 1運(yùn) 行 結(jié) 果 4 3 4.2 運(yùn)行結(jié)果分析44 5 用戶使用說(shuō)明455.1 用戶操作指南46 課 程 設(shè) 計(jì)總 結(jié) 486題目一生產(chǎn)者 - 消費(fèi)者問(wèn)題1 需求分析說(shuō)明生產(chǎn)者 -消費(fèi)者問(wèn)題的總體目標(biāo): 在 windows 的開(kāi)發(fā)環(huán)境下,利用所學(xué) c+語(yǔ)言和數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識(shí),利用程序?qū)崿F(xiàn)經(jīng)典的生產(chǎn)者-消費(fèi)者問(wèn)題的輸出,以幫助我們更好的理解和應(yīng)用進(jìn)程同步的原理。1問(wèn)題描

4、述有一個(gè)生產(chǎn)者在生產(chǎn)產(chǎn)品,這些產(chǎn)品將提供給若干個(gè)消費(fèi)者去消費(fèi),為了使生產(chǎn)者和消費(fèi)者能并發(fā)執(zhí)行,在兩者之間設(shè)置一個(gè)具有多個(gè)緩沖區(qū)的緩沖池,生產(chǎn)者將它生產(chǎn)的產(chǎn)品放入一個(gè)緩沖區(qū)中,消費(fèi)者可以從緩沖區(qū)中取走產(chǎn)品進(jìn)行消費(fèi),顯然生產(chǎn)者和消費(fèi)者之間必須保持同步,即不允許消費(fèi)者到一個(gè)空的緩沖區(qū)中取走產(chǎn)品,也不允許生產(chǎn)者向一個(gè)已經(jīng)放入產(chǎn)品的緩沖區(qū)中再次投放產(chǎn)品。這就是生產(chǎn)者-消費(fèi)者問(wèn)題。2原理分析在同一個(gè)進(jìn)程地址空間內(nèi)執(zhí)行的兩個(gè)線程。生產(chǎn)者線程生產(chǎn)物品, 然后將物品放置在一個(gè)空緩沖區(qū)中供消費(fèi)者線程消費(fèi)。消費(fèi)者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。當(dāng)生產(chǎn)者線程生產(chǎn)物品時(shí),如果沒(méi)有空緩沖區(qū)可用,那么生產(chǎn)者線程必須

5、等待消費(fèi)者線程釋放出一個(gè)空緩沖區(qū)。當(dāng)消費(fèi)者線程消費(fèi)物品時(shí),如果沒(méi)有滿的緩沖區(qū),那么消費(fèi)者線程將被阻塞,直到新的物品被生產(chǎn)出來(lái)。2 概要設(shè)計(jì)說(shuō)明1功能描述1.1 生產(chǎn)者功能描述在同一個(gè)進(jìn)程地址空間內(nèi)執(zhí)行的兩個(gè)線程。生產(chǎn)者線程生產(chǎn)物品,然后將物品放置在一個(gè)空緩沖區(qū)中供消費(fèi)者線程消費(fèi)。當(dāng)生產(chǎn)者線程生產(chǎn)物品時(shí),如果沒(méi)有空緩沖區(qū)可用, 那么生產(chǎn)者線程必須等待消費(fèi)者線程釋放出一個(gè)空緩沖區(qū)。71.2 消費(fèi)者功能描述消費(fèi)者線程從緩沖區(qū)中獲得物品,然后釋放緩沖區(qū)。 當(dāng)消費(fèi)者線程消費(fèi)物品時(shí),如果沒(méi)有滿的緩沖區(qū), 那么消費(fèi)者線程將被阻塞, 直到新的物品被生產(chǎn)出來(lái)。2數(shù)據(jù)結(jié)構(gòu)分析2.1 生產(chǎn)者與消費(fèi)者實(shí)現(xiàn):這其中主要

6、是通過(guò)多線程,來(lái)實(shí)現(xiàn)生產(chǎn)者和消費(fèi)者之間的協(xié)調(diào)問(wèn)題。2.2 生產(chǎn)者 (producer) 消費(fèi)者 (consumer) :通過(guò)一些記錄性變量,來(lái)記錄模擬實(shí)現(xiàn)生產(chǎn)者的行為,程序采用oo設(shè)計(jì)模式,緩存區(qū)采用隊(duì)列結(jié)構(gòu)存儲(chǔ)。3程序結(jié)構(gòu)圖3 詳細(xì)設(shè)計(jì)說(shuō)明1主函數(shù)模塊1.1 創(chuàng)建互斥信號(hào)量、 已占用的緩存區(qū)和未被占用的緩存區(qū)并進(jìn)行初始化。1.2 創(chuàng)建生產(chǎn)者線程和消費(fèi)者線程。81.3 當(dāng)輸入回車(chē)時(shí),結(jié)束程序。2程序流程圖2.1 生產(chǎn)者n y y n 開(kāi) 始生產(chǎn)產(chǎn)品p(empty)empty0 p (mutex) mutex=1 addtail() empty- v (mutex) v (occupy) 緩沖區(qū)

7、內(nèi)已滿, 已無(wú)可用緩沖區(qū)緩沖區(qū)正被其他進(jìn)程占用92.2 消費(fèi)者n y y n 開(kāi) 始p (full) 消費(fèi)請(qǐng)求full 0 wait (mutex) mutex=1 消 費(fèi)full - v(mutex) v (empty) 緩沖區(qū)內(nèi)產(chǎn)品已空,不能進(jìn)行消費(fèi)緩沖區(qū)正被其他進(jìn)程占用結(jié) 束103、程序主要代碼publicclassholdintegersynchronized privateint buffer; / 緩沖區(qū)privateint occupiedbuffercount = 0; privateint readposition = 0, writeposition = 0; / 下一個(gè)讀

8、到的位置和寫(xiě)到的位置public holdintegersynchronized(int capacity) buffer = new int capacity; publicint buffersize get return buffer.length; publicint buffer get int buffercopy; / 加鎖lock ( this ) while (occupiedbuffercount = 0) / 多個(gè)消費(fèi)者,所以此處改用whileconsole.writeline(thread.currentthread.name + tries to read. ); 1

9、1 displaystate(buffer empty. + thread.currentthread.name + waits.); monitor .wait( this ); / 為臨界區(qū)之外等待的生產(chǎn)者放行,讓他來(lái)生產(chǎn)/ 一直到生產(chǎn)者生產(chǎn)結(jié)束,調(diào)用了monitor.pauseall()/ 才能繼續(xù)執(zhí)行下去 , 此時(shí),消費(fèi)者自動(dòng)重新獲得this 的鎖 -occupiedbuffercount; buffercopy = bufferreadposition; readposition = (readposition + 1) % buffer.length; displaystate(t

10、hread.currentthread.name + reads + buffercopy); / 通知,讓等待的生產(chǎn)者線程進(jìn)入started 狀態(tài), 如果生產(chǎn)者處于臨界區(qū)之外,這句話執(zhí)行完后他仍然在臨界區(qū)之外monitor .pulseall(this ); / 釋放鎖 /lockreturn buffercopy; set / 加鎖lock ( this ) while (occupiedbuffercount = buffer.length) console.writeline(thread.currentthread.name + tries to write. ); displays

11、tate(buffer full. + thread.currentthread.name + waits.); monitor .wait( this ); 12/ 為臨界區(qū)之外等待消費(fèi)者放行,讓他來(lái)消費(fèi) / 一直到消費(fèi)者調(diào)用了monitor.pause()/ 才能繼續(xù)執(zhí)行下去,此時(shí),生產(chǎn)者自動(dòng)重新獲得this 的鎖 bufferwriteposition = value ; +occupiedbuffercount; writeposition = (writeposition + 1) % buffer.length; displaystate(thread.currentthread.

12、name + writes + value ); / 通知,讓 wait狀態(tài)的消費(fèi)者進(jìn)入 started 狀態(tài), 如果消費(fèi)者處于臨界區(qū)之外,這句話執(zhí)行完后他仍然在臨界區(qū)之外monitor .pulseall(this ); / 釋放鎖 4 調(diào)試分析遇到的問(wèn)題:一開(kāi)始對(duì)創(chuàng)建線程和創(chuàng)建信號(hào)量的函數(shù)不熟悉,無(wú)法著手寫(xiě)程序。通過(guò)上網(wǎng)查詢并翻閱了參考書(shū)之后才慢慢學(xué)會(huì)使用_beginthread()和createsemaphore() 函數(shù)。生產(chǎn)者與消費(fèi)者測(cè)試結(jié)果混亂經(jīng)過(guò)檢查,發(fā)現(xiàn)是沒(méi)有設(shè)置互斥信號(hào)量,加入了互斥信號(hào)量op_mutex后,保證了任一時(shí)刻只有一個(gè)進(jìn)程讀寫(xiě)緩存區(qū)和相關(guān)的變量,從而避免了混亂。在

13、程序顯示結(jié)果后無(wú)法控制結(jié)束加入了語(yǔ)句 while(getchar()=n) break;按下回車(chē)使程序結(jié)束。13測(cè)試結(jié)果145 用戶使用說(shuō)明程序設(shè)置了緩存區(qū)數(shù)量buf_size = 10,生產(chǎn)者數(shù)量 producers = 3 ,消費(fèi)者數(shù)量 consumers = 8 ,運(yùn)行之后無(wú)需輸入?yún)?shù),以下為運(yùn)行結(jié)果:1516題目二 內(nèi)存管理系統(tǒng)1 需求分析說(shuō)明內(nèi)存管理問(wèn)題的總體目標(biāo):在windows 的開(kāi)發(fā)環(huán)境下,利用所學(xué)c+語(yǔ)言和數(shù)據(jù)結(jié)構(gòu)的相關(guān)知識(shí),利用程序?qū)崿F(xiàn)內(nèi)存管理問(wèn)題的輸出,以幫助我們更好的理解和應(yīng)用進(jìn)程同步的原理。1設(shè)計(jì)目的本實(shí)驗(yàn)的目的是從不同側(cè)面了解 windows 2000xp 對(duì)用戶進(jìn)

14、程的虛擬內(nèi)存空間的管理、分配方法。同時(shí)需要了解跟蹤程序的編寫(xiě)方法( 與被跟蹤程序保持同步,使用 windows 提供的信號(hào)量 ) 。對(duì) windows分配虛擬內(nèi)存、改變內(nèi)存狀態(tài),以及對(duì)物理內(nèi)存(physical memory)和頁(yè)面文件 (pagefile)狀態(tài)查詢的 api 函數(shù)的功能、參數(shù)限制、使用規(guī)則要進(jìn)一步了解。默認(rèn)情況下, 32 位 windows 2000xp 上每個(gè)用戶進(jìn)程可以占有 2gb 的私有地址空間,操作系統(tǒng)占有剩下的 2gb。windows 2000xp 在 x86 體系結(jié)構(gòu)上利用二級(jí)頁(yè)表結(jié)構(gòu)來(lái)實(shí)現(xiàn)虛擬地址向物理地址的變換。一個(gè) 32 位虛擬地址被解釋為三個(gè)獨(dú)立的分量頁(yè)目

15、錄索引、頁(yè)表索引和字節(jié)索引它們用于找出描述頁(yè)面映射結(jié)構(gòu)的索引。頁(yè)面大小及頁(yè)表項(xiàng)的寬度決定了頁(yè)目錄和頁(yè)表索引的寬度。2問(wèn)題描述編寫(xiě)一個(gè)程序,包括兩個(gè)線程,一個(gè)線程用于模擬內(nèi)存分配活動(dòng),另一個(gè)用于跟蹤第一個(gè)線程的內(nèi)存行為,要求兩個(gè)線程之間通過(guò)信號(hào)量實(shí)現(xiàn)同步,模擬內(nèi)存活動(dòng)的線程可以從一個(gè)文件中讀出要進(jìn)行的內(nèi)存操作。每個(gè)內(nèi)存操作包含如下內(nèi)容:時(shí)間 :每個(gè)操作等待時(shí)間;塊數(shù) :分配內(nèi)存的粒度;操作 :包括保留一個(gè)區(qū)域、提交一個(gè)區(qū)域、釋放一個(gè)區(qū)域、回收一個(gè)區(qū)域、加鎖與解鎖一個(gè)區(qū)域。可將它們的編號(hào)放置于一個(gè)文件中。保留是指保留進(jìn)程的虛地址空間,而不分配物理地址空間;17提交是指在內(nèi)存中分配物理地址空間;回收

16、是指釋放物理地址空間,而保留進(jìn)程的虛地址空間;釋放是指將進(jìn)程的物理地址與虛擬地址空間全部釋放;大小 :塊的大?。辉L問(wèn)權(quán)限 :共五種page_readonly, page_readwriye, page_exexute, page_exexute _read, page_exexute _readwriye. 3原理分析windows 進(jìn)程的虛擬地址空間中也有三種狀態(tài)的頁(yè)面:空閑頁(yè)面、保留頁(yè)面和提交頁(yè)面??臻e(free) 頁(yè)面:空閑頁(yè)面是指那些可以保留或提交的可用頁(yè)面。保留 (reserved) 頁(yè)面:保留頁(yè)面是邏輯頁(yè)面已分配但沒(méi)有分配物理存儲(chǔ)的頁(yè)面。設(shè)置這種狀態(tài)的效果是可以保留一部分虛擬地址,

17、這樣,如果不預(yù)先釋放這些地址,就不能被其他應(yīng)用程序( 如 malloc ,localalloc 等)的操作所使用。 試圖讀或?qū)懣臻e頁(yè)面或保留頁(yè)面將導(dǎo)致頁(yè)面出錯(cuò)異常。保留頁(yè)面可被釋放或提交。提交(committed) 頁(yè)面:提交頁(yè)面是物理存儲(chǔ) ( 在內(nèi)存中或磁盤(pán)上 ) 已被分配的頁(yè)面。 可對(duì)它加以保護(hù), 不許訪問(wèn)或允許只讀訪問(wèn),或允許讀寫(xiě)訪問(wèn)。提交也可以被回收以釋放存儲(chǔ)空間,從而變成保留頁(yè)面。在本實(shí)驗(yàn)中,首先創(chuàng)建工程(in)生成隨機(jī)輸入文件,其中包含對(duì)內(nèi)存要求作的各種操作; 然后創(chuàng)建工程 memoryallocation ,實(shí)現(xiàn)輸入文件所要求的各項(xiàng)內(nèi)存管理操作。2 概要設(shè)計(jì)說(shuō)明2.1 函數(shù)定義說(shuō)

18、明(1)handle allo,trac;/ 信號(hào)量句柄(2)queue queuereserved; /記錄處于保留狀態(tài)區(qū)域的隊(duì)列(3)queue queuecommited; /記錄處于提交狀態(tài)區(qū)域的隊(duì)列(4)queue queuelocked; /記錄處于鎖定狀態(tài)區(qū)域的隊(duì)列(5) dword tracker(lpdword lpdwparm) /跟蹤 allocator 線程的內(nèi)存行為,并輸出必要信息(6)void allocator()/ 模擬內(nèi)存分配活動(dòng)的線程(7) waitforsingleobject(allo,infinite);/ 等待 tracker打印結(jié)束的信號(hào)量18(8

19、) switch(tection)/根據(jù)文件內(nèi)容確定權(quán)限(9) releasesemaphore(trac,1,null);/ 釋放信號(hào)量通知 tracker 可以打印信息(10)waitformultipleobjects(2,handle,true,infinite);/ 等待線程執(zhí)行的執(zhí)行結(jié)束后,再退出。3 詳細(xì)設(shè)計(jì)說(shuō)明程序代碼/* 內(nèi)存管理問(wèn)題該程序從文件 in 讀入每次的操作,完成操作后,由跟蹤進(jìn)程記錄結(jié)果,輸出到out.txt 文件中輸入每行為 4 個(gè)整數(shù)2 2 2 1 10000 第一個(gè)數(shù)為操作執(zhí)行所需的時(shí)間(毫秒)第二個(gè)數(shù)為操作的類(lèi)型第三個(gè)數(shù)代表操作的塊數(shù)第四個(gè)數(shù)代

20、表操作賦給盤(pán)塊的權(quán)限直到讀入執(zhí)行時(shí)間大于等于1000時(shí)代表程序輸入結(jié)束注意:其實(shí),只有保留操作時(shí)指定的區(qū)域大小才會(huì)起作用,每次提交的是保留隊(duì)列中的區(qū)域,每次加鎖的是提交隊(duì)列中的區(qū)域,每次解鎖的是加鎖隊(duì)列中的區(qū)域,每次回收的是提交隊(duì)列中的區(qū)域,每次釋放的是保留隊(duì)列中的區(qū)域,若隊(duì)列中無(wú)可操作區(qū)域,會(huì)顯示錯(cuò)誤信息19bool theend = false; /分配工作全部完成,結(jié)束標(biāo)志bool opersuccess = true; /標(biāo)識(shí)操作是否成功完成queue queuereserved; /記錄處于保留狀態(tài)區(qū)域的隊(duì)列queue queuecommited; /記錄處于提交狀態(tài)區(qū)域的隊(duì)列que

21、ue queuelocked; /記錄處于鎖定狀態(tài)區(qū)域的隊(duì)列struct operation /每個(gè)操作的詳細(xì)信息 int time; / 執(zhí)行所需的時(shí)間int block; /內(nèi)存塊數(shù)int oper; /操作類(lèi)型int protection; /權(quán)限; struct trace /跟蹤每一次分配活動(dòng)的數(shù)據(jù)結(jié)構(gòu) lpvoid start; /起始地址long size; /分配的大小; operation op; handle allo,trac;/ 信號(hào)量句柄dword tracker(lpdword lpdwparm) / 跟蹤 allocator 線程的內(nèi)存行為,并輸出必要信息 ofs

22、tream outfile; /輸出文件20outfile.open(out.txt); for(int i=0; i=10000; i+) /等待 allocator 一次操作結(jié)束waitforsingleobject(trac,infinite); if(theend = true) /檢測(cè)是否結(jié)束break; outfile 第i 個(gè)操作 t; /outfile 每個(gè)塊包含的字節(jié)數(shù) tinfo.dwpagesizeendl; switch(op.oper) case 0: outfile 保留一個(gè)區(qū)域endl; if(opersuccess =false) outfile 操作失敗,錯(cuò)誤

23、號(hào): getlasterror()endl; break; queuereserved.back(); outfile 首地址 :start tt大小:sizeendl 執(zhí)行時(shí)間 :op.timett 權(quán)限 :tection endl; break; 21 case 1:/ 提交一個(gè)區(qū)域 outfile 提交一個(gè)區(qū)域endl; if(opersuccess =false) outfile 操作失敗,錯(cuò)誤號(hào): getlasterror()endl; break; outfile 首地址 :start tt大小:sizeendl 執(zhí)行時(shí)間 :op.timett 權(quán)限 :te

24、ction endl; break; case 2:/ 鎖一個(gè)區(qū)域 outfile 加鎖一個(gè)區(qū)域endl; if(opersuccess =false) outfile 操作失敗,錯(cuò)誤號(hào): getlasterror()endl; break; outfile 首地址 :start tt大小:sizeendl 執(zhí)行時(shí)間 :op.timett 權(quán)限 :tection endl; 22break; case 3:/ 解鎖一個(gè)區(qū)域 outfile 解鎖一個(gè)區(qū)域endl; if(opersuccess =false) outfile 操作失敗,錯(cuò)誤號(hào): getlasterror()endl;

25、 break; outfile 首地址 :start tt大小:sizeendl 執(zhí)行時(shí)間 :op.timett 權(quán)限 :tection endl; queuelocked.pop(); break; case 4:/ 回收一個(gè)區(qū)域 outfile 回收一個(gè)區(qū)域endl; if(opersuccess =false) outfile 操作失敗,錯(cuò)誤號(hào): getlasterror()endl; break; outfile 首地址 :start tt大小:sizeendl 23執(zhí)行時(shí)間 :op.timett 權(quán)限 :tection endl; queuecommited.

26、pop(); break; case 5:/ 釋放一個(gè)區(qū)域 outfile 釋放一個(gè)區(qū)域endl; if(opersuccess =false) outfile 操作失敗,錯(cuò)誤號(hào): getlasterror()endl; break; outfile 首地址 :start tt大小:sizeendl 執(zhí)行時(shí)間 :op.timett 權(quán)限 :tection endl; queuereserved.pop(); break; default: break; 24 4 調(diào)試分析1. 運(yùn)行結(jié)果in.txt 100 0 4 1 100 0 2 3 200 0 3 4 100 1 5 1 10

27、0 1 2 1 100 2 4 1 100 3 4 1 100 4 4 1 100 5 2 1 100 5 3 1 100 0 4 2 100 5 5 1 200 0 3 0 100 1 5 1 100 1 2 2 100 2 4 1 100 5 5 2 10000 out.txt 第 0 個(gè)操作 保留一個(gè)區(qū)域首地址 :0 x20000 大小:16384 執(zhí)行時(shí)間 :100 權(quán)限:1 每個(gè)塊包含的字節(jié)數(shù) : 4096 可用物理內(nèi)存字節(jié)數(shù) : 1962770432 可用虛擬內(nèi)存字節(jié)數(shù) : 2129485824 * 第 1 個(gè)操作 保留一個(gè)區(qū)域首地址 :0 x30000 大小:8192 執(zhí)行時(shí)間

28、:100 權(quán)限:3 25每個(gè)塊包含的字節(jié)數(shù) : 4096 可用物理內(nèi)存字節(jié)數(shù) : 1951789056 可用虛擬內(nèi)存字節(jié)數(shù) : 2129477632 * 第 2 個(gè)操作 保留一個(gè)區(qū)域首地址 :0 x3b0000 大小:12288 執(zhí)行時(shí)間 :200 權(quán)限:4 每個(gè)塊包含的字節(jié)數(shù) : 4096 可用物理內(nèi)存字節(jié)數(shù) : 1954570240 可用虛擬內(nèi)存字節(jié)數(shù) : 2129465344 * 第 3 個(gè)操作 提交一個(gè)區(qū)域首地址 :0 x20000 大小:16384 執(zhí)行時(shí)間 :100 權(quán)限:1 每個(gè)塊包含的字節(jié)數(shù) : 4096 可用物理內(nèi)存字節(jié)數(shù) : 1954562048 可用虛擬內(nèi)存字節(jié)數(shù) : 2

29、129465344 * 第 4 個(gè)操作 提交一個(gè)區(qū)域首地址 :0 x30000 大小:8192 執(zhí)行時(shí)間 :100 權(quán)限:1 每個(gè)塊包含的字節(jié)數(shù) : 4096 可用物理內(nèi)存字節(jié)數(shù) : 1954562048 可用虛擬內(nèi)存字節(jié)數(shù) : 2129465344 * 第 5 個(gè)操作 加鎖一個(gè)區(qū)域首地址 :0 x20000 大小:16384 執(zhí)行時(shí)間 :100 權(quán)限:1 每個(gè)塊包含的字節(jié)數(shù) : 4096 可用物理內(nèi)存字節(jié)數(shù) : 1954549760 可用虛擬內(nèi)存字節(jié)數(shù) : 2129465344 * 第 6 個(gè)操作 解鎖一個(gè)區(qū)域首地址 :0 x20000 大小:16384 執(zhí)行時(shí)間 :100 權(quán)限:1 每個(gè)塊

30、包含的字節(jié)數(shù) : 4096 可用物理內(nèi)存字節(jié)數(shù) : 1954557952 26可用虛擬內(nèi)存字節(jié)數(shù) : 2129465344 * 第 7 個(gè)操作 回收一個(gè)區(qū)域首地址 :0 x30000 大小:8192 執(zhí)行時(shí)間 :100 權(quán)限:1 每個(gè)塊包含的字節(jié)數(shù) : 4096 可用物理內(nèi)存字節(jié)數(shù) : 1954557952 可用虛擬內(nèi)存字節(jié)數(shù) : 2129465344 * 第 8 個(gè)操作 釋放一個(gè)區(qū)域首地址 :0 x3b0000 大小:12288 執(zhí)行時(shí)間 :100 權(quán)限:1 每個(gè)塊包含的字節(jié)數(shù) : 4096 可用物理內(nèi)存字節(jié)數(shù) : 1954603008 可用虛擬內(nèi)存字節(jié)數(shù) : 2129477632 * 第

31、9 個(gè)操作 釋放一個(gè)區(qū)域首地址 :0 x30000 大小:8192 執(zhí)行時(shí)間 :100 權(quán)限:1 每個(gè)塊包含的字節(jié)數(shù) : 4096 可用物理內(nèi)存字節(jié)數(shù) : 1955135488 可用虛擬內(nèi)存字節(jié)數(shù) : 2129485824 * 第 10 個(gè)操作保留一個(gè)區(qū)域首地址 :0 x30000 大小:16384 執(zhí)行時(shí)間 :100 權(quán)限:2 每個(gè)塊包含的字節(jié)數(shù) : 4096 可用物理內(nèi)存字節(jié)數(shù) : 1955135488 可用虛擬內(nèi)存字節(jié)數(shù) : 2129469440 * 第 11個(gè)操作釋放一個(gè)區(qū)域首地址 :0 x30000 大小:16384 執(zhí)行時(shí)間 :100 權(quán)限:1 每個(gè)塊包含的字節(jié)數(shù) : 4096 可

32、用物理內(nèi)存字節(jié)數(shù) : 1955131392 可用虛擬內(nèi)存字節(jié)數(shù) : 2129485824 * 27第 12 個(gè)操作保留一個(gè)區(qū)域首地址 :0 x30000 大小:12288 執(zhí)行時(shí)間 :200 權(quán)限:0 每個(gè)塊包含的字節(jié)數(shù) : 4096 可用物理內(nèi)存字節(jié)數(shù) : 1955557376 可用虛擬內(nèi)存字節(jié)數(shù) : 2129473536 * 第 13 個(gè)操作提交一個(gè)區(qū)域首地址 :0 x30000 大小:12288 執(zhí)行時(shí)間 :100 權(quán)限:1 每個(gè)塊包含的字節(jié)數(shù) : 4096 可用物理內(nèi)存字節(jié)數(shù) : 1955532800 可用虛擬內(nèi)存字節(jié)數(shù) : 2129473536 * 第 14 個(gè)操作提交一個(gè)區(qū)域操作失

33、敗,錯(cuò)誤號(hào): 183 每個(gè)塊包含的字節(jié)數(shù) : 4096 可用物理內(nèi)存字節(jié)數(shù) : 1955557376 可用虛擬內(nèi)存字節(jié)數(shù) : 2129473536 * 第 15 個(gè)操作加鎖一個(gè)區(qū)域首地址 :0 x20000 大小:16384 執(zhí)行時(shí)間 :100 權(quán)限:1 每個(gè)塊包含的字節(jié)數(shù) : 4096 可用物理內(nèi)存字節(jié)數(shù) : 1955532800 可用虛擬內(nèi)存字節(jié)數(shù) : 2129473536 * 第 16 個(gè)操作釋放一個(gè)區(qū)域操作失敗,錯(cuò)誤號(hào): 183 每個(gè)塊包含的字節(jié)數(shù) : 4096 可用物理內(nèi)存字節(jié)數(shù) : 1955540992 可用虛擬內(nèi)存字節(jié)數(shù) : 2129473536 * 282. 運(yùn)行結(jié)果分析(1)

34、 采用不同的方式對(duì)文件進(jìn)行操作所需要花費(fèi)的時(shí)間也不同。(2) 各種對(duì)文件操作的方式各有各的優(yōu)點(diǎn)和不足,使用時(shí)應(yīng)根據(jù)具體的情景做最好的選擇。(3) 通過(guò)對(duì)兩個(gè)線程的操作,并用一個(gè)線程對(duì)另一個(gè)線程進(jìn)行跟蹤,進(jìn)行保留,提交、鎖定、釋放。而且當(dāng)超出一定范圍后就讓其輸出操作錯(cuò)誤,提示:操作失敗,沒(méi)有保留區(qū)域可供釋放。5 用戶使用說(shuō)明1. 用戶操作指南(1) 將內(nèi)存管理 .exe在 code: :blocks 10.05下打開(kāi),如下:29(2) 單擊編譯運(yùn)行按鈕,該exe程序即可運(yùn)行,如下:題目三 快速文件系統(tǒng)1 需求分析說(shuō)明2設(shè)計(jì)目的眾所周知,cpu 是整個(gè)計(jì)算機(jī)系統(tǒng)中運(yùn)算速度最快的部分,而外部設(shè)備是最

35、慢的部分,它們之間存在著很大的差別。然而,cpu 卻時(shí)時(shí)刻刻可能要求訪問(wèn)外部設(shè)備。 如果 cpu 的每次操作都必須等待外部設(shè)備完成,那么 cpu 寶貴的運(yùn)行時(shí)間就會(huì)大大浪費(fèi), 如何減小 cpu 對(duì)外部設(shè)備操作的干預(yù),能夠提高cpu 的運(yùn)行效率。隨著現(xiàn)代計(jì)算機(jī)技術(shù)的發(fā)展,大多30數(shù)現(xiàn)代操作系統(tǒng)都對(duì)這個(gè)問(wèn)題進(jìn)行了處理。2問(wèn)題描述設(shè)計(jì)一個(gè)函數(shù) int filter (char source ,char* sink,int f)其中source :源文件,即從哪個(gè)文件中讀取數(shù)據(jù);sink:目標(biāo)文件,即將數(shù)據(jù)寫(xiě)入哪個(gè)文件;f:一個(gè)對(duì)文件的操作(可以任意定義) 。分別用三種方式實(shí)現(xiàn)對(duì)一個(gè)文件的操作:(1)

36、 無(wú)緩沖區(qū)方式:表示使用的標(biāo)志位是file_flag_no_buffering ;(2) 緩沖方式:表示使用的標(biāo)志位是file_flag_sequential_scan ;(3)異步方式:表示使用的標(biāo)志位是file_flag_overlapped 。具體說(shuō)明:filter 函數(shù)的作用是從 source文件中讀取數(shù)據(jù),經(jīng)過(guò)操作f 后,寫(xiě)入文件sink 中。整個(gè)過(guò)程需要三個(gè)部分完成:(1)建立三個(gè) filter 文件(功能不同),并自己生成一個(gè)源文件(大小不小于 512kb) ,作為 file1,經(jīng)過(guò) 10 步,寫(xiě)入 sink, 記錄總體時(shí)間。 即從 file1寫(xiě)入 file2,從 file2 寫(xiě)

37、入 file3,從 file9 寫(xiě)入 file10,從 file10 寫(xiě)入 sink文件。(2)用 createfile 建立文件時(shí)使用 file_flag_sequential_scan標(biāo)志,系統(tǒng)將給文件加上緩沖區(qū),與(1)類(lèi)似,做 10次讀寫(xiě)。注意緩沖區(qū)大小必須小于文件大小。(3)用 createfile 建立文件時(shí)使用file_flag_overlapp標(biāo)志,將使用異步傳輸。同( 1) (2)一樣做 10 次讀寫(xiě)。3原理說(shuō)明3.1.文件高速緩存文件高速緩存是cpu 訪問(wèn)外設(shè)的一個(gè) “ 中間設(shè)備 ” 。說(shuō)是設(shè)備,其實(shí)它不是真正的物理設(shè)備, 而是一種核心級(jí)內(nèi)存映像機(jī)制。 由于它被設(shè)置在內(nèi)存中

38、,因此速度非???,可以部分解決cpu 與硬盤(pán)速度差異的問(wèn)題。文件系統(tǒng)的驅(qū)動(dòng)程序通過(guò)調(diào)用“ 高速緩存管理程序 ” 來(lái)使用文件高速緩存,然后高速緩存管理程序執(zhí)行高速緩存的處理工作。31文件高速緩存的原理是: 假設(shè)一個(gè)進(jìn)程讀了文件的第一個(gè)字節(jié),它常常會(huì)按照順序讀第二個(gè)第三個(gè)字節(jié),一直到讀出所有的字節(jié)。 利用這個(gè)原理可以進(jìn)行 “ 預(yù)取” ,也就是說(shuō),在進(jìn)程沒(méi)請(qǐng)求讀磁盤(pán)之前就先把文件讀出來(lái)并放到高速緩存中。 這樣,當(dāng)進(jìn)程請(qǐng)求訪問(wèn)磁盤(pán)時(shí), 高速緩存可以快速地把已經(jīng)取到內(nèi)存中的文件內(nèi)容直接送給進(jìn)程使用,從而大大加速了訪問(wèn)磁盤(pán)的速度。 另外,由于一個(gè)文件可能會(huì)被多次讀入,因此可以在第一次讀入后,將文件數(shù)據(jù)保存

39、在高速緩存中。這樣,下次再讀時(shí),就不必從硬盤(pán)而可以從緩存中讀取。利用lru(least recently used)的原則,可以將不常使用的文件從緩存中刪除以節(jié)省高速緩存空間。3.2.異步傳輸與文件高速緩存不同, 文件的異步傳輸是一種改變指令執(zhí)行順序的機(jī)制。在以往的操作系統(tǒng)中, 指令都是順序執(zhí)行的, 下一條指令必須在上一條指令執(zhí)行完畢后才能執(zhí)行。因此,如果cpu 遇到一條放盤(pán)指令,那么它就必須等待緩慢的磁盤(pán)訪問(wèn)結(jié)束以后才能進(jìn)行后續(xù)工作。如果它后面遇到的指令并不依賴于訪盤(pán)操作時(shí), 這個(gè)等待就很沒(méi)有必要。 windows2000中使用了一種異步文件傳輸機(jī)制來(lái)解決這個(gè)問(wèn)題。它通過(guò)設(shè)置打開(kāi)文件時(shí)的一個(gè)

40、標(biāo)志位來(lái)使進(jìn)程不等待讀些文件操作而繼續(xù)執(zhí)行。當(dāng)后續(xù)指令必須用到磁盤(pán)訪問(wèn)的結(jié)果數(shù)據(jù)時(shí),它在通過(guò)一條wait 指令進(jìn)行等待。這樣,在訪盤(pán)指令和等待指令之間的指令就可以與磁盤(pán)訪問(wèn)同時(shí)進(jìn)行了,從而大大加快了系統(tǒng)的整體速度。2 概要設(shè)計(jì)說(shuō)明2.1 函數(shù)定義說(shuō)明(1)handle_src = createfile(source, generic_read, null, null, open_existing, file_flag_no_buffering , null); /讀取 read文件對(duì)象的句柄(2) handle_dst = createfile(sink, generic_write, nul

41、l, null, create_always, null, null); /讀取 write 文件對(duì)象的句柄(3)readfile(handle_src, buffer, buffer_size, &numberofbytesread, null); /讀取文件32(4)writefile(handle_dst, buffer, numberofbytesread, &numberofbyteswrite, null) ;/把緩沖的信息寫(xiě)入到文件中(5)closehandle(handle_src); closehandle(handle_dst);/ 關(guān)閉句柄(6)void

42、filter_nobuffer(char *source, char *sink, void (*func) (char *addr)/ 沒(méi)有文件高速緩存的filter 函數(shù)(7)void filter_sequen(char *source, char *sink, void (*func) (char *addr) / /有文件高速緩存的filter 函數(shù)(8)void filter_overlp(char *source, char *sink, void (*func) (char *addr) / /有異步傳輸?shù)?filter 函數(shù)333 詳細(xì)設(shè)計(jì)說(shuō)明3主要程序代碼/ 沒(méi)有文件高速緩

43、存的filter 函數(shù)void filter_nobuffer(char *source, char *sink, void (*func) (char *addr) handle handle_src, handle_dst; / handles of source file and destination file bool cycle; dword numberofbytesread, numberofbyteswrite, index; / open the source file handle_src = createfile(source, generic_read, null,

44、null, open_existing, file_flag_no_buffering , null); handle_dst = createfile(sink, generic_write, null, null, create_always, null, null); if(handle_src = invalid_handle_v alue | handle_dst = invalid_handle_v alue) coutcreatefile invocation error!endl; exit(1); cycle = true; while(cycle) / read data

45、and send them into buffer from the source file if(readfile(handle_src, buffer, buffer_size, &numberofbytesread, null) = false) coutreadfile error!endl; exit(1); 34if(numberofbytesread buffer_size) cycle = false; for(index = 0; index numberofbytesread; index +) func(&bufferindex); if(writefil

46、e(handle_dst, buffer, numberofbytesread, &numberofbyteswrite, null) = false) coutwritefile error!endl; exit(1); closehandle(handle_src); closehandle(handle_dst); void filter_sequen(char *source, char *sink, void (*func) (char *addr) handle handle_src, handle_dst; bool cycle; dword numberofbytesr

47、ead, numberofbyteswrite, index; handle_src = createfile(source, generic_read, null, null, open_existing, file_flag_sequential_scan, null); handle_dst = createfile(sink, generic_write, null, null, create_always, file_flag_sequential_scan, null); if(handle_src = invalid_handle_v alue | handle_dst = in

48、valid_handle_v alue) coutcreatefile invocation error!endl; exit(1); cycle = true; while(cycle) / read data and send them into buffer from the source file if(readfile(handle_src, buffer, buffer_size, 35&numberofbytesread, null) = false) coutreadfile error!endl; exit(1); if(numberofbytesread buffe

49、r_size) cycle = false; for(index = 0; index numberofbytesread; index +) func(&bufferindex); / write the content of the buffer to the destination file if(writefile(handle_dst, buffer, numberofbytesread, &numberofbyteswrite, null) = false) coutwritefile error!endl; exit(1); closehandle(handle_

50、src); closehandle(handle_dst); void filter_overlp(char *source, char *sink, void (*func) (char *addr) handle handle_src, handle_dst; bool cycle; dword numberofbytesread, numberofbyteswrite, index, dwerror; overlapped overlapped; handle_src = createfile(source, generic_read, null, null, open_existing

51、, file_flag_no_buffering | file_flag_overlapped, null); handle_dst = createfile(sink, generic_write, null, null, create_always, null, null); if(handle_src = invalid_handle_v alue | handle_dst = invalid_handle_v alue) coutcreatefile invocation error!endl; 36exit(1); overlapped.hevent = null; overlapped.offset = -buffer_size; overlapped.offsethigh = 0; cycle = true; while(cycle) overlapped.offset = overlapped.offset + buffer_size; if(readfile(handle_sr

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論