Nachos文件系統(tǒng)實習報告_第1頁
Nachos文件系統(tǒng)實習報告_第2頁
Nachos文件系統(tǒng)實習報告_第3頁
Nachos文件系統(tǒng)實習報告_第4頁
Nachos文件系統(tǒng)實習報告_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

文獻系統(tǒng)實習匯報善良的大姐姐.5.3

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論