操作系統(tǒng)課件:07第七章 -文件系統(tǒng)1_第1頁
操作系統(tǒng)課件:07第七章 -文件系統(tǒng)1_第2頁
操作系統(tǒng)課件:07第七章 -文件系統(tǒng)1_第3頁
操作系統(tǒng)課件:07第七章 -文件系統(tǒng)1_第4頁
操作系統(tǒng)課件:07第七章 -文件系統(tǒng)1_第5頁
已閱讀5頁,還剩107頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第七章 文件系統(tǒng)7.1 文件與文件系統(tǒng)文件具有符號名而且在邏輯上具有完整意義的信息項的序列。文件系統(tǒng)文件與管理文件的程序集合。 信息項 信息項 信息項 信息項讀(寫)指針 UNIX文件分類普通文件內(nèi)容可以是程序、數(shù)據(jù)、圖象、MP3等,保存在磁盤塊中目錄文件(文件名,文件號)序列,保存在磁盤塊中特殊文件設(shè)備設(shè)備作為文件管理的好處界面統(tǒng)一,使用文件與使用設(shè)備命令相同,申請設(shè)備open, 釋放close, 讀read, 寫write利用文件保護功能可以保護設(shè)備7.2 文件的訪問方式順序訪問從文件起始位置開始順序訪問從文件中間某處開始順序訪問隨機訪問按記錄編號隨機訪問按關(guān)鍵字(key)隨機訪問7.3

2、文件的組織邏輯組織用戶看到的文件組織形式記錄式文件:記錄的序列等長記錄(優(yōu)點:處理方便,速度快;缺點:空間浪費)不等長記錄(優(yōu)點:省空間;缺點:處理不便,速度慢)流式文件:字節(jié)的序列(UNIX, Windows, etc)物理組織邏輯組織到磁盤塊的映射文件:記錄(字節(jié))序列磁盤:塊(block)序列變換關(guān)系7.3.2 文件的物理組織考慮因素記錄格式等長或不等長, 流式不必考慮空間開銷除保存文件內(nèi)容之外的存儲開銷訪問速度隨機訪問速度長度變化動態(tài)增長順序結(jié)構(gòu): 一個文件占有若干連續(xù)的磁盤塊。優(yōu)點:速度快,節(jié)省空間缺點:長度變化困難塊18塊19塊20塊21塊22.磁盤空間首塊=18塊數(shù)=5.FCB鏈

3、接結(jié)構(gòu): 一文件可存于不連續(xù)塊中,塊間以指針相連。優(yōu)點:節(jié)省空間,長度變化容易。缺點:隨機訪問速度慢。塊18.塊80.塊92.磁盤空間首塊=18塊數(shù)=3. FCB索引結(jié)構(gòu): 一文件可存于不連續(xù)塊中,塊號記在索引塊中。優(yōu)點:速度快,長度變化容易。缺點:索引塊占空間。磁盤空間索引塊=29塊數(shù)=4. FCB塊18塊19.塊26.塊30.索引塊29Hash結(jié)構(gòu): 計算地址:hash(key)=addr (在磁盤或文件中的存放位置)問題:給定key1key2 hash(key1)=addr1; hash(key2)=addr2; addr1=addr2 (conflict)Conflict resolu

4、tion: 順序探查法:如發(fā)生沖突,則在沖突位置開始順序探查第一個空閑的存儲位置。.文件空間空閑標(biāo)志沖突記數(shù)記錄內(nèi)容空閑標(biāo)志沖突記數(shù)Hash(key)=addr起始位置計算addr=hash(key)對應(yīng)沖突記數(shù)加1本記錄空閑順取下一個標(biāo)記為占用填記錄內(nèi)容保存記錄:TF記錄內(nèi)容查找記錄:計算addr=hash(key)取addr對應(yīng)記錄的沖突記數(shù)countcount=0無此記錄本記錄空閑順取下一記錄key相等找到 hash(key)相等count:=count-1count=0無此記錄順取下一記錄TFFTTFTFTF刪除記錄:調(diào)用查找過程(key)找到錯誤返回置空閑標(biāo)志(找到記錄)沖突記數(shù)-1

5、對應(yīng)hash(key)特點:按關(guān)鍵字檢索速度非???。用途:常用于目錄檢索。注意:文件可循環(huán)使用,滿時保存失敗。FTUNIX文件物理結(jié)構(gòu)(索引+鏈接)i_addr0.i_addr9i_addr10i_addr11i_addr12.inode.最大=10+256+2562+2563(塊)7.4 文件目錄文件控制塊與目錄項文件控制塊(FCB)文件存在的標(biāo)志,其中保存系統(tǒng)管理文件需要的全部信息目錄項目錄文件中的一項,內(nèi)容為FCB文件目錄與目錄文件文件目錄用于檢索文件的目錄目錄文件內(nèi)容為目錄項的文件文件控制塊FCB(File Control Block)文件名文件號文件主文件類型文件屬性共享說明文件長度

6、文件地址建立日期最后修改日期最后訪問日期口令其它FCB創(chuàng)建:建立文件時FCB撤消:刪除文件時單級目錄(Single-Level Directory)A single directory for all users.缺點:Naming problemGrouping problemProtection problem兩級目錄(Two-Level Directory)Separate directory for each user.特點: 1. Path name2. Can have the same file name for different user3. Efficient search

7、ing4. No grouping capabilityrootbinusrlibdevetcunixlpccviusersLiWangd1d2f1consolepasswdbinyaccsf2多級目錄(Multi-Level Directory as in UNIX)clibflib文件目錄的查找查找路徑由根目錄開始查找由當(dāng)前目錄開始查找查找算法順序查找(UNIX)hash查找(Solo)對分查找(要求文件名排序)文件目錄的改進FCB次部:(文件名, 文件號) (UNIX 16 bytes)保存在目錄文件中主部:(其它, 鏈接記數(shù))(UNIX 32 bytes)保存在外存inode區(qū)域, 打

8、開時讀入內(nèi)存.改進的好處可以提高查找速度(順序查找)可以實現(xiàn)文件鏈接(link)UNIX文件卷(volume)組織形式: 0 1 2 k k+1 n-1導(dǎo)引塊超級塊 inode區(qū)域每塊16個inode, 從0起依次編號 文件存儲區(qū)域(普通文件,目錄文件)7.5 文件的共享共享目的節(jié)省存儲空間(cc,vi,yacc)進程相互通訊UNIX pipe()文件共享模式不同時使用根據(jù)共享說明同時使用根據(jù)共享說明和(relaxed)R/W規(guī)則文件的共享文件共享的實現(xiàn)公共目錄共享說明連接d1userswanglif1f2i_number=15f2 15f1 15link(“/usr/users/wang/d

9、1/f1”, “/usr/users/li/f2”)unlink(“/usr/users/wang/d1/f1”)usrroot7.6 文件的保護、保密與安全保護防止用戶對文件進行非授權(quán)的訪問保密防止文件內(nèi)容泄露安全防止文件被破壞自然因素人為因素7.6.1文件的保護(Protection)File owner/creator should be able to control:what can be doneby whomTypes of accessReadWriteExecuteAppendDeleteList1. 存取控制矩陣 f1 fj fnu1 a11. a1j . a1n .ui

10、ai1 aij . ain . um am1 . amj . amn R W E A M D aij:特點:權(quán)限規(guī)定細(xì),過于繁瑣,占較多存儲空間2. 訪問權(quán)限說明(UNIX)i_modeR W E R W E R W E文件主同組用戶其他用戶文件主判別:訪問進程u_uid=i_uid同組用戶判別:訪問進程u_gid=i_gidi_mode在創(chuàng)建文件時給出,creat(filename, mode)其后文件主可以修改:chmod(filename, new_mode)特權(quán)用戶7.6.2 文件保密口令使用創(chuàng)建文件時用戶規(guī)定一個口令,系統(tǒng)將其記在FCB中訪問文件要求給出口令,并與FCB中口令比較特點

11、簡單保密性不強(eg. 對系統(tǒng)操作員不保密)密碼特點對文件內(nèi)容加密,速度慢,效果好使用保存時加密(key)讀取時解密(key)保存時:用一個key啟動一個隨機數(shù)發(fā)生器,產(chǎn)生一個隨機數(shù)序列,將其依此加到文件的各個字中。讀取時:用同一個key啟動同一個隨機數(shù)發(fā)生器,產(chǎn)生相同隨機數(shù)序列,將其依次由文件的各個字中減去。線性同余法產(chǎn)生偽隨機數(shù): Procedure random(Var key:integer); Begin key:=(key*C1+C2)MOD C3 End;7.6.3 文件系統(tǒng)的安全Backup(備份)定期將磁盤上文件復(fù)制到磁帶上發(fā)生故障時由磁帶恢復(fù)(limited recover

12、y) 實現(xiàn)方法完全轉(zhuǎn)儲定期將磁盤上文件全部復(fù)制到磁帶上恢復(fù):最后一次轉(zhuǎn)儲磁帶優(yōu)點:恢復(fù)容易缺點:大量冗余增量轉(zhuǎn)儲(incremental backup)每次只復(fù)制上次轉(zhuǎn)儲以來修改部分恢復(fù):由初始轉(zhuǎn)儲磁帶起,利用第二次轉(zhuǎn)儲磁帶、第三次轉(zhuǎn)儲磁帶、最后一次轉(zhuǎn)儲磁帶,逐步恢復(fù)到最終版本優(yōu)點:每次轉(zhuǎn)儲數(shù)據(jù)少缺點:實現(xiàn)麻煩,某次轉(zhuǎn)儲磁帶發(fā)生問題將使恢復(fù)困難7.6.3 文件系統(tǒng)的安全差分轉(zhuǎn)儲(differential backup)開始進行一次完全轉(zhuǎn)儲以后每次備份當(dāng)天與開始第一次備份不同的數(shù)據(jù)恢復(fù):利用第一次轉(zhuǎn)儲磁帶和最后一次轉(zhuǎn)儲磁帶優(yōu)點:實現(xiàn)簡單,恢復(fù)容易磁盤整理利用轉(zhuǎn)儲和恢復(fù)可以對磁盤進行整理(使文件物

13、理塊連續(xù),空閑盤塊連續(xù))7.7 文件系統(tǒng)的實現(xiàn)7.7.1 內(nèi)存所需表目系統(tǒng)打開文件表(系統(tǒng)一個)FCB主部文件號共享計數(shù)修改標(biāo)志7.7 文件系統(tǒng)的實現(xiàn)7.7.1 內(nèi)存所需表目用戶打開文件表(每個進程一個)打開方式讀寫指針系統(tǒng)打開文件表入口文件描述符7.7 文件系統(tǒng)的實現(xiàn)打開方式讀寫指針系統(tǒng)打開文件表入口 打開方式讀寫指針系統(tǒng)打開文件表入口 FCB主部 文件號 共享計數(shù) 修改標(biāo)志 系統(tǒng)打開文件表2文件描述符文件描述符用戶打開文件表15外存空間的管理空閑塊表空閑塊鏈位示圖(bit map)Linux, 分給一個文件的磁盤塊連續(xù)UNIX:成組連接空閑塊管理(成組連接):100個空閑塊為一組,組之間相

14、互鏈接,最前面的組記在超級塊中,安裝后緩沖到內(nèi)存。s_nfree=66s_free0s_free1.s_free65.Super block .特點:速度快,空間省??臻e塊管理:申請時: (1) s_nfree1, 分配s_free-s_nfree所指的塊; (2) s_nfree=1, 將s_free0所指的連接塊讀入內(nèi)存緩沖區(qū), 前202字節(jié)復(fù)制到filesys,分配s_free0所指的塊.釋放時: (1) s_nfree1, 分配s_free-s_nfree所指的塊; (2) s_nfree=1, 將s_free0所指的連接塊讀入內(nèi)存緩沖區(qū), 前202字節(jié)復(fù)制到filesys,分配s_f

15、ree0所指的塊.釋放時: (1) s_nfree0, 取s_inode-s_ninode; (2) s_ninode=0, 由磁盤inode區(qū)順取100個空閑I節(jié)點(i_nlink=0) 將其編號填入s_inode表中,修改s_ninode,然后分配。釋放時: (1) s_ninode0轉(zhuǎn)6;4. 由f_inode找到對應(yīng)inode, f_inode指向空;5. i_count-, 如為0,i_flag標(biāo)志有修改,寫回外存inode區(qū);6. u_ofilefd=-1(空閑標(biāo)志)。seek(fd, whence, offset)fd: 文件描述符;whence: 相對位置(0,1,2,3,4,

16、5)=(頭,當(dāng)前位置,尾)offset: 移動量;1. 由u_ofilefd找到file表入口;2. 由f_inode找到內(nèi)存inode;3. 檢查參數(shù)合法性(i_size0, i_size1, f_offset, offset, whence);4. 按參數(shù)要求調(diào)整f_offset指針。nrd=read(fd,buf,count)fd: 文件描述符;buf: 進程空間接收區(qū)地址;count: 讀字節(jié)數(shù);1. 由u_ofilefd,找到file表對應(yīng)入口;2. 檢查訪問合法性(f_flag, READ);3. 由f_inode找到內(nèi)存inode入口;4. 由f_offset, count和i_

17、addr計算訪問磁盤塊號(可能多個塊) 和塊內(nèi)字節(jié); (bmap函數(shù));5. 若緩沖區(qū)有, 所需字節(jié)復(fù)制到進程空間由buf起始位置(iomove);6. 若緩沖區(qū)無, 申請空緩沖(可能多個), 緩沖區(qū)鏈入設(shè)備IO隊列,若設(shè)備空閑 啟動設(shè)備(切換進程), 緩沖區(qū)信息復(fù)制到進程空間(iomove);7. 返回實際傳輸字節(jié)數(shù)nrd。nwt=write(fd,buf,count)fd: 文件描述符;buf:進程空間發(fā)送地址;count: 寫字節(jié)數(shù);1. 由u_ofilefd,找到file表對應(yīng)入口;2. 檢查訪問合法性(f_flag, WRITE);3. 由f_inode找到內(nèi)存inode入口;4.

18、由f_offset, count和i_addr計算磁盤地址塊號(可能分配盤塊);5. 申請系統(tǒng)緩沖區(qū),將buf起始count字節(jié)送到緩沖區(qū)(可多次);6. 緩沖區(qū)鏈到設(shè)備IO鏈上, 如設(shè)備空閑啟動設(shè)備;7. 修改inode中文件長度i_size;8. 返回實際傳輸字節(jié)數(shù)nwt。pipe(fd)int fd2;1. 分配一個inode,(i_count=2);2. 分配2個file表目(f_flag分別為PipeR和PipeW,讀/寫指針 offset為0)3. 分配2個u_ofile表目, 分別指向2個file表目;4. 返回2個文件描述符fd0,fd1, 分別為u_ofile中的2個入口。

19、i_addr i_count (2) f_flag (R pipe)f_offsetf_inodepf_count (1)f_flag (W pipe)f_offsetf_inodepf_count (1)內(nèi)存inode表內(nèi)存file表fd0fd1u_ofile表進程執(zhí)行pipe(fd)之后 i_addr i_count (2) f_flag (R pipe)f_offsetf_inodepf_count (2)f_flag (W pipe)f_offsetf_inodepf_count (2)內(nèi)存inode表內(nèi)存file表fd0fd1u_ofile表fork創(chuàng)建子進程1之后fd0fd1父進程

20、:子進程1: i_addr i_count (2) f_flag (R pipe)f_offsetf_inodepf_count (3)f_flag (W pipe)f_offsetf_inodepf_count (3)內(nèi)存inode表內(nèi)存file表fd0fd1u_ofile表fork創(chuàng)建子進程2之后fd0fd1父進程:子進程1:子進程2:fd0fd1 i_addr i_count (2) f_flag (R pipe)f_offsetf_inodepf_count (2)f_flag (W pipe)f_offsetf_inodepf_count (2)內(nèi)存inode表內(nèi)存file表fd0f

21、d1u_ofile表父進程close(fd0),close(fd1)fd0fd1父進程:子進程1:子進程2:fd0fd1 i_addr i_count (2) f_flag (R pipe)f_offsetf_inodepf_count (2)f_flag (W pipe)f_offsetf_inodepf_count (1)內(nèi)存inode表內(nèi)存file表fd0fd1u_ofile表子進程1(讀者) : close(fd1)fd0fd1父進程:子進程1:子進程2:fd0fd1 i_addr i_count (2) f_flag (R pipe)f_offsetf_inodepf_count (

22、1)f_flag (W pipe)f_offsetf_inodepf_count (1)內(nèi)存inode表內(nèi)存file表fd0fd1u_ofile表子進程2(寫者) : close(fd0)fd0fd1父進程:子進程1:子進程2:fd0fd1 i_addr i_count (2) f_flag (R pipe)f_offsetf_inodepf_count (1)f_flag (W pipe)f_offsetf_inodepf_count (1)內(nèi)存inode表內(nèi)存file表u_ofile表子進程2(寫) : write(fd1,buf1,count1)子進程1(讀) : read(fd0,bu

23、f0,count0)父進程:子進程1:子進程2:fd0fd1fd0fd1fd0fd1write(fd1,)read(fd0,) 盤塊(有緩沖) i_addr i_count (1) f_flag (R pipe)f_offsetf_inodepf_count (1)f_flag (W pipe)f_offsetf_inodepf_count (0)內(nèi)存inode表內(nèi)存file表u_ofile表子進程2(寫完) :close(fd1)父進程:子進程1:子進程2:fd0fd1fd0fd1fd0fd1close(fd1)read(fd0,) 盤塊(有緩沖) i_addr i_count (0) f_

24、flag (R pipe)f_offsetf_inodepf_count (0)f_flag (W pipe)f_offsetf_inodepf_count (0)內(nèi)存inode表內(nèi)存file表u_ofile表子進程1(讀完) :close(fd0)父進程:子進程1:子進程2:fd0fd1fd0fd1fd0fd1close(fd1)close(fd0)Pipe文件同步與互斥pipe讀寫同步寫滿:寫者等待,讀出后喚醒讀空:讀者等待,寫入后喚醒讀寫關(guān)閉所有讀者關(guān)閉:寫時返回錯誤信號所有寫者關(guān)閉:讀者立即返回讀寫互斥i_flag|ILOCK管道通訊的局限性只有相關(guān)進程(同一家族進程)能通訊先創(chuàng)建管道

25、再創(chuàng)建子進程, 子進程繼承父進程打開的文件(包括管道文件)管道是沒有名字的文件所有進程都關(guān)閉后即被撤銷命名管道(FIFO)長久性通訊機構(gòu)具有文件名可被打開、讀寫、關(guān)閉和刪除任何進程都能找到它即使是不同祖先的進程,也可以利用命名管道進行通信。讀取和寫入遵循FIFO原則阻塞:管道讀: 假如沒有線程實行寫管道操作,讀線程將一直阻塞,直到有線程往里面寫為止;管道寫: 假如沒有線程實行讀操作,寫線程將一直阻塞,直到有線程讀數(shù)據(jù)為止。不阻塞:管道讀:假如沒有線程實行寫管道操作,讀線程將立即返回;管道寫:假如沒有線程實行讀操作,寫線程將立即返回,返回不正確碼-1。系統(tǒng)調(diào)用mkfifoint mkfifo(p

26、athname,mode)pathname:FIFO文件名mode: 權(quán)限說明0666, 所有用戶可讀可寫返回值:正常0, 失敗-1一旦創(chuàng)建了一個FIFO,就可用open打開它,一般的文件訪問函數(shù)(close、read、write等)都可用于FIFO,但lseek不可以(為什么?)FIFO例子include include include main() unlink(FIFO); mkfifo(FIFO, 0666); if(fork()0) char s=“hello!n”; fd=open(FIFO, O_WRONLY); write(fd, s, sizeof(s); close(fd)

27、; 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的末級目錄;3. 檢查操作合法性;4. Inode的i_nlink+;5. (name, i_number)newpathname的末級目錄。例子:link(“d1/d2/f1”,“d1/d3/f

28、2”)d1,d2,f1: 存在;d1,d3: 存在,f2: 不存在,unlink(pathname)pathname: 文件路徑名;1. 查目錄找到pathname(inode);2. i_nlink-; 如結(jié)果為0, 釋放所有磁盤塊 (刪除文件);3. 清除末級文件名在末級目錄中的登記。例子:unlink(“d1/d2/f1”) 假定:f1文件號i_number=15; 操作后:f1的i_nlink-, d2中原(f1, 15)改為(f1, -1)mknode(pathname, type and permissions, dev)pathname: 節(jié)點名;type and permiss

29、ions: 節(jié)點類型和訪問權(quán)限;dev: 主次設(shè)備號;功能: 創(chuàng)建特殊文件.1. 如非特權(quán)用戶,失??;2. 建立一個i_node, 初始化(i_mode=type and permission; i_addr0=dev);3. 填寫目錄項。struct mount int m_dev; struct buf *m_bufp; /超級塊 struct inode *m_inodep;mountNMOUNT;#define NMOUNT 5devrootrk05makenode創(chuàng)建usrLid01安裝: smount(“/dev/rk05”, “/usr/Li/d01”, 0)卸下: sumoun

30、t(“/dev/rk05”)i_flag =| IMOUNTbit: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Set gidSet uid大文件00普通01字符10目錄11塊型i_mode: i_flag:ILOCKIUPDIACCIMOUNTIWANTITEXT執(zhí)行該文件進程的身份暫時改為文件主的身份即: u_uid = i_uid; u_gid = i_gid文件主權(quán)限同組用戶權(quán)限其他用戶權(quán)限smount(special_pathname, directory_pathname, roflag)special_pathname: 特殊文件名directo

31、ry_pathname: 目錄文件名(安裝節(jié)點)roflag: 只讀標(biāo)志1. 檢查是否超級用戶;2. 找到special_pathname文件的inode(用mknode建立);3. 合法性檢查(特殊塊型文件);4. 找到directory_pathname節(jié)點的inode;5. 如非目錄或引用數(shù)大于,錯返;6. 安裝節(jié)點inode的i_addr0=設(shè)備文件i_addr0; (dev) 7. 讀入super block到buf,按filesys格式解釋.8. 分配一個mount表項,填寫(m_dev,m_bufp,m_inodep),9 安裝節(jié)點inode的i_flag =| IMOUNT.例

32、子:smount(“/dev/disk1”,“/usr/d1”,0)安裝之前: disk1只能作為特殊文件(塊序列文件)訪問(raw IO);安裝之后: d1成為disk1文件卷的根目錄。 disk1的super block讀入內(nèi)存緩沖區(qū)中,按filesys格式解釋,根目錄inode讀入內(nèi)存inode區(qū)中; 內(nèi)存中inode區(qū)是所有安裝文件卷共用的,因而在內(nèi)存inode中有i_dev指明inode對應(yīng)的卷,用于回寫。sumount(special_file_name)special_file_name: 待卸下卷的特殊文件名;1. 查目錄找到inode,取dev(i_addr0);2. 釋放特

33、殊文件的inode;3. 由dev查mount表(m_dev)找到對應(yīng)super block;4. 系統(tǒng)緩沖區(qū)延遲寫塊寫回;5. 該卷所有更新i_node寫回;6. super block寫回;7. 釋放super block所占用的緩沖區(qū);8. 由m_inodep找到安裝節(jié)點的inode;9. 安裝節(jié)點i_flag =& IMOUNT;10. 釋放mount表項。chdir(pathname)pathname: 目錄路徑名;查目錄找到pathname的inode; (不在內(nèi)存讀入,i_count=1;已在內(nèi)存i_count+);2. 檢查權(quán)限;3. u_cdir當(dāng)前所指inode的i_cou

34、nt-, 如為0且修改過,寫回外存;4. 新inode入口u_cdirchown(pathname,owner, group)pathname: 文件路徑名owner: 新文件主group: 新文件組1. 查目錄找到文件(inode);2. 權(quán)限檢查(文件主,特權(quán)用戶);3. 更新owner和group(i_uid, i_gid);4. inode寫回。chmode(pathname, newmode)pathname: 路徑名;newmode: 新權(quán)限說明;1. 查目錄找到文件(inode);2. 權(quán)限檢查(文件主,特權(quán)用戶);3. 更新i_mode(=newmode);4. inode回寫

35、。state(pathname, statbuffer)pathname: 文件路徑名;statbuffer: 狀態(tài)緩沖區(qū);1. 查目錄找到內(nèi)存inode;2. inode信息(所有者、大小、權(quán)限、屬性、鏈接數(shù)、 inode號、訪問時間等)statbuffer;fstate(fd, statbuffer)1. 由u_ofilefd找到file表;2. 由file表找到i_node;3. i_node信息statbuffer;7.9日志結(jié)構(gòu)文件系統(tǒng)背景CPU速度越來越快內(nèi)存容量以接近指數(shù)級速度增長磁盤容量, 更大更便宜磁盤速度的提高卻相對較慢 成為系統(tǒng)效率的瓶頸 7.9日志結(jié)構(gòu)文件系統(tǒng)在UNIX

36、系統(tǒng)中創(chuàng)建一個文件 (1)(文件名,文件號)寫入目錄中; (2)新文件inode更新; (3)目錄文件inode更新(長度變化); (4)寫入文件內(nèi)容.小量寫(small write)一次寫修改磁盤塊上的一小部分?jǐn)?shù)據(jù)假定一次寫需要10ms尋道時間, 4ms旋轉(zhuǎn)延遲, 50s讀寫,磁盤訪問效率0.36%.延遲寫發(fā)生故障給一致性帶來威脅Log Structured File System日志結(jié)構(gòu)文件系統(tǒng)UC Berkeley的研究人員提出 一種全新的文件系統(tǒng)日志結(jié)構(gòu)文件系統(tǒng)LSFS將整個磁盤看做一個日志,周期性地追加新日志。寫操作并非直接反映到磁盤上,而是被暫時存到內(nèi)存緩沖區(qū)中,其中包括新寫的數(shù)據(jù)

37、,也包括更新數(shù)據(jù)。當(dāng)積累到一定規(guī)模時,作為一個segment追加到日志的末尾。LSFS結(jié)構(gòu)圖segment1 segmentk new segment segment結(jié)構(gòu) summary Inodes, directories, data blocks 日志結(jié)構(gòu)文件系統(tǒng)Inode map:Inode存儲位置不能由其編號確定,系統(tǒng)維持一個Inode map,以實現(xiàn)i-number到磁盤inode的映射。清潔線程(cleaner)循環(huán)掃描磁盤并對segment進行壓縮。Cleaner 首先讀入第一個segment,舍棄過時內(nèi)容,仍有用的inode和數(shù)據(jù)塊與內(nèi)存當(dāng)前segment合并作為新的segm

38、ent寫回磁盤,舊segment被標(biāo)記為空閑,然后順序處理下個segment.7.10 內(nèi)存映射文件背景文件保存于外存,存取速度慢訪問之前需要打開每次訪問需要經(jīng)過“打開文件表”讀寫需要經(jīng)過I/O傳輸緩沖可以提高速度,但首次訪問需要I/O內(nèi)存容量增加,利用率不充分進程虛擬空間大,只使用較小的一部分提示:將文件映射到內(nèi)存以訪問內(nèi)存的方式訪問文件Open, mmap, 使用, mumap, closeP1頁表012345Memory Mapped FileBlock 2Block 0Block 3Block 1文件f1內(nèi)存空間mapunmapP2 頁表0123Linux內(nèi)存映射文件1將文件映射到內(nèi)存

39、區(qū)域void *mmap(void *addr, size_t len, int prot, int flag, int fd, off_t off);addr為映射區(qū)首地址,一般使用NULL,然后系統(tǒng)自動分配一個合適地址len為映射的長度,單位byteprot說明映射區(qū)訪問屬性: PROT_READ(讀)、PROT_WRITE(寫)、 PROT_EXEC(執(zhí)行)flag為MAP_SHARED 表示映射文件共享,MAP_PRIVATE 表示映射文件不共享fd為打開文件返回的文件描述符off為映射位置的偏移量,設(shè)置為0的話,就映射文件的0-len個字節(jié)返回值為映射到內(nèi)存空間的首地址Linux內(nèi)存

40、映射文件2. 取消文件映射int munmap(caddr_t addr,size_t len);addr為內(nèi)存映射的地址,即mmap返回的地址len為映射的字節(jié)數(shù)。成功返回0,失敗返回負(fù)數(shù)。Linux內(nèi)存映射文件3. 內(nèi)存映射與文件同步int msync(void *addr, size_t len, int flags);addr為內(nèi)存映射地址len為長度flags為 MS_ASYNC, MS_SYNCMS_ASYNC:異步寫,調(diào)用后就返回不等待寫完MS_SYNC:等待寫完后才返回成功返回0,失敗為負(fù)。內(nèi)存映射文件例子將一個文本文件映射到內(nèi)存。將所有小寫字母改變?yōu)榇髮懽帜?。將其寫回該文件?/p>

41、內(nèi)存映射文件例子打開文件。利用系統(tǒng)調(diào)用mmap()將文件映射到內(nèi)存。掃描內(nèi)存映射區(qū),將所有小寫字母改變?yōu)閷?yīng)的大寫字母。調(diào)用msync將內(nèi)存映射區(qū)內(nèi)容回寫到文件調(diào)用系統(tǒng)調(diào)用munmap解除對源文件的內(nèi)存映射。關(guān)閉文件。內(nèi)存映射文件例子#include / for mmap and munmap#include #include #include #include #include 內(nèi)存映射文件例子int main() int fd;char *mapped_mem, *p;int flength;void *start_addr = 0; fd = open(“source.txt”, O_RDWR);flength = lseek(fd1, 0, SEEK_END);write(fd0, “0”, 1)

溫馨提示

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

評論

0/150

提交評論