Nachos文件系統(tǒng)實(shí)習(xí)報(bào)告_第1頁(yè)
Nachos文件系統(tǒng)實(shí)習(xí)報(bào)告_第2頁(yè)
Nachos文件系統(tǒng)實(shí)習(xí)報(bào)告_第3頁(yè)
Nachos文件系統(tǒng)實(shí)習(xí)報(bào)告_第4頁(yè)
Nachos文件系統(tǒng)實(shí)習(xí)報(bào)告_第5頁(yè)
已閱讀5頁(yè),還剩33頁(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)介

文獻(xiàn)系統(tǒng)實(shí)習(xí)匯報(bào)善良的大姐姐.5.3

目錄一:總體概述 3二:任務(wù)完畢狀況 3任務(wù)完畢列表(Y/N) 3詳細(xì)Exercise的完畢狀況 3三:碰到的困難以及處理措施 30內(nèi)容四:收獲及感想 31內(nèi)容五:對(duì)課程的意見(jiàn)和提議 31內(nèi)容六:參照文獻(xiàn) 31一:總體概述 Nachos系統(tǒng)模擬了一種簡(jiǎn)樸的文獻(xiàn)系統(tǒng),其中包括磁盤,文獻(xiàn)目錄,空閑磁盤快分派表等,用于維護(hù)文獻(xiàn)的邏輯構(gòu)造與物理位置之間的映射關(guān)系。尚有對(duì)文獻(xiàn)的基本操作函數(shù)和數(shù)據(jù)構(gòu)造,如創(chuàng)立、刪除、讀取、寫入等。本實(shí)習(xí)但愿通過(guò)修改Nachos系統(tǒng)的底層源代碼,到達(dá)“完善文獻(xiàn)系統(tǒng)”的目的。二:任務(wù)完畢狀況任務(wù)完畢列表(Y/N)Exercise1Exercise2Exercise3Exercise4Exercise5Exercise6Exercise7ChallengeYesYesYesYesYesYesYesYes詳細(xì)Exercise的完畢狀況Exercise1:源代碼閱讀 任務(wù):閱讀Nachos源代碼中與文獻(xiàn)系統(tǒng)有關(guān)的代碼,理解Nachos文獻(xiàn)系統(tǒng)的工作原理。 完畢狀況:Filesys.h(cc)概述:定義了一種filesystem類,包括了對(duì)文獻(xiàn)系統(tǒng)的初始化函數(shù),以及若干個(gè)對(duì)文獻(xiàn)系統(tǒng)中某個(gè)文獻(xiàn)的操作的函數(shù)。在簡(jiǎn)介函數(shù)之前,先簡(jiǎn)介兩個(gè)以文獻(xiàn)形式存在的重要內(nèi)容:1)空閑磁盤塊分派表:以文獻(xiàn)的形式存儲(chǔ),頭文獻(xiàn)位于文獻(xiàn)目錄的第0項(xiàng)。是由bitmap類生成的。每一種bit對(duì)應(yīng)于磁盤中的一種塊的使用狀況,0表達(dá)空閑,1表達(dá)已使用。2)文獻(xiàn)目錄:以文獻(xiàn)的形式存儲(chǔ),頭文獻(xiàn)位于文獻(xiàn)目錄的第1項(xiàng)。是由directory類(之后會(huì)簡(jiǎn)介)生成的。directory的項(xiàng)是<name,sector>的對(duì)子,用于文獻(xiàn)名->磁盤塊的索引。找到的是文獻(xiàn)頭部所在磁盤塊。接下來(lái)簡(jiǎn)介函數(shù):函數(shù)名稱重要功能filesystem構(gòu)造函數(shù)創(chuàng)立或者載入一種文獻(xiàn)系統(tǒng)解釋:傳入一種bool型參數(shù)format,當(dāng)format為true時(shí)會(huì)初始化filesystem(相稱于格式化了文獻(xiàn)系統(tǒng)),使用新的空閑磁盤塊分派表以及新的文獻(xiàn)目錄。否則僅僅載入本來(lái)存在的空閑磁盤塊分派表以及文獻(xiàn)目錄。filesystemcreate函數(shù)在文獻(xiàn)系統(tǒng)中創(chuàng)立文獻(xiàn)解釋:參數(shù)為文獻(xiàn)名和初始長(zhǎng)度。1)從磁盤載入空閑磁盤塊分派表文獻(xiàn)和文獻(xiàn)目錄文獻(xiàn)(通過(guò)bitmap和directory的fetchfrom(sector)實(shí)現(xiàn))2)為新文獻(xiàn)創(chuàng)立文獻(xiàn)頭部(filehdr):找到一種空閑磁盤塊(通過(guò)bitmap的find函數(shù)實(shí)現(xiàn),返回空閑磁盤塊的sector號(hào));將頭文獻(xiàn)信息寫入目錄文獻(xiàn)(通過(guò)directory的add(name,sector)函數(shù)實(shí)現(xiàn));3)將文獻(xiàn)塊的信息寫入文獻(xiàn)頭部:文獻(xiàn)被切提成若干個(gè)文獻(xiàn)塊,并在文獻(xiàn)頭部記錄每個(gè)文獻(xiàn)塊位于磁盤的哪個(gè)sector(通過(guò)filehdr的allocate(bitmap,initialSize)實(shí)現(xiàn))4)將更新了的空閑磁盤塊分派表文獻(xiàn)和文獻(xiàn)目錄文獻(xiàn)寫回磁盤(通過(guò)bitmap和directory的writeback(sector)實(shí)現(xiàn))filesystemopen函數(shù)在文獻(xiàn)系統(tǒng)中打開(kāi)文獻(xiàn)解釋:參數(shù)為文獻(xiàn)名。1)從磁盤載入文獻(xiàn)目錄文獻(xiàn)2)在文獻(xiàn)目錄中,通過(guò)文獻(xiàn)名,查找文獻(xiàn)頭部對(duì)應(yīng)的磁盤號(hào)(通過(guò)directory的find(name)實(shí)現(xiàn))3)假如存在,打開(kāi)文獻(xiàn)頭部,并返回一種openfile類的指針(通過(guò)new一種openfile類實(shí)現(xiàn))filesystemremove函數(shù)在文獻(xiàn)系統(tǒng)中移除文獻(xiàn)解釋:參數(shù)為文獻(xiàn)名。1)從磁盤載入空閑磁盤塊分派表文獻(xiàn)和文獻(xiàn)目錄文獻(xiàn)2)將文獻(xiàn)塊從磁盤中移除(通過(guò)filehdr的deallocate(bitmap)函數(shù)實(shí)現(xiàn))3)將文獻(xiàn)頭部從磁盤中移除(通過(guò)bitmap的clear(頭部sector)實(shí)現(xiàn))4)將文獻(xiàn)從文獻(xiàn)目錄中移除(即清除<文獻(xiàn)名,文獻(xiàn)頭部sector>的對(duì)子)(通過(guò)directory的remove(name)函數(shù)實(shí)現(xiàn))5)將更新了的空閑磁盤塊分派表文獻(xiàn)和文獻(xiàn)目錄文獻(xiàn)寫回磁盤filesystemlist,print函數(shù)打印文獻(xiàn)系統(tǒng)信息解釋:打印文獻(xiàn)系統(tǒng)的有關(guān)信息,包括磁盤塊分派狀況,文獻(xiàn)目錄狀況,以及存在的文獻(xiàn)的詳細(xì)狀況等。詳細(xì)細(xì)節(jié)略。Filehdr.h(cc)概述:定義了一種fileheader類,模擬文獻(xiàn)頭部。私有變量包括文獻(xiàn)長(zhǎng)度,文獻(xiàn)占用的磁盤塊個(gè)數(shù),<文獻(xiàn)塊,磁盤塊>對(duì)應(yīng)關(guān)系數(shù)組。以及對(duì)文獻(xiàn)塊的分派,回收等函數(shù)。由于目前只支持定長(zhǎng)文獻(xiàn),因此文獻(xiàn)的信息在初始化的時(shí)候就確定了,文獻(xiàn)頭的信息在文獻(xiàn)使用過(guò)程中不會(huì)發(fā)生變化,類似于只讀。 函數(shù)簡(jiǎn)介:函數(shù)名稱重要功能filehdrallocate函數(shù)為文獻(xiàn)塊分派磁盤塊解釋:參數(shù)為空閑磁盤塊分派表指針,和文獻(xiàn)長(zhǎng)度。1)更新私有變量:文獻(xiàn)長(zhǎng)度和文獻(xiàn)占用的磁盤塊個(gè)數(shù)(通過(guò)文獻(xiàn)長(zhǎng)度/一種磁盤塊大小)實(shí)現(xiàn)2)為文獻(xiàn)塊分派對(duì)應(yīng)的磁盤塊。(通過(guò)bitmap的find函數(shù)實(shí)現(xiàn))——注意:此時(shí)磁盤塊僅僅是分派了,不過(guò)并沒(méi)將文獻(xiàn)寫入。filehdrdeallocate函數(shù)將分派的磁盤塊回收解釋:參數(shù)為空閑磁盤塊分派表指針1)for循環(huán),將<文獻(xiàn)塊,磁盤塊>對(duì)應(yīng)關(guān)系數(shù)組中,每個(gè)文獻(xiàn)塊對(duì)應(yīng)的磁盤塊的占用標(biāo)識(shí)清除(通過(guò)bitmap的clear函數(shù)實(shí)現(xiàn))filehdrfetchfrom函數(shù)從磁盤中載入一種文獻(xiàn)頭部解釋:參數(shù)為要載入的磁盤塊的sector號(hào)調(diào)用synchdick的readsector函數(shù),將sector對(duì)應(yīng)的磁盤塊內(nèi)容讀入,覆蓋自己(類似于構(gòu)造函數(shù))filehdrwriteback函數(shù)將目前文獻(xiàn)頭部寫回磁盤解釋:和fetchfrom執(zhí)行相反操作。filehdrbytetosector函數(shù)讀入文獻(xiàn)中偏移為offset的位置的磁盤塊解釋:參數(shù)為偏移量1)計(jì)算出偏移量對(duì)應(yīng)的文獻(xiàn)塊2)通過(guò)私有變量數(shù)組,找到文獻(xiàn)塊對(duì)應(yīng)的磁盤塊3)返回磁盤塊的磁盤號(hào)filehdrfilelength函數(shù)——返回文獻(xiàn)大小fielderprint函數(shù)打印文獻(xiàn)頭部信息Directory.h(cc)概述:定義了兩個(gè)類,一種是directoryentry類,一種是directory類。directoryentry類是做<文獻(xiàn)名,磁盤號(hào)>,以及一種標(biāo)識(shí)位,標(biāo)志目前entry與否被使用了(注意!這里與filehdr里的<文獻(xiàn)塊,磁盤塊>數(shù)組不一樣,filehdr里是某個(gè)文獻(xiàn)所有內(nèi)容所映射的磁盤塊,directoryentry中時(shí)某個(gè)文獻(xiàn)的文獻(xiàn)頭部映射的磁盤塊)。directory類模擬文獻(xiàn)目錄。私有變量包括entry數(shù)量和一種directoryentry的entry數(shù)組。目前只實(shí)現(xiàn)了一級(jí)目錄索引,最多只支持10個(gè)文獻(xiàn)頭部的寄存。函數(shù)簡(jiǎn)介:函數(shù)名稱重要功能directory構(gòu)造函數(shù)初始化私有變量(在概述中簡(jiǎn)介了)解釋:初始化entry數(shù)組,以及將數(shù)組中的每個(gè)entry的標(biāo)識(shí)位設(shè)為false(未使用)directoryfetchfrom函數(shù)從文獻(xiàn)目錄文獻(xiàn)中載入directory解釋:參數(shù)為openfile。調(diào)用openfile的readat函數(shù),將文獻(xiàn)目錄文獻(xiàn)的內(nèi)容覆蓋自己(類似于構(gòu)造函數(shù))directorywriteback函數(shù)將目前文獻(xiàn)目錄寫回目錄文獻(xiàn)解釋:參數(shù)為openfile。調(diào)用openfile的writeat函數(shù),將目前directory寫回目錄文獻(xiàn)directoryfindindex+find函數(shù)在entry數(shù)組中查找名字對(duì)應(yīng)的文獻(xiàn)頭部磁盤塊解釋:參數(shù)為文獻(xiàn)名for循環(huán)比對(duì)。并返回磁盤塊的磁盤號(hào)。找不到返回-1directoryadd函數(shù)將一種<文獻(xiàn)名,文獻(xiàn)頭部磁盤塊的磁盤號(hào)>的條目加入entry數(shù)組中解釋:參數(shù)為文獻(xiàn)名,文獻(xiàn)頭部磁盤塊的磁盤號(hào)。注意修改entry的標(biāo)識(shí)位。directoryremove函數(shù)和add執(zhí)行相反功能。directorylist,print函數(shù)打印directory的信息Openfile.h(cc)概述:定義了一種Openfile類,用于對(duì)文獻(xiàn)執(zhí)行基本操作:讀和寫。私有變量為文獻(xiàn)頭部的指針,以及目前文獻(xiàn)的光標(biāo)位置。函數(shù)簡(jiǎn)介:函數(shù)名稱重要功能Openfile構(gòu)造函數(shù)初始化私有變量解釋:參數(shù)為文獻(xiàn)頭部的磁盤塊號(hào)文獻(xiàn)頭部的指針通過(guò)filehdr->fetchfrom(sector)函數(shù)載入磁盤內(nèi)容;設(shè)置初始光標(biāo)位置為0Openfileseek函數(shù)將目前光標(biāo)位置設(shè)置為傳入的參數(shù)Openfileread函數(shù)讀入若干個(gè)字節(jié)到一種數(shù)組里解釋:參數(shù)為返回的內(nèi)容數(shù)組,和需讀入的字節(jié)數(shù)。調(diào)用readAt(buffer,字節(jié)數(shù),目前光標(biāo)位置)讀入若干字節(jié)到buffer當(dāng)中;更新光標(biāo)位置;返回內(nèi)容數(shù)組Openfilewrite函數(shù)寫入若干字節(jié)到磁盤中解釋:參數(shù)為需寫入的內(nèi)容數(shù)組,和寫入的字節(jié)數(shù)環(huán)節(jié)同read函數(shù),只是將readAt變成了writeAt.OpenfilereadAt函數(shù)從目前光標(biāo)位置讀入若干字節(jié)到一種數(shù)組當(dāng)中解釋:參數(shù)為返回?cái)?shù)組,字節(jié)數(shù)以及目前光標(biāo)位置。獲取文獻(xiàn)長(zhǎng)度(通過(guò)filehdr->filelength函數(shù)實(shí)現(xiàn))確定目前光標(biāo)位置所在的文獻(xiàn)塊(通過(guò)“光標(biāo)位置/一種sector的大小”向上取整實(shí)現(xiàn))確定需讀入的最終一種字節(jié)所在的文獻(xiàn)塊(通過(guò)“光標(biāo)位置+讀入字節(jié)/一種sector的大小”向上取整實(shí)現(xiàn))計(jì)算一共需要訪問(wèn)的磁盤快個(gè)數(shù)(通過(guò)2)3)步做差實(shí)現(xiàn))將文獻(xiàn)塊對(duì)應(yīng)的磁盤塊內(nèi)容讀入數(shù)組當(dāng)中(通過(guò)私有變量文獻(xiàn)頭部的bytetosector函數(shù),得到文獻(xiàn)塊-磁盤快的映射)將真正需要的字節(jié)從數(shù)組當(dāng)中取出(由于實(shí)際上所需要的字節(jié)不一定位于塊的頭,也許要從某個(gè)中間位置截?cái)啵﹫D解釋:OpenfilewriteAt函數(shù)從目前光標(biāo)位置開(kāi)始寫入若干字節(jié)解釋:操作環(huán)節(jié)基本同上。Openfilelength函數(shù)獲取文獻(xiàn)長(zhǎng)度解釋:通過(guò)私有變量文獻(xiàn)頭部的filelength函數(shù)獲得。Bitmap.h(cc)概述:在上個(gè)lab的試驗(yàn)匯報(bào)中已經(jīng)簡(jiǎn)介過(guò)了。在這次lab中,bitmap作為空閑磁盤塊分派表,以文獻(xiàn)的形式寄存。每一種bit標(biāo)志了磁盤中某個(gè)塊目前的狀況。此外,還可以使用bitmap的函數(shù),到達(dá)模擬對(duì)磁盤的管理功能。如變化某個(gè)bit為0或者1,或是尋找為0的bit(即空閑的磁盤快)等。Exercise2:擴(kuò)展文獻(xiàn)屬性 任務(wù):增長(zhǎng)文獻(xiàn)描述信息,如“類型”、“創(chuàng)立時(shí)間”、“上次訪問(wèn)時(shí)間”、“上次修改時(shí)間”、“途徑”等等。嘗試突破文獻(xiàn)名長(zhǎng)度的限制。 完畢狀況: 考慮:對(duì)于文獻(xiàn)描述信息,可以在fileheader中加入,也可以在directory中加入。但考慮到假如都在fileheader中加入,會(huì)使得文獻(xiàn)系統(tǒng)中最大文獻(xiàn)長(zhǎng)度急劇縮水(由于fileheader的文獻(xiàn)塊-磁盤快的映射對(duì)數(shù)量減少),因此,文獻(xiàn)類型和途徑,在directoryentry中實(shí)現(xiàn)(實(shí)際上,也是出于對(duì)于ex4的考慮),三個(gè)時(shí)間在fileheader類中實(shí)現(xiàn)。 增長(zhǎng)的描述信息簡(jiǎn)樸簡(jiǎn)介文獻(xiàn)類型1)在directoryEntry中加入。僅僅辨別文獻(xiàn)和文獻(xiàn)夾(文獻(xiàn)為0,文獻(xiàn)夾為1)2)初始化位置:directory::add途徑1)在directoryEntry中加入。2)修改本來(lái)最大長(zhǎng)度為9的name變兩個(gè),char型數(shù)組為char*3)認(rèn)為這個(gè)途徑為文獻(xiàn)的絕對(duì)途徑(從root開(kāi)始算起,為之后ex4做準(zhǔn)備)4)初始化位置:directory::add創(chuàng)立時(shí)間在filehdr中加入,char變量,配合著兩個(gè)函數(shù):設(shè)置時(shí)間和獲取時(shí)間函數(shù)。在函數(shù)體內(nèi),使用linux系統(tǒng)函數(shù)獲取目前時(shí)間,并存入字符數(shù)組當(dāng)中。在filesystem::create函數(shù)中調(diào)用設(shè)置時(shí)間函數(shù)。上次訪問(wèn)時(shí)間同上1)在openfile::read/write函數(shù)中調(diào)用設(shè)置時(shí)間函數(shù),并且注意及時(shí)將文獻(xiàn)頭部指針寫回磁盤(由于更新了文獻(xiàn)頭部中的私有變量,并且原先沒(méi)有寫回文獻(xiàn)頭部這個(gè)操作)上次修改時(shí)間同上1)在openfile::write函數(shù)中調(diào)用設(shè)置時(shí)間函數(shù),并且注意及時(shí)將文獻(xiàn)頭部指針寫回磁盤補(bǔ)充:注意修改filehdr.h中有關(guān)NumDirect的宏定義,因此此時(shí)多占用了3*25(每個(gè)時(shí)間為25個(gè)byte)個(gè)byte。目前文獻(xiàn)實(shí)際能用扇區(qū):(128-75)/4*128=11*128=1,408byteOpenfile中新增了一種私有變量,用于記錄對(duì)應(yīng)的文獻(xiàn)頭部的磁盤塊號(hào),以便文獻(xiàn)頭部的寫回。Fileheader::findindex函數(shù),注意不合用strncmp,改為strcmp。(由于此時(shí)長(zhǎng)度不確定了)測(cè)試截圖:測(cè)試函數(shù)為:ftest.cc,修改文獻(xiàn)大小為50,使得其測(cè)試剛好為5次write,5次read。并且還測(cè)試了關(guān)閉nachos系統(tǒng),但不格式化文獻(xiàn)系統(tǒng),重新載入之后的狀況。寫操作之前要讀。寫操作之前要讀。時(shí)間和內(nèi)容都是上圖操作之后獲得的。實(shí)際上,假如采用char*作為記錄名字的方式,在重啟了nachos系統(tǒng)之后,指針就已經(jīng)亂飄了。因此輸出的名字不對(duì)的。時(shí)間和內(nèi)容都是上圖操作之后獲得的。實(shí)際上,假如采用char*作為記錄名字的方式,在重啟了nachos系統(tǒng)之后,指針就已經(jīng)亂飄了。因此輸出的名字不對(duì)的。Exercise3:擴(kuò)展文獻(xiàn)長(zhǎng)度 任務(wù):改直接索引為間接索引,以突破文獻(xiàn)長(zhǎng)度不能超過(guò)4KB的限制。 完畢狀況: 概述:將本來(lái)的11個(gè)(之前有計(jì)算過(guò))直接索引,拆成6個(gè)直接索引,5個(gè)二級(jí)索引。于是一種文獻(xiàn)最多可以對(duì)應(yīng)的磁盤塊數(shù)量:5*(128/4)+6=166。其中128為一種sector的byte大小,4byte一種二級(jí)索引號(hào)。 圖解釋直接索引和二級(jí)索引:修改部分簡(jiǎn)樸解釋Fileheader的宏定義Fileheaderallocate函數(shù)計(jì)算出文獻(xiàn)總共需要多少個(gè)磁盤塊假如需要的數(shù)量不不小于直接索引,直接用freemap分派即可否則,先分派了所有的直接索引,然后計(jì)算剩余量對(duì)于剩余量,先用freemap分派一種磁盤塊給二級(jí)目錄,然后按照32(一種二級(jí)目錄最多容納32個(gè)索引)為單位,調(diào)用freemap分派空閑塊之后,將得到的<文獻(xiàn)塊,磁盤塊>映射數(shù)組通過(guò)synchdick的writesector函數(shù),寫回二級(jí)目錄所在的磁盤塊。Fileheaderdeallocate函數(shù)先釋放直接索引的磁盤塊假如使用了二級(jí)索引,先通過(guò)synchdick的readsector函數(shù),將二級(jí)目錄所在的磁盤塊讀入,然后逐一釋放,最終再釋放目前的二級(jí)索引(和allocate函數(shù)剛好是相反操作)Fileheaderbytetosector函數(shù)操作過(guò)程類似上面,相比于原先,假如需要二級(jí)索引,需要將偏移量先扣除了直接索引的部分,以及二級(jí)索引自身,再?gòu)亩?jí)目錄中找到對(duì)應(yīng)文獻(xiàn)塊,進(jìn)而找到磁盤塊。 測(cè)試成果:logex3.txtExercise4:實(shí)現(xiàn)多級(jí)目錄 任務(wù):如題。 完畢狀況: 概述:為了實(shí)現(xiàn)多級(jí)目錄,需要有措施找到每個(gè)目錄。于是想到根據(jù)絕對(duì)途徑進(jìn)行層級(jí)劃分。第一級(jí)目錄對(duì)應(yīng)的絕對(duì)途徑是root,第二級(jí)目錄對(duì)應(yīng)的絕對(duì)途徑是root/A,以此類推。輕易想到,每個(gè)絕對(duì)途徑的上一層,也就是其父節(jié)點(diǎn),實(shí)際上就是文獻(xiàn)的相對(duì)途徑。 因此,我們需要兩個(gè)變量共同完畢多級(jí)目錄的索引:絕對(duì)途徑和相對(duì)途徑。由于絕對(duì)途徑在ex2中已經(jīng)存在name變量中了,我們只需做簡(jiǎn)樸的字符串掃描工作,就可以得到文獻(xiàn)的相對(duì)途徑。 關(guān)鍵函數(shù)簡(jiǎn)介: 對(duì)于多級(jí)目錄的實(shí)現(xiàn),最關(guān)鍵的就是可以在這個(gè)目錄樹(shù)中找到對(duì)應(yīng)的結(jié)點(diǎn)。函數(shù)名稱重要功能Directory::Getcorrectdirsector(name)在多級(jí)目錄中找到name對(duì)應(yīng)的目錄項(xiàng)所在的相對(duì)途徑,返回值為相對(duì)途徑所在的磁盤塊號(hào)(如:假如對(duì)應(yīng)的目錄項(xiàng)為root/A/B,則需要找到root/A所在的磁盤塊號(hào))解釋:將傳入的名字參數(shù)(也就是絕對(duì)途徑,如root/A/B)解析,得到相對(duì)途徑(即文獻(xiàn)所在的上層目錄,即root/A)代碼如下:判斷相對(duì)途徑與否是根目錄(root),假如是,返回1(根目錄的磁盤塊編號(hào)為1)否則,將相對(duì)途徑與目前目錄文獻(xiàn)存儲(chǔ)的目錄項(xiàng)的絕對(duì)途徑進(jìn)行比對(duì),試圖尋找可匹配項(xiàng)(如,root/A/B的相對(duì)途徑為root/A,根目錄文獻(xiàn)中存在絕對(duì)途徑為root/A的一項(xiàng),于是可以懂得,此時(shí)返回root/A所在的磁盤塊號(hào)即可),假如存在,返回所在的磁盤塊號(hào)否則,for循環(huán)目前目錄文獻(xiàn)的目錄項(xiàng)table,假如目錄項(xiàng)使用了(inuse=true)并且目錄項(xiàng)存儲(chǔ)的文獻(xiàn)的文獻(xiàn)類型為文獻(xiàn)夾(ex2中設(shè)置的filetype在此處派上用場(chǎng)),則載入這個(gè)目錄文獻(xiàn),并且調(diào)用getcorrectdirsector,遞歸尋找。假如最終找不到,返回-1 改動(dòng)部分:改動(dòng)函數(shù)Directory::add函數(shù):增長(zhǎng)一種參數(shù)——文獻(xiàn)類型。0為文獻(xiàn),1為文獻(xiàn)夾。(table中已經(jīng)有這個(gè)條目了,在ex2中創(chuàng)立的)Filesys::create函數(shù):參數(shù)沒(méi)變,但規(guī)定,initialsize假如傳入-1,代表create的文獻(xiàn)的文獻(xiàn)類型為文獻(xiàn)夾。載入了根目錄文獻(xiàn)后,調(diào)用getcorrectdirsector函數(shù),獲得文獻(xiàn)相對(duì)途徑的文獻(xiàn)頭部所在的磁盤塊號(hào)假如不是根目錄文獻(xiàn)的磁盤塊號(hào)(即2)中返回值≠1),意味著我們要載入另一種目錄文獻(xiàn):通過(guò)返回的磁盤塊號(hào),先用openfile打開(kāi)文獻(xiàn),然后用directory的fetchfrom函數(shù),覆蓋本來(lái)的directory指針。在目前目錄文獻(xiàn)中尋找,要?jiǎng)?chuàng)立的文獻(xiàn)與否已經(jīng)存在(directory->find(name)函數(shù))。假如不存在,證明可以create.載入freemap文獻(xiàn),先為文獻(xiàn)頭部分派空閑磁盤塊。(freemap->find()實(shí)現(xiàn))分派成功后,將<文獻(xiàn)名,文獻(xiàn)頭部所在磁盤塊號(hào)>條目加入目前目錄文獻(xiàn)中(directory->add(name,sector,filetype)實(shí)現(xiàn))創(chuàng)立文獻(xiàn)頭部,用文獻(xiàn)頭部為文獻(xiàn)塊映射磁盤塊(hdr->allocate(freemap,size)實(shí)現(xiàn)。其中,假如是創(chuàng)立文獻(xiàn),則size=initialsize,假如是創(chuàng)立文獻(xiàn)夾,則size=DirectoryFileSize宏),并將映射成果寫回磁盤(hdr->writeback(sector)實(shí)現(xiàn))接下來(lái)要寫回目錄文獻(xiàn)了:一定要注意,假如目前是在根目錄文獻(xiàn),則寫回的是directoryFile,假如不是,則寫回的是剛剛新創(chuàng)立的Openfile最終,假如創(chuàng)立的是文獻(xiàn)夾,則需要預(yù)先新生成一種directory給它。鑒于這部分比較難以描述清晰,代碼如下:Filesys::open函數(shù):載入了根目錄文獻(xiàn)后,調(diào)用getcorrectdirsector函數(shù),獲得文獻(xiàn)相對(duì)途徑的文獻(xiàn)頭部所在的磁盤塊號(hào)假如不是根目錄文獻(xiàn)的磁盤塊號(hào)(即2)中返回值≠1),意味著我們要載入另一種目錄文獻(xiàn):通過(guò)返回的磁盤塊號(hào),先用openfile打開(kāi)文獻(xiàn),然后用directory的fetchfrom函數(shù),覆蓋本來(lái)的directory指針。在目前目錄文獻(xiàn)中尋找,要打開(kāi)的文獻(xiàn)與否存在(directory->find(name)函數(shù))。假如存在,用find函數(shù)返回的sector號(hào)打開(kāi)文獻(xiàn),返回openfile指針。Filesys::remove函數(shù):和create函數(shù)類似。但要注意,假如刪除的是文獻(xiàn)夾,需要遍歷一遍文獻(xiàn)夾目錄文獻(xiàn)下的所有結(jié)點(diǎn),將它們一并刪除。補(bǔ)充:1)實(shí)際上,directory中的函數(shù),不需要考慮遞歸尋找之類的問(wèn)題。由于這一切在filesys的函數(shù)里已經(jīng)做了,通過(guò)getcorrectdirsector,配合打開(kāi)新的目錄文獻(xiàn),之后只要調(diào)用新的目錄文獻(xiàn)的directory措施,就可以了。 測(cè)試截圖:測(cè)試函數(shù)截圖:測(cè)試的截圖這里是注釋掉的。測(cè)試的截圖這里是注釋掉的。測(cè)試成果截圖同上為文獻(xiàn)內(nèi)容分派磁盤塊打印根目錄信息,并且為文獻(xiàn)頭部分派磁盤塊打開(kāi)失敗,同上為文獻(xiàn)內(nèi)容分派磁盤塊打印根目錄信息,并且為文獻(xiàn)頭部分派磁盤塊打開(kāi)失敗,創(chuàng)立文獻(xiàn):找到相對(duì)途徑位于sector1(即根目錄)試圖打開(kāi)文獻(xiàn)這里即:getcorrectdirsector中這里即:getcorrectdirsector中,遞歸尋找相對(duì)途徑的部分。Exercise5:動(dòng)態(tài)調(diào)整文獻(xiàn)長(zhǎng)度 任務(wù):對(duì)文獻(xiàn)的創(chuàng)立操作和寫入操作進(jìn)行合適修改,以使其符合實(shí)習(xí)規(guī)定。 完畢狀況: 概述:由于我們?cè)趀x3中實(shí)現(xiàn)了多級(jí)索引,因此在動(dòng)態(tài)調(diào)整文獻(xiàn)長(zhǎng)度部分,最關(guān)鍵的問(wèn)題,就是要對(duì)擴(kuò)展的長(zhǎng)度占據(jù)的磁盤塊數(shù)量做考察,分類討論。 關(guān)鍵函數(shù)簡(jiǎn)介:函數(shù)名稱重要功能Filehdr::extendallocate(bitmap,filesize)為擴(kuò)展的filesize個(gè)byte,使用bitmap,分派磁盤塊。解釋:計(jì)算出需要幾種磁盤塊,本來(lái)用了幾種磁盤塊更新fileheader的私有變量:文獻(xiàn)字節(jié)總數(shù)和共占用幾種磁盤塊(一定要注意更新!否則在readAt和writeAt部分會(huì)出問(wèn)題的)分類討論:假如擴(kuò)展的磁盤塊仍不不小于直接索引:直接用bitmap分派即可。假如擴(kuò)展的磁盤塊位于直接索引和二級(jí)索引之間:先分派完直接索引部分,然后用for循環(huán):先為二級(jí)索引分派一種磁盤塊,然后在二級(jí)索引對(duì)應(yīng)的table中,分派磁盤塊(最多32個(gè))假如擴(kuò)展的磁盤塊僅位于二級(jí)索引:先判斷本來(lái)的二級(jí)索引對(duì)應(yīng)的table使用完了沒(méi),假如沒(méi)用完,先寫完剩余的,再新分派下一種二級(jí)索引及table.記得調(diào)用synchdisk->writesector,將修改的部分寫回磁盤。代碼如下:補(bǔ)充:實(shí)際上,代碼中開(kāi)頭紅框部分非常重要……不輕易想到。不過(guò)在我調(diào)試writeAt的時(shí)候,才注意到的。就是,假如擴(kuò)展的字節(jié)并沒(méi)有超過(guò)本來(lái)分派的磁盤塊,那么就可以直接返回true了。而不是再分派一種新的sector。這會(huì)導(dǎo)致寄存的不持續(xù)。 改動(dòng)部分:改動(dòng)/增長(zhǎng)函數(shù)增長(zhǎng):filesys::extendFile(openfile指針,擴(kuò)展長(zhǎng)度)解釋:由于關(guān)鍵函數(shù)extendallocate需要參數(shù)freemap,因此考慮在filesys文獻(xiàn)中調(diào)用extendallocate??紤]到這個(gè)函數(shù)之后會(huì)被openfile的writeAt函數(shù)調(diào)用,因此設(shè)置其中一種參數(shù)為openfile指針。載入freemap。調(diào)用openfile->私有變量:文獻(xiàn)頭部指針->extendallocate(freemap,擴(kuò)展長(zhǎng)度)假如擴(kuò)展成功(返回值為true),將freemap的改動(dòng)寫回磁盤文獻(xiàn)(freemap->writeback)。一定要記得寫回,否則擴(kuò)展部分主線沒(méi)有成功分派?。⌒薷模簅penfile::writeAt函數(shù)解釋:在判斷position+numBytes與否不小于fileLength的時(shí)候,假如不小于,不是直接返回失敗,而是調(diào)用filesystem->extendFile(this,擴(kuò)展長(zhǎng)度)增長(zhǎng)的部分代碼如下: 測(cè)試截圖:A. 測(cè)試了動(dòng)態(tài)擴(kuò)展文獻(xiàn)的對(duì)的性:測(cè)試函數(shù):修改數(shù)字,使得分類討論的三種狀況都能測(cè)試到修改數(shù)字,使得分類討論的三種狀況都能測(cè)試到。 測(cè)試成果:只需要一級(jí)索引只需要一級(jí)索引。只需要一級(jí)索引。需要一級(jí)索引及二級(jí)索引需要一級(jí)索引和二級(jí)索引需要一級(jí)索引和二級(jí)索引只需要二級(jí)索引只需要二級(jí)索引只需要二級(jí)索引B. 測(cè)試了writeAt的對(duì)的性 測(cè)試函數(shù):試圖寫入一種文獻(xiàn)初始長(zhǎng)度為0的文獻(xiàn),需要寫5次。 測(cè)試截圖:Exercise6:源代碼閱讀 任務(wù)a:閱讀Nachos源代碼中與異步磁盤有關(guān)的代碼,理解Nachos系統(tǒng)中異步訪問(wèn)模擬磁盤的工作原理。filesys/synchdisk.h和filesys/synchdisk.cc 完畢狀況: 概述:synchdisk是將對(duì)磁盤的訪問(wèn)包裝成了互斥訪問(wèn)形式。通過(guò)一把鎖,實(shí)現(xiàn)線程之間對(duì)磁盤的讀或者寫(單位為一種磁盤塊)是互斥進(jìn)行的。通過(guò)一種信號(hào)量,實(shí)現(xiàn)當(dāng)一種線程完畢讀/寫操作之后,可以產(chǎn)生一種中斷,中斷調(diào)用的函數(shù)將信號(hào)量釋放,從而使得其中一種在等待的線程可以執(zhí)行操作。任務(wù)b:運(yùn)用異步訪問(wèn)模擬磁盤的工作原理,在ClassConsole的基礎(chǔ)上,實(shí)現(xiàn)ClassSynchConsole。完畢狀況:類似于synchdisk,通過(guò)鎖,實(shí)現(xiàn)讀字符和輸出字符的互斥性。關(guān)鍵部分如圖所示:相稱于是將本來(lái)的console做了互斥包裝,類似于對(duì)disk做互斥包裝的synchdisk同樣。測(cè)試函數(shù)略。Exercise7:實(shí)現(xiàn)文獻(xiàn)系統(tǒng)的同步互斥訪問(wèn)機(jī)制 任務(wù)a:一種文獻(xiàn)可以同步被多種線程訪問(wèn)。且每個(gè)線程獨(dú)自打開(kāi)文獻(xiàn),獨(dú)自擁有一種目前文獻(xiàn)訪問(wèn)位置,彼此間不會(huì)互相干擾。 完畢狀況: 概述:由于openfile類中,私有變量包括里的seekposition,即光標(biāo)位置,因此每個(gè)線程擁有自己的Openfile指針,也就可以獨(dú)立訪問(wèn)文獻(xiàn)了。由于目前還沒(méi)能讓寫和讀互斥,因此測(cè)試僅僅測(cè)試多種線程同步讀取同個(gè)文獻(xiàn)。 測(cè)試截圖: 測(cè)試函數(shù):Main函數(shù)線程和fork出來(lái)的線程,同步對(duì)”root/A”文獻(xiàn)進(jìn)行20字節(jié)的讀取。 測(cè)試成果:Main函數(shù)先讀了20byteThread2再讀20byte.彼此不沖突。Main函數(shù)先讀了20byteThread2再讀20byte.彼此不沖突。 任務(wù)b:所有對(duì)文獻(xiàn)系統(tǒng)的操作必須是原子操作和序列化的。例如,當(dāng)一種線程正在修改一種文獻(xiàn),而另一種線程正在讀取該文獻(xiàn)的內(nèi)容時(shí),讀線程要么讀出修改正的文獻(xiàn),要么讀出本來(lái)的文獻(xiàn),不存在不可估計(jì)的中間狀態(tài)。 完畢狀況: 考慮1:雖然在openfile::readAt和openfile::writeAt函數(shù)當(dāng)中,是用synchdisk->readsector和synchdisk->writesector函數(shù)來(lái)互斥訪問(wèn)磁盤的,但需要注意的是,在每個(gè)sector之間,訪問(wèn)不是互斥的。即:假如我但愿寫入3個(gè)sector,并但愿讀出同樣位置的3個(gè)sector,假如僅僅保證了互斥的粒度是sector,那么我確實(shí)不懂得我讀出來(lái)的會(huì)是多少個(gè)修改正的sector。因此,需要在readAt和writeAt的頭和尾,也要用鎖互斥起來(lái)。 考慮2:目前Openfile采用的是,在構(gòu)造函數(shù)時(shí),就將文獻(xiàn)頭部信息存入自己的私有變量,此后每次修改,都是將自己的新值覆蓋本來(lái)磁盤中的老值。而這對(duì)于多線程共同訪問(wèn)同一種文獻(xiàn),就存在問(wèn)題:每個(gè)線程都讀出來(lái)了同樣的東西,但由于寫回去的次序不定,這就導(dǎo)致了磁盤中文獻(xiàn)頭部的信息有也許不是最新的。因此,我們需要在每次對(duì)文獻(xiàn)頭部進(jìn)行訪問(wèn)之前,都重新從磁盤中加載一次,而不僅僅只在構(gòu)造函數(shù)中加載。 改動(dòng)狀況:修改函數(shù)簡(jiǎn)樸闡明Synchdisk:私有變量:Semaphore*mutex[NumSectors];組員函數(shù):voidSynchDisk::read_write_P(intsector){mutex[sector]->P();}voidSynchDisk::read_write_V(intsector){mutex[sector]->V();}對(duì)應(yīng)于考慮1,讓每個(gè)磁盤塊均有自己的一種互斥量。兩個(gè)組員函數(shù)就是對(duì)互斥量進(jìn)行PV操作的。Openfile::構(gòu)造函數(shù)在hdr->fetchfrom(sector)之前,執(zhí)行synchdisk->read_write_P(hdr對(duì)應(yīng)sector)在hdr->writeback(hdr_sector)之后,執(zhí)行synchdisk->read_write_V(hdr_sector)保證訪問(wèn)同一種文獻(xiàn)頭部的線程,按次序?qū)懟?。誰(shuí)先拿到鎖,誰(shuí)就可以獲得文獻(xiàn)頭部,并且修改之后寫回磁盤,釋放鎖。Openfile::read函數(shù)同上。以read為例:Openfile::write函數(shù)同上同上 測(cè)試截圖: 測(cè)試函數(shù):主線程和新生成的線程一種調(diào)用read50次,一種調(diào)用write50次。 測(cè)試成果:可以看到,兩者交替進(jìn)行(只截了部分圖)。 任務(wù)c:當(dāng)某一線程欲刪除一種文獻(xiàn),而此外某些線程正在訪問(wèn)該文獻(xiàn)時(shí),需保證所有線程關(guān)閉了這個(gè)文獻(xiàn),該文獻(xiàn)才被刪除。也就是說(shuō),只要尚有一種線程打開(kāi)了這個(gè)文獻(xiàn),該文獻(xiàn)就不能真正地被刪除。 完畢狀況: 概述:在文獻(xiàn)頭部中加入私有變量,用于計(jì)數(shù)目前打開(kāi)本文獻(xiàn)的線程個(gè)數(shù)。當(dāng)需要從文獻(xiàn)系統(tǒng)remo

溫馨提示

  • 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)論