操作系統(tǒng)教程課件07第七章文件系統(tǒng)_第1頁(yè)
操作系統(tǒng)教程課件07第七章文件系統(tǒng)_第2頁(yè)
操作系統(tǒng)教程課件07第七章文件系統(tǒng)_第3頁(yè)
操作系統(tǒng)教程課件07第七章文件系統(tǒng)_第4頁(yè)
操作系統(tǒng)教程課件07第七章文件系統(tǒng)_第5頁(yè)
已閱讀5頁(yè),還剩129頁(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)介

第七章文件系統(tǒng)7.1文件與文件系統(tǒng)文件具有符號(hào)名而且在邏輯上具有完整意義的信息項(xiàng)的序列。文件系統(tǒng)文件與管理文件的程序集合。

信息項(xiàng)信息項(xiàng)…信息項(xiàng)…信息項(xiàng)讀(寫(xiě))指針UNIX文件分類普通文件內(nèi)容可以是程序、數(shù)據(jù)、圖象、MP3等,保存在磁盤(pán)塊中目錄文件(文件名,文件號(hào))序列,保存在磁盤(pán)塊中特殊文件設(shè)備設(shè)備作為文件管理的好處界面統(tǒng)一,使用文件與使用設(shè)備命令相同,申請(qǐng)?jiān)O(shè)備open,釋放close,讀read,寫(xiě)write利用文件保護(hù)功能可以保護(hù)設(shè)備7.2文件的訪問(wèn)方式順序訪問(wèn)從文件起始位置開(kāi)始順序訪問(wèn)從文件中間某處開(kāi)始順序訪問(wèn)隨機(jī)訪問(wèn)按記錄編號(hào)隨機(jī)訪問(wèn)按關(guān)鍵字(key)隨機(jī)訪問(wèn)7.3文件的組織邏輯組織用戶看到的文件組織形式記錄式文件:記錄的序列等長(zhǎng)記錄(優(yōu)點(diǎn):處理方便,速度快;缺點(diǎn):空間浪費(fèi))不等長(zhǎng)記錄(優(yōu)點(diǎn):省空間;缺點(diǎn):處理不便,速度慢)流式文件:字節(jié)的序列(UNIX,Windows,etc)物理組織邏輯組織到磁盤(pán)塊的映射文件:記錄(字節(jié))序列磁盤(pán):塊(block)序列變換關(guān)系7.3.2文件的物理組織考慮因素記錄格式等長(zhǎng)或不等長(zhǎng),流式不必考慮空間開(kāi)銷除保存文件內(nèi)容之外的存儲(chǔ)開(kāi)銷訪問(wèn)速度隨機(jī)訪問(wèn)速度長(zhǎng)度變化動(dòng)態(tài)增長(zhǎng)順序結(jié)構(gòu):一個(gè)文件占有若干連續(xù)的磁盤(pán)塊。優(yōu)點(diǎn):速度快,節(jié)省空間缺點(diǎn):長(zhǎng)度變化困難…塊18塊19塊20塊21塊22...磁盤(pán)空間…首塊=18塊數(shù)=5...FCB鏈接結(jié)構(gòu):一文件可存于不連續(xù)塊中,塊間以指針相連。優(yōu)點(diǎn):節(jié)省空間,長(zhǎng)度變化容易。缺點(diǎn):隨機(jī)訪問(wèn)速度慢?!瓑K18...塊80...塊92...磁盤(pán)空間…首塊=18塊數(shù)=3...FCB索引結(jié)構(gòu):一文件可存于不連續(xù)塊中,塊號(hào)記在索引塊中。優(yōu)點(diǎn):速度快,長(zhǎng)度變化容易。缺點(diǎn):索引塊占空間。磁盤(pán)空間…索引塊=29塊數(shù)=4...FCB…塊18塊19...塊26...塊30...索引塊29Hash結(jié)構(gòu):計(jì)算地址:hash(key)=addr(在磁盤(pán)或文件中的存放位置)問(wèn)題:給定key1key2hash(key1)=addr1;hash(key2)=addr2;addr1=addr2(conflict)Conflictresolution:順序探查法:如發(fā)生沖突,則在沖突位置開(kāi)始順序探查第一個(gè)空閑的存儲(chǔ)位置。......文件空間空閑標(biāo)志沖突記數(shù)記錄內(nèi)容空閑標(biāo)志沖突記數(shù)Hash(key)=addr起始位置計(jì)算addr=hash(key)對(duì)應(yīng)沖突記數(shù)加1本記錄空閑順取下一個(gè)標(biāo)記為占用填記錄內(nèi)容保存記錄:TF記錄內(nèi)容查找記錄:計(jì)算addr=hash(key)取addr對(duì)應(yīng)記錄的沖突記數(shù)countcount=0無(wú)此記錄本記錄空閑順取下一記錄key相等找到hash(key)相等count:=count-1count=0無(wú)此記錄順取下一記錄TFFTTFTFTF刪除記錄:調(diào)用查找過(guò)程(key)找到錯(cuò)誤返回置空閑標(biāo)志(找到記錄)沖突記數(shù)-1對(duì)應(yīng)hash(key)特點(diǎn):按關(guān)鍵字檢索速度非??臁S猛荆撼S糜谀夸洐z索。注意:文件可循環(huán)使用,滿時(shí)保存失敗。FTUNIX文件物理結(jié)構(gòu)(索引+鏈接)…i_addr[0]...i_addr[9]i_addr[10]i_addr[11]i_addr[12]...inode.....................最大=10+256(塊)7.4文件目錄文件控制塊與目錄項(xiàng)文件控制塊(FCB)文件存在的標(biāo)志,其中保存系統(tǒng)管理文件需要的全部信息目錄項(xiàng)目錄文件中的一項(xiàng),內(nèi)容為FCB文件目錄與目錄文件文件目錄用于檢索文件的目錄目錄文件內(nèi)容為目錄項(xiàng)的文件文件控制塊FCB(FileControlBlock)文件名文件號(hào)文件主文件類型文件屬性共享說(shuō)明文件長(zhǎng)度文件地址建立日期最后修改日期最后訪問(wèn)日期口令其它FCB創(chuàng)建:建立文件時(shí)FCB撤消:刪除文件時(shí)單級(jí)目錄(Single-LevelDirectory)Asingledirectoryforallusers.缺點(diǎn):NamingproblemGroupingproblemProtectionproblem兩級(jí)目錄(Two-LevelDirectory)Separatedirectoryforeachuser.特點(diǎn):1.Pathname2.Canhavethesamefilenamefordifferentuser3.Efficientsearching4.NogroupingcapabilityrootbinusrlibdevetcunixlpccviusersLiWangd1d2f1consolepasswdbinyaccsf2多級(jí)目錄(Multi-LevelDirectoryasinUNIX)clibflib

文件目錄的查找查找路徑由根目錄開(kāi)始查找由當(dāng)前目錄開(kāi)始查找查找算法順序查找(UNIX)hash查找(Solo)對(duì)分查找(要求文件名排序)文件目錄的改進(jìn)FCB次部:(文件名,文件號(hào))(UNIX16bytes)保存在目錄文件中主部:(其它,鏈接記數(shù))(UNIX32bytes)保存在外存inode區(qū)域,打開(kāi)時(shí)讀入內(nèi)存.改進(jìn)的好處可以提高查找速度(順序查找)可以實(shí)現(xiàn)文件鏈接(link)UNIX文件卷(volume)組織形式:012…kk+1…n-1導(dǎo)引塊超級(jí)塊

inode區(qū)域每塊16個(gè)inode,從0起依次編號(hào)

文件存儲(chǔ)區(qū)域(普通文件,目錄文件)7.5文件的共享共享目的節(jié)省存儲(chǔ)空間(cc,vi,yacc)進(jìn)程相互通訊UNIXpipe()文件共享模式不同時(shí)使用根據(jù)共享說(shuō)明同時(shí)使用根據(jù)共享說(shuō)明和(relaxed)R/W規(guī)則文件的共享文件共享的實(shí)現(xiàn)公共目錄共享說(shuō)明連接d1userswanglif1f2i_number=15f215f115link(“/usr/users/wang/d1/f1”,“/usr/users/li/f2”)unlink(“/usr/users/wang/d1/f1”)usrroot7.6文件的保護(hù)、保密與安全保護(hù)防止用戶對(duì)文件進(jìn)行非授權(quán)的訪問(wèn)保密防止文件內(nèi)容泄露安全防止文件被破壞自然因素人為因素7.6.1文件的保護(hù)(Protection)Fileowner/creatorshouldbeabletocontrol:whatcanbedonebywhomTypesofaccessReadWriteExecuteAppendDeleteList1.存取控制矩陣f1……fj……fnu1a11….…a1j…….a1n…...uiai1……aij….…ain

…...umam1…..amj….…amnRWEAMDaij:特點(diǎn):權(quán)限規(guī)定細(xì),過(guò)于繁瑣,占較多存儲(chǔ)空間2.訪問(wèn)權(quán)限說(shuō)明(UNIX)i_modeRWERWERWE文件主同組用戶其他用戶文件主判別:訪問(wèn)進(jìn)程u_uid==i_uid同組用戶判別:訪問(wèn)進(jìn)程u_gid==i_gidi_mode在創(chuàng)建文件時(shí)給出,creat(filename,mode)其后文件主可以修改:chmod(filename,new_mode)特權(quán)用戶7.6.2文件保密口令使用創(chuàng)建文件時(shí)用戶規(guī)定一個(gè)口令,系統(tǒng)將其記在FCB中訪問(wèn)文件要求給出口令,并與FCB中口令比較特點(diǎn)簡(jiǎn)單保密性不強(qiáng)(eg.對(duì)系統(tǒng)操作員不保密)密碼特點(diǎn)對(duì)文件內(nèi)容加密,速度慢,效果好使用保存時(shí)加密(key)讀取時(shí)解密(key)保存時(shí):用一個(gè)key啟動(dòng)一個(gè)隨機(jī)數(shù)發(fā)生器,產(chǎn)生一個(gè)隨機(jī)數(shù)序列,將其依此加到文件的各個(gè)字中。讀取時(shí):用同一個(gè)key啟動(dòng)同一個(gè)隨機(jī)數(shù)發(fā)生器,產(chǎn)生相同隨機(jī)數(shù)序列,將其依次由文件的各個(gè)字中減去。線性同余法產(chǎn)生偽隨機(jī)數(shù):

Procedurerandom(Varkey:integer);Beginkey:=(key*C1+C2)MODC3End;7.6.3文件系統(tǒng)的安全Backup(備份)定期將磁盤(pán)上文件復(fù)制到磁帶上發(fā)生故障時(shí)由磁帶恢復(fù)(limitedrecovery)實(shí)現(xiàn)方法完全轉(zhuǎn)儲(chǔ)定期將磁盤(pán)上文件全部復(fù)制到磁帶上恢復(fù):最后一次轉(zhuǎn)儲(chǔ)磁帶優(yōu)點(diǎn):恢復(fù)容易缺點(diǎn):大量冗余增量轉(zhuǎn)儲(chǔ)(incrementalbackup)每次只復(fù)制上次轉(zhuǎn)儲(chǔ)以來(lái)修改部分恢復(fù):由初始轉(zhuǎn)儲(chǔ)磁帶起,利用第二次轉(zhuǎn)儲(chǔ)磁帶、第三次轉(zhuǎn)儲(chǔ)磁帶、…、最后一次轉(zhuǎn)儲(chǔ)磁帶,逐步恢復(fù)到最終版本優(yōu)點(diǎn):每次轉(zhuǎn)儲(chǔ)數(shù)據(jù)少缺點(diǎn):實(shí)現(xiàn)麻煩,某次轉(zhuǎn)儲(chǔ)磁帶發(fā)生問(wèn)題將使恢復(fù)困難7.6.3文件系統(tǒng)的安全差分轉(zhuǎn)儲(chǔ)(differentialbackup)開(kāi)始進(jìn)行一次完全轉(zhuǎn)儲(chǔ)以后每次備份當(dāng)天與開(kāi)始第一次備份不同的數(shù)據(jù)恢復(fù):利用第一次轉(zhuǎn)儲(chǔ)磁帶和最后一次轉(zhuǎn)儲(chǔ)磁帶優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單,恢復(fù)容易磁盤(pán)整理利用轉(zhuǎn)儲(chǔ)和恢復(fù)可以對(duì)磁盤(pán)進(jìn)行整理(使文件物理塊連續(xù),空閑盤(pán)塊連續(xù))7.7文件系統(tǒng)的實(shí)現(xiàn)7.7.1內(nèi)存所需表目系統(tǒng)打開(kāi)文件表(系統(tǒng)一個(gè))FCB主部文件號(hào)共享計(jì)數(shù)修改標(biāo)志……………………7.7文件系統(tǒng)的實(shí)現(xiàn)7.7.1內(nèi)存所需表目用戶打開(kāi)文件表(每個(gè)進(jìn)程一個(gè))打開(kāi)方式讀寫(xiě)指針系統(tǒng)打開(kāi)文件表入口………………文件描述符7.7文件系統(tǒng)的實(shí)現(xiàn)打開(kāi)方式讀寫(xiě)指針系統(tǒng)打開(kāi)文件表入口

…打開(kāi)方式讀寫(xiě)指針系統(tǒng)打開(kāi)文件表入口

…FCB主部文件號(hào)共享計(jì)數(shù)修改標(biāo)志

系統(tǒng)打開(kāi)文件表2…文件描述符文件描述符用戶打開(kāi)文件表15…外存空間的管理空閑塊表空閑塊鏈位示圖(bitmap)Linux,分給一個(gè)文件的磁盤(pán)塊連續(xù)UNIX:成組連接空閑塊管理(成組連接):100個(gè)空閑塊為一組,組之間相互鏈接,最前面的組記在超級(jí)塊中,安裝后緩沖到內(nèi)存?!璼_nfree=66s_free[0]s_free[1]...s_free[65]...Superblock...............特點(diǎn):速度快,空間省??臻e塊管理:申請(qǐng)時(shí):

(1)s_nfree>1,分配s_free[--s_nfree]所指的塊;(2)s_nfree=1,將s_free[0]所指的連接塊讀入內(nèi)存緩沖區(qū),前202字節(jié)復(fù)制到filesys,分配s_free[0]所指的塊.釋放時(shí):(1)s_nfree<100,s_free[s_nfree++]=釋放塊號(hào);(2)s_nfree=100,將s_nfree和s_free拷貝到釋放塊中,寫(xiě)回外存,s_free[0]=釋放塊號(hào),s_nfree=1.7.8文件系統(tǒng)的界面創(chuàng)建文件命令形式:creat(path_name,fcb_args)參數(shù)說(shuō)明Path_name:文件路徑名Fcb_args:FCB參數(shù)執(zhí)行步驟:(1)為此文件分配一個(gè)FCB主部,初始化(文件主、共享說(shuō)明、創(chuàng)建時(shí)間、長(zhǎng)度等)(2)將文件名和文件號(hào)作為FCB次部填到末級(jí)目錄中(3)以寫(xiě)方式打開(kāi)例如:creat(“/usr/li/d1/f1”,mode)7.8文件系統(tǒng)的界面打開(kāi)文件命令形式:fd=open(path_name,mode)參數(shù)說(shuō)明path_name:文件路徑名;mode:打開(kāi)方式.執(zhí)行步驟(1)根據(jù)文件路徑名查目錄找到文件號(hào),和FCB主部;(2)合法性檢查(根據(jù)打開(kāi)方式、共享說(shuō)明、用戶身份);(3)根據(jù)文件號(hào)查系統(tǒng)打開(kāi)文件表看該文件是否已被打開(kāi),如是共享計(jì)數(shù)加1;否則取一個(gè)空閑的系統(tǒng)打開(kāi)文件表項(xiàng)并將外存中FCB主部等信息填入此表項(xiàng),共享計(jì)數(shù)置為1;(4)在用戶打開(kāi)文件表中取一空表項(xiàng),填寫(xiě)打開(kāi)方式和讀寫(xiě)指針,并指向系統(tǒng)打開(kāi)文件表的對(duì)應(yīng)表項(xiàng).返回信息:fd:文件描述符(在用戶打開(kāi)文件表中的入口),它是一個(gè)非負(fù)整數(shù).7.8文件系統(tǒng)的界面關(guān)閉文件命令形式:close(fd)參數(shù)說(shuō)明fd:文件描述符.執(zhí)行步驟:(1)由fd查用戶打開(kāi)文件表,找到系統(tǒng)打開(kāi)文件表入口;(2)系統(tǒng)打開(kāi)文件表中共享計(jì)數(shù)減1,如減1后的值為0且修改標(biāo)志為1,則將此FCB由內(nèi)存寫(xiě)回外存FCB主部;(3)將fd所對(duì)應(yīng)的用戶打開(kāi)文件表項(xiàng)置為空閑.7.8文件系統(tǒng)的界面指針定位命令形式:seek(fd,offset)參數(shù)說(shuō)明:fd:文件描述符;offset:新的指針位置.執(zhí)行步驟:(1)由fd查用戶打開(kāi)文件表,得系統(tǒng)打開(kāi)文件表入口;(2)查系統(tǒng)打開(kāi)文件表,得文件長(zhǎng)度;(2)檢查參數(shù)合法性;(3)將用戶打開(kāi)文件表中文件讀寫(xiě)指針位置設(shè)定為offset,后繼讀寫(xiě)命令由該指針處存取文件內(nèi)容.7.8文件系統(tǒng)的界面讀文件命令形式:read(fd,nrd,buf)

參數(shù)說(shuō)明:fd:文件描述符;nrd:讀入記錄個(gè)數(shù);buf:內(nèi)存起始位置.

步驟:(1)由fd查用戶打開(kāi)文件表,找到對(duì)應(yīng)的入口;(2)合法性檢查(用戶打開(kāi)文件表中所記錄的打開(kāi)方式、存取方式);(3)查系統(tǒng)打開(kāi)文件表,找到文件的地址;讀文件(cont.)(4)While(nrd>0)&&(未到文件末尾offset<size)Do

根據(jù)offset和nrd計(jì)算下一個(gè)待訪問(wèn)塊的邏輯塊號(hào)和塊內(nèi)起止位置;

根據(jù)文件物理結(jié)構(gòu)得到邏輯塊號(hào)對(duì)應(yīng)的物理塊號(hào);If該塊在內(nèi)存緩沖區(qū)Then

所需部分復(fù)制到buf,offset+復(fù)制量,nrd-復(fù)制量,buff+復(fù)制量,

釋放緩沖區(qū)

Else分配緩沖區(qū),填寫(xiě)頭部,鏈入設(shè)備IO隊(duì)列,如設(shè)備空閑啟動(dòng)設(shè)備,等待IO傳輸結(jié)束(切換進(jìn)程),所需部分復(fù)制到buf,offset+復(fù)制

量,nrd-復(fù)制量,buff+復(fù)制量,釋放緩沖區(qū)

EndifEndwhile(5)返回實(shí)際傳輸字節(jié)數(shù)。7.8文件系統(tǒng)的界面寫(xiě)文件命令形式:write(fd,nwt,buf)參數(shù)含義:fd:文件描述符;nwt:寫(xiě)出記錄個(gè)數(shù);buf:內(nèi)存起始位置.

執(zhí)行步驟:(1)由fd查用戶打開(kāi)文件表,找到對(duì)應(yīng)的入口;(2)合法性檢查(用戶打開(kāi)文件表中所記錄的打開(kāi)方式、存取方式);(3)查系統(tǒng)打開(kāi)文件表,找到文件的地址和長(zhǎng)度;寫(xiě)文件(Cont.)(4)Whilenwt>0Do

根據(jù)offset和nwt計(jì)算下一個(gè)待訪問(wèn)塊的邏輯塊號(hào)和塊內(nèi)起止位置;If物理塊存在(offset<長(zhǎng)度)ThenIf(整塊寫(xiě))Then

分配緩沖區(qū),填寫(xiě)頭部(如已有緩沖區(qū)其它進(jìn)程在用,等待),Else{讀入緩沖區(qū)}Endifbuf內(nèi)容復(fù)制到緩沖區(qū)起止位置,緩沖區(qū)連到設(shè)備IO隊(duì)列,若設(shè)備

空閑啟動(dòng)設(shè)備,offset+復(fù)制量,buff+復(fù)制量,nwt-復(fù)制量;

Else

分配磁盤(pán)塊,分配緩沖區(qū),填寫(xiě)緩沖區(qū)頭部,buf內(nèi)容復(fù)制到緩沖區(qū)起止位置,緩沖區(qū)鏈到IO隊(duì)列,若設(shè)備空閑啟動(dòng)設(shè)備,offset+

復(fù)制量,buff+復(fù)制量,nwt-復(fù)制量;

EndifEndwhile7.8文件系統(tǒng)的界面建立連接命令形式:link(old_name,new_name)參數(shù)含義:old_name:已存在的文件路徑名;new_name:欲連接的文件路徑名.執(zhí)行步驟:(1)查目錄找到文件old_name的文件號(hào)和FCB主部;(2)查目錄找到文件new_name的末級(jí)目錄;(3)將文件號(hào)與new_name中末級(jí)名字合起來(lái)構(gòu)成一個(gè)新的目錄項(xiàng),將其填入new_name的末級(jí)目錄文件中;(4)將FCB主部中的連接計(jì)數(shù)加1.如:link(“/usr/Li/f1”,“/usr/Zhang/d2/f2”)7.8文件系統(tǒng)的界面

斷開(kāi)連接命令形式:unlink(path_name)

參數(shù)含義:path_name:文件路徑名.

執(zhí)行步驟:(1)查目錄找到文件path_name的FCB主部;(2)將連接計(jì)數(shù)i_nlink減1;(3)如減1后的值為0,則歸還該文件所占用的全部存儲(chǔ)塊,該文件將被撤銷;(4)將FCB次部由上級(jí)目錄中清除.

如:unlink(“/usr/Zhang/d2/f2”)UNIX文件系統(tǒng)的實(shí)現(xiàn)內(nèi)存所需表目(UNIX)用戶打開(kāi)文件表(家族進(jìn)程之間希望共享打開(kāi)方式和讀寫(xiě)指針)u_ofile(每個(gè)進(jìn)程一個(gè))file(整個(gè)系統(tǒng)一個(gè))系統(tǒng)打開(kāi)文件表Inode(整個(gè)系統(tǒng)一個(gè))外存空間的管理空閑塊表位示圖(bitmap,Linux)成組連接(UNIXapproach)1.u_ofile(每進(jìn)程一個(gè))structuser{…intu_ofile[NOFILE];…}#defineNOFILE152.file(系統(tǒng)一個(gè))structfile{charf_flag;//R,W,PIPEcharf_count;intf_inode;char*f_offset[2];//讀寫(xiě)指針}file[NFILE]#defineNFILE100#defineFREAD01;#defineFWRITE02#defineFPIPE04UNIX內(nèi)存表目:3.Inode:UNIX系統(tǒng)的FCBstructinode(外存){inti_mode;chari_nlink;chari_uid;chari_gid;chari_size0;char*i_size1;inti_addr[8];inti_atime[2];inti_mtime[2];}structinode(內(nèi)存){inti_flag;(修改位,鎖位)chari_count;chari_dev;chari_number;chari_mode;chari_nlink;chari_uid;chari_gid;chari_size0;char*i_size1;inti_addr[8];

inti_lastr;}inode[NINODE];表間聯(lián)系:u_ofilefile(n)(1)fileinode(n)(1)write(5,…)write(5,…)…read(8,…)用戶空間u_ofileu_ofilefileinode磁盤(pán)空間系統(tǒng)空間...數(shù)據(jù)塊……...i_list表間聯(lián)系read(6,…)u_ofileUNIX外存空間管理:012…kk+1…n-1導(dǎo)引塊超級(jí)塊

inode區(qū)域每塊16個(gè)inode,從0起依次編號(hào)

文件存儲(chǔ)區(qū)域(普通文件,目錄文件)超級(jí)塊(superblock):

(1)記載文件卷上k+1塊到n-1塊中所有空閑塊,

(2)inode區(qū)中100個(gè)空閑inode.(緩存)

文件安裝(mount)后超級(jí)塊讀入內(nèi)存。注:占用區(qū)域已經(jīng)記載在各個(gè)文件的inode中。Structfilesys{ints_isize;//sizeinblocksofilistints_fsize;//sizeinblocksofentirevolumeint

s_nfree;//numberofincorefreeblocksints_free[100];//incorefreeblocksints_ninode;//numberofincoreIlistints_inode[100];//incorefreeInodeschars_flock;//freelistlockingchars_ilock;//ilistlockingchars_fmod;//superblockmodifiedflagchars_ronly;//mountedreadonlyflagchars_time[2];//currentdateoflastupdateintpad[50];}UNIX磁盤(pán)文件空閑塊管理:100個(gè)空閑塊為一組,組之間相互鏈接。56…s_nfree=88s_free[0]s_free[1]...…s_free[86]s_free[87]s_free[88]...s_free[99]…Superblock3278...221190......502330...912898...66申請(qǐng)一塊:分配7856…s_nfree=87s_free[0]s_free[1]...…s_free[86]s_free[87]s_free[88]...s_free[99]…Superblock32...221190......2330...912898...6650申請(qǐng)一塊:分配78UNIX磁盤(pán)文件空閑塊管理:…s_nfree=1s_free[0]s_free[1]...…s_free[86]s_free[87]s_free[88]...s_free[99]…Superblock32221190.........2898...66申請(qǐng)一塊:分配32233091UNIX磁盤(pán)文件空閑塊管理:2330…s_nfree=100s_free[0]s_free[1]...…………...s_free[99]…Superblock221190.........912898...66申請(qǐng)一塊:分配32UNIX磁盤(pán)文件空閑塊管理:…s_nfree=87s_free[0]s_free[1]...…s_free[86]s_free[87]s_free[88]...s_free[99]…Superblock32221190......2330...912898...665056釋放一塊:25UNIX磁盤(pán)文件空閑塊管理:…s_nfree=88s_free[0]s_free[1]...…s_free[86]s_free[87]s_free[88]...s_free[99]…Superblock3211.........912898...66565025釋放一塊:25UNIX磁盤(pán)文件空閑塊管理:229023302330…s_nfree=100s_free[0]s_free[1]...…………...s_free[99]…Superblock221190.........9198...66釋放一塊:86UNIX磁盤(pán)文件空閑塊管理:…s_nfree=1s_free[0]s_free[1]...…s_free[86]s_free[87]s_free[88]...s_free[99]…Superblock86221190.........2898...66233091釋放一塊:86UNIX磁盤(pán)文件空閑塊管理:申請(qǐng)時(shí):

(1)s_nfree>1,分配s_free[--s_nfree]所指的塊;(2)s_nfree=1,將s_free[0]所指的連接塊讀入內(nèi)存緩沖區(qū),前202字節(jié)復(fù)制到filesys,分配s_free[0]所指的塊.釋放時(shí):(1)s_nfree<100,s_free[s_nfree++]=釋放塊號(hào);(2)s_nfree=100,將s_nfree和s_free拷貝到釋放塊中,寫(xiě)回外存,s_free[0]=釋放塊號(hào),s_nfree=1.空閑塊管理:特點(diǎn):速度快,空間省。s_inode最多可以記載100個(gè)空閑inode(編號(hào))申請(qǐng)時(shí):

(1)s_ninode>0,取s_inode[--s_ninode];(2)s_ninode=0,由磁盤(pán)inode區(qū)順取100個(gè)空閑I節(jié)點(diǎn)(i_nlink=0)

將其編號(hào)填入s_inode表中,修改s_ninode,然后分配。釋放時(shí):

(1)s_ninode<100,s_inode[s_ninode++]=i_number(釋放的);(2)s_ninode=100,丟棄??臻einode管理:文件系統(tǒng)界面(UNIX系統(tǒng)調(diào)用)creatopencloseseekreadwritelinkunlinkpipemknodesmountsumountchmodchownerstatefstatechdirfd=creat(pathname,mode)pathname:路徑名;mode:共享說(shuō)明;分配一個(gè)inode,初始化(i_size=0,i_mode=mode,i_nlink=1,i_uid=u_uid,i_gid=u_gid);填寫(xiě)目錄項(xiàng)(name,i_number);以寫(xiě)方式打開(kāi)(填寫(xiě)inode表、file表和u_ofile表);返回文件描述符。UNIX:創(chuàng)建文件例子:creat(“d1/d2/f1”,mode)假定分配i_number=15,(f1,15)→d2中(??????????????,-1)UNIX:創(chuàng)建文件(Cont.)fd=open(pathname,mode)pathname:路徑名;mode:打開(kāi)方式;fd:文件描述符(u_ofile表的入口)查目錄找i_number;用i_number查inode表;查到:權(quán)限檢查(mode打開(kāi)方式,i_mode共享說(shuō)明,i_uid,i_gid,u_uid,u_gid),如合法,i_count++;UNIX:打開(kāi)文件否則:讀入inode到緩沖區(qū),權(quán)限檢查(mode打開(kāi)方式,i_mode共享說(shuō)明,i_uid,i_gid,u_uid,u_gid),如合法,在inode表中找一空閑表項(xiàng),存入inode,i_count=1;在file表中分配一個(gè)表項(xiàng)(f_count==0的),初始化f_count=1;f_offset=0;f_flag=mode,f_inode指向inode;在u_ofile中取一空閑表目,指向file表中對(duì)應(yīng)表項(xiàng);返回文件描述符fd(在u_ofile表中的入口)。UNIX:打開(kāi)文件close(fd)fd:文件描述符;1.由fd查u_ofile找到對(duì)應(yīng)入口;2.由u_ofile[fd]找到file表對(duì)應(yīng)入口;3.f_count--,如>0轉(zhuǎn)6;4.由f_inode找到對(duì)應(yīng)inode,f_inode指向空;5.i_count--,如為0,i_flag標(biāo)志有修改,寫(xiě)回外存inode區(qū);6.u_ofile[fd]=-1(空閑標(biāo)志)。UNIX:關(guān)閉文件seek(fd,whence,offset)fd:文件描述符;whence:相對(duì)位置(0,1,2,3,4,5)=(頭,當(dāng)前位置,尾)offset:移動(dòng)量;1.由u_ofile[fd]找到file表入口;2.由f_inode找到內(nèi)存inode;3.檢查參數(shù)合法性(i_size0,i_size1,f_offset,offset,whence);4.按參數(shù)要求調(diào)整f_offset指針。UNIX:文件讀寫(xiě)指針定位nrd=read(fd,buf,count)fd:文件描述符;buf:進(jìn)程空間接收區(qū)地址;count:讀字節(jié)數(shù);1.由u_ofile[fd],找到file表對(duì)應(yīng)入口;2.檢查訪問(wèn)合法性(f_flag,READ);3.由f_inode找到內(nèi)存inode入口,得到文件地址i_addr;UNIX:讀文件4.While(count>0)&&(f_offset<i_size)Do

根據(jù)f_offset和count計(jì)算下一個(gè)待訪問(wèn)塊的邏輯塊號(hào)和塊內(nèi)起止位置;

根據(jù)文件物理結(jié)構(gòu)i_addr得到邏輯塊號(hào)對(duì)應(yīng)的物理塊號(hào)(bmap);If(i_lastr+1==邏輯塊號(hào))

Thenbp=breada(dev,物理塊號(hào),邏輯塊號(hào)+1對(duì)應(yīng)的物理塊號(hào));所需部分復(fù)制到buf(iomove),f_offset+復(fù)制量,count-復(fù)制量,buf+復(fù)制量,釋放緩沖區(qū)

Elsebp=bread(dev,物理塊號(hào));所需部分復(fù)制到buf(iomove),f_offset+復(fù)制量,count-復(fù)制量,buf+復(fù)制量,釋放緩沖區(qū)

Endifi_lastr=邏輯塊號(hào);Endwhile5.返回實(shí)際傳輸字節(jié)數(shù)。UNIX:讀文件nwt=write(fd,buf,count)fd:文件描述符;buf:進(jìn)程空間發(fā)送地址;count:寫(xiě)字節(jié)數(shù);1.由u_ofile[fd],找到file表對(duì)應(yīng)入口;2.檢查訪問(wèn)合法性(f_flag,WRITE);3.由f_inode找到內(nèi)存inode入口;UNIX:寫(xiě)文件4.Whilecount>0Do

根據(jù)f_offset和count計(jì)算下一個(gè)待訪問(wèn)塊的邏輯塊號(hào)和塊內(nèi)起止位置;If物理塊存在ThenIf(整塊寫(xiě))Then

分配緩沖區(qū)bp,buf內(nèi)容復(fù)制到緩沖區(qū)起止位置(iomove),bawrite(dev,bp)

Elsebp=bread(dev,物理塊號(hào)),buf內(nèi)容復(fù)制到緩沖區(qū)起止位置(iomove),

bdwrite(dev,bp)

EndifElse(物理塊不存在)

分配磁盤(pán)塊,分配緩沖區(qū),填寫(xiě)緩沖區(qū)頭部,buf內(nèi)容復(fù)制到緩沖區(qū)起止位置,

If(整塊寫(xiě))Then

bawrite(dev,bp)Else

bdwrite(dev,bp)EndifEndiff_offset+復(fù)制量,count-復(fù)制量,buf+復(fù)制量Endwhile5.修改inode中文件長(zhǎng)度i_size;UNIX:寫(xiě)文件pipe(fd)intfd[2];1.分配一個(gè)內(nèi)存inode,(i_count=2);2.分配2個(gè)file表項(xiàng)(f_flag分別為PipeR和PipeW,讀/寫(xiě)指針

f_offset為0)3.分配2個(gè)u_ofile表項(xiàng),分別指向2個(gè)file表項(xiàng);4.返回2個(gè)文件描述符fd[0],fd[1],分別為u_ofile中的2個(gè)入口。UNIX:創(chuàng)建管道文件………i_addr[]…i_count(2)…f_flag(Rpipe)f_offset(0)f_inodepf_count(1)f_flag(Wpipe)f_offset(0)f_inodepf_count(1)………內(nèi)存inode表內(nèi)存file表fd[0]fd[1]u_ofile表………進(jìn)程執(zhí)行pipe(fd)之后………i_addr[]…i_count(2)…f_flag(Rpipe)f_offset(0)f_inodepf_count(2)f_flag(Wpipe)f_offset(0)f_inodepf_count(2)………內(nèi)存inode表內(nèi)存file表fd[0]fd[1]u_ofile表………fork創(chuàng)建子進(jìn)程1之后fd[0]fd[1]………父進(jìn)程:子進(jìn)程1:………i_addr[]…i_count(2)…f_flag(Rpipe)f_offset(0)f_inodepf_count(3)f_flag(Wpipe)f_offset(0)f_inodepf_count(3)………內(nèi)存inode表內(nèi)存file表fd[0]fd[1]u_ofile表………fork創(chuàng)建子進(jìn)程2之后fd[0]fd[1]………父進(jìn)程:子進(jìn)程1:………子進(jìn)程2:fd[0]fd[1]………i_addr[]…i_count(2)…f_flag(Rpipe)f_offset(0)f_inodepf_count(2)f_flag(Wpipe)f_offset(0)f_inodepf_count(2)………內(nèi)存inode表內(nèi)存file表fd[0]fd[1]u_ofile表………父進(jìn)程close(fd[0]),close(fd[1])fd[0]fd[1]………父進(jìn)程:子進(jìn)程1:………子進(jìn)程2:fd[0]fd[1]………i_addr[]…i_count(2)…f_flag(Rpipe)f_offset(0)f_inodepf_count(2)f_flag(Wpipe)f_offset(0)f_inodepf_count(1)………內(nèi)存inode表內(nèi)存file表fd[0]fd[1]u_ofile表………子進(jìn)程1(讀者):close(fd[1])fd[0]fd[1]………父進(jìn)程:子進(jìn)程1:………子進(jìn)程2:fd[0]fd[1]………i_addr[]…i_count(2)…f_flag(Rpipe)f_offset(0)f_inodepf_count(1)f_flag(Wpipe)f_offset(0)f_inodepf_count(1)………內(nèi)存inode表內(nèi)存file表fd[0]fd[1]u_ofile表………子進(jìn)程2(寫(xiě)者):close(fd[0])fd[0]fd[1]………父進(jìn)程:子進(jìn)程1:………子進(jìn)程2:fd[0]fd[1]………i_addr[]…i_count(2)…f_flag(Rpipe)f_offsetf_inodepf_count(1)f_flag(Wpipe)f_offsetf_inodepf_count(1)………內(nèi)存inode表內(nèi)存file表u_ofile表子進(jìn)程2(寫(xiě)):write(fd[1],buf1,count1)子進(jìn)程1(讀):read(fd[0],buf0,count0)父進(jìn)程:子進(jìn)程1:子進(jìn)程2:fd[0]fd[1]………………fd[0]fd[1]fd[0]fd[1]………write(fd[1],…)read(fd[0],…)

盤(pán)塊(有緩沖)………i_addr[]…i_count(1)…f_flag(Rpipe)f_offsetf_inodepf_count(1)f_flag(Wpipe)f_offsetf_inodepf_count(0)………內(nèi)存inode表內(nèi)存file表u_ofile表子進(jìn)程2(寫(xiě)完):close(fd[1])父進(jìn)程:子進(jìn)程1:子進(jìn)程2:fd[0]fd[1]………………fd[0]fd[1]fd[0]fd[1]………close(fd[1])read(fd[0],…)

盤(pán)塊(有緩沖)………i_addr[]…i_count(0)…f_flag(Rpipe)f_offsetf_inodepf_count(0)f_flag(Wpipe)f_offsetf_inodepf_count(0)………內(nèi)存inode表內(nèi)存file表u_ofile表子進(jìn)程1(讀完):close(fd[0])父進(jìn)程:子進(jìn)程1:子進(jìn)程2:fd[0]fd[1]………………fd[0]fd[1]fd[0]fd[1]………close(fd[1])close(fd0])Pipe文件同步與互斥pipe讀寫(xiě)同步寫(xiě)滿:寫(xiě)者等待,讀出后喚醒讀空:讀者等待,寫(xiě)入后喚醒讀寫(xiě)關(guān)閉所有讀者關(guān)閉:寫(xiě)時(shí)返回錯(cuò)誤信號(hào)所有寫(xiě)者關(guān)閉:讀者立即返回讀寫(xiě)互斥i_flag|ILOCK管道通訊的局限性只有相關(guān)進(jìn)程(同一家族進(jìn)程)能通訊先創(chuàng)建管道再創(chuàng)建子進(jìn)程,子進(jìn)程繼承父進(jìn)程打開(kāi)的文件(包括管道文件)管道是沒(méi)有名字的文件所有進(jìn)程都關(guān)閉后即被撤銷命名管道(FIFO)長(zhǎng)久性通訊機(jī)構(gòu)具有文件名可被打開(kāi)、讀寫(xiě)、關(guān)閉和刪除任何進(jìn)程都能找到它即使是不同祖先的進(jìn)程,也可以利用命名管道進(jìn)行通信。讀取和寫(xiě)入遵循FIFO原則阻塞:(打開(kāi)時(shí),未置O_NOBLOCK)不阻塞:(打開(kāi)時(shí),置位O_NOBLOCK)管道長(zhǎng)度#definePIPE_BUF4096從FIFO中讀取數(shù)據(jù):如果有進(jìn)程寫(xiě)打開(kāi)FIFO,且當(dāng)前FIFO為空,則對(duì)于設(shè)置了阻塞標(biāo)志的讀操作來(lái)說(shuō),將一直阻塞下去,直到有數(shù)據(jù)可以讀時(shí)才繼續(xù)執(zhí)行;對(duì)于沒(méi)有設(shè)置阻塞標(biāo)志的讀操作來(lái)說(shuō),則返回0個(gè)字節(jié),當(dāng)前errno值為EAGAIN,提醒以后再試。對(duì)于設(shè)置了阻塞標(biāo)志的讀操作來(lái)說(shuō),造成阻塞的原因有兩種:一、當(dāng)前FIFO內(nèi)有數(shù)據(jù),但有其它進(jìn)程在讀這些數(shù)據(jù);二、FIFO本身為空。解阻塞的原因是:FIFO中有新的數(shù)據(jù)寫(xiě)入,不論寫(xiě)入數(shù)據(jù)量的大小,也不論讀操作請(qǐng)求多少數(shù)據(jù)量,只要有數(shù)據(jù)寫(xiě)入即可。讀打開(kāi)的阻塞標(biāo)志只對(duì)本進(jìn)程第一個(gè)讀操作施加作用,如果本進(jìn)程中有多個(gè)讀操作序列,則在第一個(gè)讀操作被喚醒并完成讀操作后,其它將要執(zhí)行的讀操作將不再阻塞,即使在執(zhí)行讀操作時(shí),F(xiàn)IFO中沒(méi)有數(shù)據(jù)也一樣(此時(shí),讀操作返回0)。從FIFO中讀取數(shù)據(jù):如果沒(méi)有進(jìn)程寫(xiě)打開(kāi)FIFO,則設(shè)置了阻塞標(biāo)志的讀操作會(huì)阻塞。如果FIFO中有數(shù)據(jù),則設(shè)置了阻塞標(biāo)志的讀操作不會(huì)因?yàn)镕IFO中的字節(jié)數(shù)少于請(qǐng)求的字節(jié)數(shù)而阻塞,此時(shí),讀操作會(huì)返回FIFO中現(xiàn)有的數(shù)據(jù)量。向FIFO中寫(xiě)入數(shù)據(jù)(阻塞)當(dāng)要寫(xiě)入的數(shù)據(jù)量不大于PIPE_BUF時(shí),Linux將保證寫(xiě)入的原子性。如果此時(shí)管道空閑緩沖區(qū)不足以容納要寫(xiě)入的字節(jié)數(shù),則進(jìn)入睡眠,直到當(dāng)緩沖區(qū)中能夠容納要寫(xiě)入的字節(jié)數(shù)時(shí),才開(kāi)始進(jìn)行一次性寫(xiě)操作。即寫(xiě)入的數(shù)據(jù)長(zhǎng)度小于等于PIPE_BUF時(shí),那么或者寫(xiě)入全部字節(jié),或者一個(gè)字節(jié)都不寫(xiě)入。當(dāng)要寫(xiě)入的數(shù)據(jù)量大于PIPE_BUF時(shí),Linux將不再保證寫(xiě)入的原子性。FIFO緩沖區(qū)一有空閑區(qū)域,寫(xiě)進(jìn)程就會(huì)試圖向管道寫(xiě)入數(shù)據(jù),寫(xiě)操作在寫(xiě)完所有請(qǐng)求寫(xiě)的數(shù)據(jù)后返回。向FIFO中寫(xiě)入數(shù)據(jù)(非阻塞)當(dāng)要寫(xiě)入的數(shù)據(jù)量不大于PIPE_BUF時(shí),Linux將保證寫(xiě)入的原子性。如果當(dāng)前FIFO空閑緩沖區(qū)能夠容納請(qǐng)求寫(xiě)入的字節(jié)數(shù),寫(xiě)完后成功返回;如果當(dāng)前FIFO空閑緩沖區(qū)不能夠容納請(qǐng)求寫(xiě)入的字節(jié)數(shù),則返回EAGAIN錯(cuò)誤,提醒以后再寫(xiě)。當(dāng)要寫(xiě)入的數(shù)據(jù)量大于PIPE_BUF時(shí),Linux將不再保證寫(xiě)入的原子性。在寫(xiě)滿所有FIFO空閑緩沖區(qū)后,寫(xiě)操作返回。系統(tǒng)調(diào)用mkfifointmkfifo(pathname,mode)pathname:FIFO文件名mode:權(quán)限說(shuō)明0666,所有用戶可讀可寫(xiě)返回值:正常0,失敗-1一旦創(chuàng)建了一個(gè)FIFO,就可用open打開(kāi)它,一般的文件訪問(wèn)函數(shù)(close、read、write等)都可用于FIFO,但lseek不可以(為什么?)FIFO例子include<sys/types.h>include<sys/stat.h>include<fcntl.h>main(){unlink(FIFO);mkfifo(FIFO,0666);if(fork()>0){chars[]=“hello!\n”;fd=open(FIFO,O_WRONLY);write(fd,s,sizeof(s));close(fd);}

else{fd=open(FIFO,O_RDONLY);read(fd,buffer,80);printf(“%s”,buffer);close(fd);}link(oldpathname,newpathname)oldpathname:已存在文件名;newpathname:待連接文件名;1.查目錄找到oldpathname(inode);2.查目錄找到newpathname的末級(jí)目錄;3.檢查操作合法性;4.Inode的i_nlink++;5.(name,i_number)newpathname的末級(jí)目錄。UNIX:建立連接(給文件起別名)例子:link(“d1/d2/f1”,“d1/d3/f2”)d1,d2,f1:存在;d1,d3:存在,f2:不存在;假定f1的i_number=15,執(zhí)行后在d3中增加目錄項(xiàng)(f2,15).UNIX:建立連接(Cont.)unlink(pathname)pathname:文件路徑名;1.查目錄找到pathname(inode);2.i_nlink--;如結(jié)果為0,釋放所有磁盤(pán)塊(刪除文件);3.清除末級(jí)文件名在末級(jí)目錄中的登記。例子:unlink(“d1/d2/f1”)

假定:f1文件號(hào)i_number=15;

操作后:f1的i_nlink--,d2中原(f1,15)改為(f1,-1)UNIX:斷開(kāi)連接(撤銷文件)mknode(pathname,typeandpermissions,dev)pathname:節(jié)點(diǎn)名;typeandpermissions:節(jié)點(diǎn)類型和訪問(wèn)權(quán)限;dev:主次設(shè)備號(hào);功能:創(chuàng)建特殊文件.1.如非特權(quán)用戶,失敗;2.建立一個(gè)i_node,初始化(i_mode=typeandpermission;i_addr[0]=dev);3.填寫(xiě)目錄項(xiàng)。UNIX:建立節(jié)點(diǎn)(特殊文件)structmount{intm_dev;structbuf*m_bufp;//超級(jí)塊

structinode*m_inodep;}mount[NMOUNT];#defineNMOUNT5devrootrk05makenode創(chuàng)建mntd01安裝:smount(“/dev/rk05”,“/mnt/d01”,0)卸載:sumount(“/dev/rk05”)i_flag=|IMOUNTbit:1514131211109876543210SetgidSetuid大文件00普通01字符10目錄11塊型i_mode:i_flag:ILOCKIUPDIACCIMOUNTIWANTITEXT執(zhí)行該文件進(jìn)程的身份暫時(shí)改為文件主的身份即:u_uid=i_uid;u_gid=i_gid文件主權(quán)限同組用戶權(quán)限其他用戶權(quán)限smount(special_pathname,directory_pathname,roflag)special_pathname:特殊文件名directory_pathname:目錄文件名(安裝節(jié)點(diǎn))roflag:只讀標(biāo)志1.檢查是否超級(jí)用戶;2.找到special_pathname文件的inode(用mknode建立);3.合法性檢查(特殊塊型文件);4.找到directory_pathname節(jié)點(diǎn)的inode;UNIX:文件卷安裝5.如非目錄或引用數(shù)大于1,錯(cuò)返;6.安裝節(jié)點(diǎn)inode的i_addr[0]=設(shè)備文件i_addr[0];(dev)7.讀入superblock到buf,按filesys格式解釋.8.分配一個(gè)mount表項(xiàng),填寫(xiě)(m_dev,m_bufp,m_inodep),9安裝節(jié)點(diǎn)inode的i_flag=|IMOUNT.UNIX:文件卷安裝(Cont.)smount(“/dev/disk1”,“/mnt/d01”,0)安裝之前:

disk1只能作為特殊文件(塊序列文件)訪問(wèn)(rawIO);安裝之后:

d1成為disk1文件卷的根目錄。

disk1的superblock讀入內(nèi)存緩沖區(qū)中,按filesys格式解釋,根目錄inode讀入內(nèi)存inode區(qū)中;

內(nèi)存中inode區(qū)是所有安裝文件卷共用的,因而在內(nèi)存inode中有i_dev指明inode對(duì)應(yīng)的卷,用于回寫(xiě)。UNIX:文件卷安裝的例子sumount(special_file_name)special_file_name:待卸下卷的特殊文件名;1.查目錄找到inode,取dev(i_addr[0]);2.解除對(duì)特殊文件的inode互斥;3.由dev查mount表(m_dev)找到對(duì)應(yīng)superblock;4.系統(tǒng)緩沖區(qū)延遲寫(xiě)塊寫(xiě)回;5.該卷所有更新i_node寫(xiě)回;6.superblock寫(xiě)回;UNIX:文件卷拆卸釋放superblock所占用的緩沖區(qū);由m_inodep找到安裝節(jié)點(diǎn)的inode;安裝節(jié)點(diǎn)i_flag=&~IMOUNT;釋放mount表項(xiàng)。chdir(pathname)pathname:目錄路徑名;查目錄找到pathname的i_number;用i_number查inode表查到:權(quán)限檢查,如合法:i_count++;否則:inode讀到內(nèi)存,權(quán)限檢查,如合法,裝入內(nèi)存inode表,i_count=1;

u_cdir當(dāng)前所指inode的i_count--,如為0且修改過(guò),寫(xiě)回外存;新inode入口u_cdir修改當(dāng)前目錄chown(pathname,owner,group)pathname:文件路徑名owner:新文件主group:新文件組1.查目錄找到文件(inode);2.權(quán)限檢查(文件主,特權(quán)用戶);3.更新owner和group(i_uid,i_gid);4.inode寫(xiě)回。修改文件所有者chmode(pathname,newmode)pathname:路徑名;newmode:新權(quán)限說(shuō)明;1.查目錄找到文件(inode);2.權(quán)限檢查(文件主,特權(quán)用戶);3.更新i_mode(=newmode);4.inode回寫(xiě)。修改文件modestate(pathname,statbuffer)pathname:文件路徑名;statbuffer:狀態(tài)緩沖區(qū);1.查目錄找到內(nèi)存inode;2.inode信息(所有者、大小、權(quán)限、屬性、鏈接數(shù)、

inode號(hào)、訪問(wèn)時(shí)間等)statbuffer;UNIX:取文件狀態(tài)(文件未打開(kāi))fstate(fd,statbuffer)1.由u_ofile[fd]找到file表;2.由file表找到i_node;3.i_node信息statbuffer;UNIX:取文件狀態(tài)(文件已打開(kāi))7.9日志結(jié)構(gòu)文件系統(tǒng)背景CPU速度越來(lái)越快內(nèi)存容量以接近指數(shù)級(jí)速度增長(zhǎng)磁盤(pán)容量,更大更便宜磁盤(pán)速度的提高卻相對(duì)較慢成為系統(tǒng)效率的瓶頸7.9日志結(jié)構(gòu)文件系統(tǒng)在UNIX系統(tǒng)中創(chuàng)建一個(gè)文件

(1)分配一個(gè)inode,并初始化,寫(xiě)盤(pán);(2)(文件名,文件號(hào))寫(xiě)入目錄中;

(3)目錄文件inode更新(增加一個(gè)目錄項(xiàng),長(zhǎng)度可能變化);

(4)寫(xiě)入文件內(nèi)容.小量寫(xiě)(smallwrite)一次寫(xiě)修改磁盤(pán)塊上的一小部分?jǐn)?shù)據(jù)假定一次寫(xiě)需要10ms尋道時(shí)間,4ms旋轉(zhuǎn)延遲,50μs讀寫(xiě),磁盤(pán)訪問(wèn)效率≈0.36%.延遲寫(xiě)發(fā)生故障給一致性帶來(lái)威脅LogStructuredFileSystem日志結(jié)構(gòu)文件系統(tǒng)UCBerkeley的研究人員提出一種全新的文件系統(tǒng)日志結(jié)構(gòu)文件系統(tǒng)LSFS將整個(gè)磁盤(pán)看做一個(gè)日志,周期性地追加新日志。寫(xiě)操作并非直接反映到磁盤(pán)上,而是被暫時(shí)存到內(nèi)存緩沖區(qū)中,其中包括新寫(xiě)的數(shù)據(jù),也包括更新數(shù)據(jù)。當(dāng)積累到一定規(guī)模時(shí),作為一個(gè)segment追加到日志的末尾。LSFS結(jié)構(gòu)圖segment1

segmentk

newsegment

………segment結(jié)構(gòu)

summary

Inodes,directories,datablocks

日志結(jié)構(gòu)文件系統(tǒng)Inodemap:Inode存儲(chǔ)位置不能由其編號(hào)確定,系統(tǒng)維持一個(gè)Inodemap,以實(shí)現(xiàn)i-number到磁盤(pán)inode的映射。清潔線程(cleaner)循環(huán)掃描磁盤(pán)并對(duì)segment進(jìn)行壓縮。Cleaner首先讀入第一個(gè)segment,舍棄過(guò)時(shí)內(nèi)容,仍有用的inode和數(shù)據(jù)塊與內(nèi)存當(dāng)前segment合并作為新的segment寫(xiě)回磁盤(pán),舊segment被標(biāo)記為空閑,然后順序處理下個(gè)segment.7.10內(nèi)存映射文件背景文件保存于外存,存取速度慢訪問(wèn)之前需要打開(kāi)每次訪問(wèn)需要經(jīng)過(guò)“打開(kāi)文件表”讀寫(xiě)需要經(jīng)過(guò)I/O傳輸緩沖可以提高速度,但首次訪問(wèn)需要I/O內(nèi)存容量增加,利用率不充分進(jìn)程虛擬空間大,只使用較小的一部分提示:將文件映射到內(nèi)存以訪問(wèn)內(nèi)存的方式訪問(wèn)文件Open,mmap,使用,mumap,closeP1頁(yè)表012345MemoryMappedFileBlock2Block0Block3Block1文件f1內(nèi)存空間mapunmapP2頁(yè)表0123Linux內(nèi)存映射文件1.將文件映射到內(nèi)存區(qū)域void*mmap(void*addr,size_tlen,intprot,intflag,intfd,off_toff);addr為映射區(qū)首地址,一般使用NULL,然后系統(tǒng)自動(dòng)分配一個(gè)合適地址len為映射的長(zhǎng)度,單位byteprot說(shuō)明映射區(qū)訪問(wèn)屬性:PROT_READ(讀)、PROT_WRITE(寫(xiě))、PROT_EXEC(執(zhí)行)flag為MAP_SHARED表示映射文件共享,MAP_P

溫馨提示

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