版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第七章 文件系統(tǒng),7.1 文件與文件系統(tǒng)文件具有符號名而且在邏輯上具有完整意義的信息項的序列。文件系統(tǒng)文件與管理文件的程序集合。,UNIX文件分類,普通文件內(nèi)容可以是程序、數(shù)據(jù)、圖象、MP3等,保存在磁盤塊中目錄文件(文件名,文件號)序列,保存在磁盤塊中特殊文件設備設備作為文件管理的好處界面統(tǒng)一,使用文件與使用設備命令相同,申請設備open, 釋放close, 讀read, 寫write利用文件保護
2、功能可以保護設備,7.2 文件的訪問方式,順序訪問從文件起始位置開始順序訪問從文件中間某處開始順序訪問隨機訪問按記錄編號隨機訪問按關(guān)鍵字(key)隨機訪問,7.3 文件的組織,邏輯組織用戶看到的文件組織形式記錄式文件:記錄的序列等長記錄(優(yōu)點:處理方便,速度快;缺點:空間浪費)不等長記錄(優(yōu)點:省空間;缺點:處理不便,速度慢)流式文件:字節(jié)的序列(UNIX, Windows, etc)物理組織邏輯組織到磁盤塊的映
3、射文件:記錄(字節(jié))序列磁盤:塊(block)序列,,變換關(guān)系,7.3.2 文件的物理組織,考慮因素記錄格式等長或不等長, 流式不必考慮空間開銷除保存文件內(nèi)容之外的存儲開銷訪問速度隨機訪問速度長度變化動態(tài)增長,順序結(jié)構(gòu): 一個文件占有若干連續(xù)的磁盤塊。優(yōu)點:速度快,節(jié)省空間缺點:長度變化困難,鏈接結(jié)構(gòu): 一文件可存于不連續(xù)塊中,塊間以指針相連。優(yōu)點:節(jié)省空間,長度變化容易。缺點
4、:隨機訪問速度慢。,,,,,,索引結(jié)構(gòu): 一文件可存于不連續(xù)塊中,塊號記在索引塊中。優(yōu)點:速度快,長度變化容易。缺點:索引塊占空間。,磁盤空間,…索引塊=29塊數(shù)=4...,FCB,,,,,,,索引塊29,Hash結(jié)構(gòu): 計算地址:hash(key)=addr (在磁盤或文件中的存放位置)問題:給定key1?key2 hash(key1)=addr1;
5、 hash(key2)=addr2; addr1=addr2 (conflict)Conflict resolution: 順序探查法:如發(fā)生沖突,則在沖突位置開始順序探查第一個空閑的存儲位置。,,,...,...,文件空間,,,Hash(key)=addr,,起始位置,計算addr=hash(key),對應沖突記數(shù)加1,本記錄空閑,順取下一個,標記為占用填記錄內(nèi)容,,保存記錄:,,,,,T,F,
6、,記錄內(nèi)容,查找記錄:,計算addr=hash(key),取addr對應記錄的沖突記數(shù)?count,count=0,無此記錄,本記錄空閑,順取下一記錄,key相等,找到,hash(key)相等,count:=count-1,count=0,無此記錄,順取下一記錄,,,,,,,,,,,,,,,,T,F,F,T,T,F,T,F,T,F,,刪除記錄:,調(diào)用查找過程(key),找到,錯誤返回,置空閑標志(找到記錄)沖突記數(shù)-1對應has
7、h(key),,,,,,特點:按關(guān)鍵字檢索速度非???。用途:常用于目錄檢索。注意:文件可循環(huán)使用,滿時保存失敗。,F,T,UNIX文件物理結(jié)構(gòu)(索引+鏈接),…i_addr[0]...i_addr[9]i_addr[10]i_addr[11]i_addr[12]...,inode,,,,...,,,,,,,,,...,,,,,,,,...,...,...,,,,,,,,,,,...,,,,,...,,,最大=
8、10+256+2562+2563(塊),7.4 文件目錄,文件控制塊與目錄項文件控制塊(FCB)文件存在的標志,其中保存系統(tǒng)管理文件需要的全部信息目錄項目錄文件中的一項,內(nèi)容為FCB文件目錄與目錄文件文件目錄用于檢索文件的目錄目錄文件內(nèi)容為目錄項的文件,文件控制塊FCB(File Control Block),文件名文件號文件主文件類型文件屬性共享說明文件長度文件地址建立日期最后修改日期最后訪問日期
9、口令其它,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. Pa
10、th name2. Can have the same file name for different user3. Efficient searching4. No grouping capability,,root,,,,,,bin,usr,lib,dev,etc,,,,unix,,,,,,,lp,,cc,vi,,,,,users,,,,Li,Wang,,,,,d1,d2,f1,,,,,,,console,,,passw
11、d,,bin,,,yacc,,,s,,,f2,多級目錄(Multi-Level Directory as in UNIX),,,clib,flib,,,文件目錄的查找,查找路徑由根目錄開始查找由當前目錄開始查找查找算法順序查找(UNIX)hash查找(Solo)對分查找(要求文件名排序),文件目錄的改進,FCB次部:(文件名, 文件號) (UNIX 16 bytes)保存在目錄文件中主部:(其它, 鏈接記數(shù))(UN
12、IX 32 bytes)保存在外存inode區(qū)域, 打開時讀入內(nèi)存.改進的好處可以提高查找速度(順序查找)可以實現(xiàn)文件鏈接(link),UNIX文件卷(volume)組織形式:,7.5 文件的共享,共享目的節(jié)省存儲空間(cc,vi,yacc)進程相互通訊UNIX pipe()文件共享模式不同時使用根據(jù)共享說明同時使用根據(jù)共享說明和(relaxed)R/W規(guī)則,文件的共享,文件共享的實現(xiàn)公共目錄共享說明連接
13、,d1,link(“/usr/users/wang/d1/f1”, “/usr/users/li/f2”)unlink(“/usr/users/wang/d1/f1”),,usr,,,,root,7.6 文件的保護、保密與安全,保護防止用戶對文件進行非授權(quán)的訪問保密防止文件內(nèi)容泄露安全防止文件被破壞自然因素人為因素,,,7.6.1文件的保護(Protection),File owner/creator s
14、hould be able to control:what can be doneby whomTypes of accessReadWriteExecuteAppendDeleteList,1. 存取控制矩陣,aij:,特點:權(quán)限規(guī)定細,過于繁瑣,占較多存儲空間,2. 訪問權(quán)限說明(UNIX)i_mode,,R W E R W E R W E,,,,,,,,,,,,文件主,同組用戶,其他用戶,文件主
15、判別:訪問進程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中口令比較特點簡單保密性不強(eg. 對系統(tǒng)操作員不保密)密碼特點
16、對文件內(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:=(ke
17、y*C1+C2)MOD C3 End;,7.6.3 文件系統(tǒng)的安全,Backup(備份)定期將磁盤上文件復制到磁帶上發(fā)生故障時由磁帶恢復(limited recovery) 實現(xiàn)方法完全轉(zhuǎn)儲定期將磁盤上文件全部復制到磁帶上恢復:最后一次轉(zhuǎn)儲磁帶優(yōu)點:恢復容易缺點:大量冗余增量轉(zhuǎn)儲(incremental backup)每次只復制上次轉(zhuǎn)儲以來修改部分恢復:由初始轉(zhuǎn)儲磁帶起,利用第二次轉(zhuǎn)儲磁帶、第三次轉(zhuǎn)儲磁帶、
18、…、最后一次轉(zhuǎn)儲磁帶,逐步恢復到最終版本優(yōu)點:每次轉(zhuǎn)儲數(shù)據(jù)少缺點:實現(xiàn)麻煩,某次轉(zhuǎn)儲磁帶發(fā)生問題將使恢復困難,7.6.3 文件系統(tǒng)的安全,差分轉(zhuǎn)儲(differential backup)開始進行一次完全轉(zhuǎn)儲以后每次備份當天與開始第一次備份不同的數(shù)據(jù)恢復:利用第一次轉(zhuǎn)儲磁帶和最后一次轉(zhuǎn)儲磁帶優(yōu)點:實現(xiàn)簡單,恢復容易磁盤整理利用轉(zhuǎn)儲和恢復可以對磁盤進行整理(使文件物理塊連續(xù),空閑盤塊連續(xù)),7.7 文件系統(tǒng)的實現(xiàn),7.7.
19、1 內(nèi)存所需表目系統(tǒng)打開文件表(系統(tǒng)一個),7.7 文件系統(tǒng)的實現(xiàn),7.7.1 內(nèi)存所需表目用戶打開文件表(每個進程一個),文件描述符,7.7 文件系統(tǒng)的實現(xiàn),FCB主部 文件號 共享計數(shù) 修改標志,,,,,系統(tǒng)打開文件表,,,2,…,文件描述符,文件描述符,,,,用戶打開文件表,15,…,外存空間的管理,空閑塊表空閑塊鏈位示圖(bit map)Linux, 分給一個文件的磁盤塊連續(xù)UNIX:成組連接,空閑塊管理(成組連
20、接):100個空閑塊為一組,組之間相互鏈接,最前面的組記在超級塊中,安裝后緩沖到內(nèi)存。,,,...,...,...,...,特點:速度快,空間省。,空閑塊管理:申請時: (1) s_nfree>1, 分配s_free[--s_nfree]所指的塊; (2) s_nfree=1, 將s_free[0]所指的連接塊讀入內(nèi)存緩沖區(qū), 前202字節(jié)復制到filesys,分配s_free[0]所指的塊.釋放時:
21、 (1) s_nfree<100, s_free[s_nfree++]=釋放塊號; (2) s_nfree=100, 將s_nfree和s_free拷貝到釋放塊中,寫回外存, s_free[0]=釋放塊號, s_nfree=1.,7.8 文件系統(tǒng)的界面,創(chuàng)建文件命令形式:creat(path_name, fcb_args)參數(shù)說明Path_name: 文件路徑名Fcb_args: FCB參數(shù)執(zhí)行步驟:(1
22、) 為此文件分配一個FCB主部,初始化(文件主、共享說明、創(chuàng)建時間、長度等)(2) 將文件名和文件號作為FCB次部填到末級目錄中(3) 以寫方式打開例如: creat(“/usr/li/d1/f1”, mode),7.8 文件系統(tǒng)的界面,打開文件命令形式: fd=open(path_name, mode)參數(shù)說明path_name: 文件路徑名;mode: 打開方式.執(zhí)行步驟(1) 根據(jù)文件路徑名查目錄找到文件號,和F
23、CB主部;(2) 合法性檢查(根據(jù)打開方式、共享說明、用戶身份);(3) 根據(jù)文件號查系統(tǒng)打開文件表看該文件是否已被打開, 如是共享計數(shù)加1; 否則取一個空閑的系統(tǒng)打開文件表項并將外存中 FCB主部等信息填入此表項, 共享計數(shù)置為1;(4) 在用戶打開文件表中取一空表項, 填寫打開方式和讀寫指針, 并指向系統(tǒng)打開文件表的對應表項.返回信息: fd: 文件描述符(在用戶打開文件表中的入口), 它是一個非負整數(shù).,7.8 文件系統(tǒng)的
24、界面,關(guān)閉文件命令形式: close(fd)參數(shù)說明 fd: 文件描述符.執(zhí)行步驟: (1) 由fd查用戶打開文件表, 找到系統(tǒng)打開文件表入口; (2) 系統(tǒng)打開文件表中共享計數(shù)減1, 如減1后的值為0且修改標志為1, 則將此FCB 由內(nèi)存寫回外存FCB主部; (3) 將fd所對應的用戶打開文件表項置為空閑.,7.8 文件系統(tǒng)的界面,指針定位命令形式: seek(fd,offset)參數(shù)說明:fd: 文件描述符;o
25、ffset: 新的指針位置.執(zhí)行步驟:(1) 由fd查用戶打開文件表, 得系統(tǒng)打開文件表入口;(2) 查系統(tǒng)打開文件表, 得文件長度;(2) 檢查參數(shù)合法性;(3) 將用戶打開文件表中文件讀寫指針位置設定為offset, 后繼讀寫命令由該指針處存取文件內(nèi)容.,7.8 文件系統(tǒng)的界面,讀文件命令形式: read(fd,nrd,buf) 參數(shù)說明:fd: 文件描述符;nrd: 讀入記錄個數(shù);buf: 內(nèi)存起始位置. 步
26、驟:(1) 由fd查用戶打開文件表, 找到對應的入口;(2) 合法性檢查(用戶打開文件表中所記錄的打開方式、存取方式);(3) 查系統(tǒng)打開文件表, 找到文件的地址;(4) 根據(jù)邏輯地址(offset)和物理結(jié)構(gòu)計算物理地址;(5) 如在緩沖區(qū)中; 所需字節(jié)復制到進程空間buf起始位置; (6) 否則申請緩沖區(qū)(可能多個), 鏈入設備IO隊列, 若設備空閑啟動設備, 等待IO傳輸完成(切換進程), 所需字節(jié)復制到進程空間buf
27、起始的位置.,7.8 文件系統(tǒng)的界面,寫文件命令形式: write(fd,nwt,buf)參數(shù)含義: fd: 文件描述符;nwt: 寫出記錄個數(shù);buf: 內(nèi)存起始位置. 執(zhí)行步驟: (1) 由fd查用戶打開文件表, 找到對應的入口;(2) 合法性檢查(用戶打開文件表中所記錄的打開方式、存取方式);(3) 查系統(tǒng)打開文件表, 找到文件的地址;(4) 根據(jù)邏輯地址(offset)和物理結(jié)構(gòu)計算物理地址;(5) 如果需
28、要, 分配磁盤塊;(6) 將內(nèi)存中由buf起始的nwt個記錄復制到緩沖區(qū)中(可能多個), 緩沖區(qū)鏈入磁盤IO隊列, 如設備空閑啟動設備.,7.8 文件系統(tǒng)的界面,建立連接命令形式: link(old_name,new_name)參數(shù)含義: old_name: 已存在的文件路徑名;new_name: 欲連接的文件路徑名.執(zhí)行步驟: (1) 查目錄找到文件old_name的FCB主部, 由此得到文件號;(2) 查目錄找到文件
29、new_name的末級目錄;(3) 將文件號與new_name中末級名字合起來構(gòu)成一個新的目錄項, 將其填入new_name的末級目錄文件中;(4) 將FCB主部中的連接計數(shù)加1.如: link(“/usr/Li/f1”, “/usr/Zhang/d2/f2”),7.8 文件系統(tǒng)的界面,斷開連接 命令形式: unlink(path_name) 參數(shù)含義: path_name: 文件路徑名. 執(zhí)行步驟:(1) 查目錄找到文
30、件path_name的FCB主部;(2) 將連接計數(shù)i_nlink減1;(3) 如減1后的值為0, 則歸還該文件所占用的全部存儲塊, 該文件將被撤銷;(4) 將FCB次部由上級目錄中清除.,如: unlink(“/usr/Zhang/d2/f2”),UNIX文件系統(tǒng)的實現(xiàn),內(nèi)存所需表目(UNIX)用戶打開文件表u_ofile (每個進程一個)file (整個系統(tǒng)一個)系統(tǒng)打開文件表Inode (整個系統(tǒng)一個)外存空間的
31、管理空閑塊表位示圖(bit map, Linux)成組連接 (UNIX approach),1. u_ofile (每進程一個)struct user{ … int u_ofile[NOFILE]; …}#define NOFILE 15,2. file (系統(tǒng)一個)struct file{ char f_flag; //R,W,PIPE char f_count;
32、 int f_inode; char *f_offset[2]; //讀寫指針}file[NFILE]#define NFILE 100,UNIX內(nèi)存表目:,UNIX系統(tǒng)的FCB,struct inode(外存) { int i_mode; char i_nlink; char i_uid; char i_gid; char i_size0;
33、 char *i_size1; int i_addr[8]; int i_atime[2]; int i_mtime[2];},struct inode (內(nèi)存) { int i_flag; char i_count; char i_dev; char i_number; char i_mode;
34、 char i_nlink; char i_uid; char i_gid; char i_size0; char *i_size1; int i_addr[8]; int i_lastr;}inode[NINODE];,表間聯(lián)系:u_ofile ? file (n) (1)file ? inode (n)
35、 (1),,write(4,…),write(4,…)…read(2,…),用戶空間,u_ofile,u_ofile,,,,,file,inode,,磁盤空間,系統(tǒng)空間,,,...,,數(shù)據(jù)塊,……...,i_list,,,,,,,,,,,,,,,,,,,,,,,,表間聯(lián)系,UNIX外存空間管理:,超級塊(super block): (1) 記載文件卷上k+1塊到n-1塊中所有空閑塊, (2
36、) inode區(qū)中100個空閑inode. (緩存) 文件安裝(mount)后超級塊讀入內(nèi)存。注:占用區(qū)域已經(jīng)記載在各個文件的inode中。,Struct filesys { int s_isize; //size in blocks of i list int s_fsize; //size in blocks of entire volume int s_nfree; //
37、number of in core free blocks int s_free[100]; //in core free blocks int s_ninode; //number of in core I list int s_inode[100]; //in core free I nodes char s_flock; //free list locking cha
38、r s_ilock; //i list locking char s_fmod; //super block modified flag char s_ronly; //mounted read only flag char s_time[2]; //current date of last update int pad[50];},空閑塊管理:100個空閑塊為一組,組之間相互
39、鏈接。,,,...,...,...,...,特點:速度快,空間省。,申請時: (1) s_nfree>1, 分配s_free[--s_nfree]所指的塊; (2) s_nfree=1, 將s_free[0]所指的連接塊讀入內(nèi)存緩沖區(qū), 前202字節(jié)復制到filesys,分配s_free[0]所指的塊.釋放時: (1) s_nfree<100, s_free[s_nfree++]=釋放塊號;
40、 (2) s_nfree=100, 將s_nfree和s_free拷貝到釋放塊中,寫回外存, s_free[0]=釋放塊號, s_nfree=1.,空閑塊管理:,s_inode最多可以記載100個空閑inode(編號)申請時: (1) s_ninode>0, 取s_inode[--s_ninode]; (2) s_ninode=0, 由磁盤inode區(qū)順取100個空閑I節(jié)點(i_nlink=0)
41、 將其編號填入s_inode表中,修改s_ninode,然后分配。釋放時: (1) s_ninode<100, s_inode[s_ninode++]=i_number (釋放的); (2) s_ninode=100, 丟棄。,空閑inode管理:,文件系統(tǒng)界面(UNIX系統(tǒng)調(diào)用),creatopencloseseekreadwritelinkunlinkpipe,mknodesmount
42、sumountchmodchownerstatefstatechdir,fd=creat(pathname,mode)pathname: 路徑名;mode: 共享說明;分配一個inode, 初始化(i_size=0, i_mode=mode, i_nlink=1,i_uid=u_uid, i_gid=u_gid );2. 填寫目錄項(name, i_number);3. 以寫方式打開(填寫inode表、file 表和
43、u_ofile表);4. 返回文件描述符。例子:creat(“d1/d2/f1”, mode)假定分配i_number=15, (f1,15)?d2中(??????????????, -1),fd=open(pathname,mode)pathname: 路徑名;mode: 打開方式;fd: 文件描述符(u_ofile表的入口)1. 查目錄找inode(移入內(nèi)存i_count=1, 如已在內(nèi)存i_count++);2.
44、 權(quán)限檢查(mode打開方式, i_mode共享說明, i_uid, i_gid文件 主(組), u_uid, u_gid用戶身份);3. 在file表中分配一個表項(f_count==0的), 初始化 f_count=1; f_offset=0; f_flag=mode, f_inodep指向inode;4. 在u_ofile中取一空閑表目,指向file表中對應表目;5. 返回文件描述符fd(在u_ofile表
45、中的入口)。,close(fd)fd: 文件描述符;1. 由fd查u_ofile找到對應入口;2. 由u_ofile[fd]找到file表對應入口;3. f_count--, 如>0轉(zhuǎn)6;4. 由f_inode找到對應inode, f_inode指向空;5. i_count--, 如為0,i_flag標志有修改,寫回外存inode區(qū);6. u_ofile[fd]=-1(空閑標志)。,seek(fd, whence,
46、offset)fd: 文件描述符;whence: 相對位置(0,1,2,3,4,5)=(頭,當前位置,尾)offset: 移動量;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指針。,nrd=read(fd,buf,count)fd
47、: 文件描述符;buf: 進程空間接收區(qū)地址;count: 讀字節(jié)數(shù);1. 由u_ofile[fd],找到file表對應入口;2. 檢查訪問合法性(f_flag, READ);3. 由f_inode找到內(nèi)存inode入口;4. 由f_offset, count和i_addr計算訪問磁盤塊號(可能多個塊) 和塊內(nèi)字節(jié); (bmap函數(shù));5. 若緩沖區(qū)有, 所需字節(jié)復制到進程空間由buf起始位置(iomove);
48、6. 若緩沖區(qū)無, 申請空緩沖(可能多個), 緩沖區(qū)鏈入設備IO隊列,若設備空閑 啟動設備(切換進程), 緩沖區(qū)信息復制到進程空間(iomove);7. 返回實際傳輸字節(jié)數(shù)nrd。,nwt=write(fd,buf,count)fd: 文件描述符;buf:進程空間發(fā)送地址;count: 寫字節(jié)數(shù);1. 由u_ofile[fd],找到file表對應入口;2. 檢查訪問合法性(f_flag, WRITE);3. 由f_
49、inode找到內(nèi)存inode入口;4. 由f_offset, count和i_addr計算磁盤地址塊號(可能分配盤塊);5. 申請系統(tǒng)緩沖區(qū),將buf起始count字節(jié)送到緩沖區(qū)(可多次);6. 緩沖區(qū)鏈到設備IO鏈上, 如設備空閑啟動設備;7. 修改inode中文件長度i_size;8. 返回實際傳輸字節(jié)數(shù)nwt。,pipe(fd)int fd[2];1. 分配一個inode,(i_count=2);2. 分配2個fi
50、le表目(f_flag分別為PipeR和PipeW,讀/寫指針 offset為0)3. 分配2個u_ofile表目, 分別指向2個file表目;4. 返回2個文件描述符fd[0],fd[1], 分別為u_ofile中的2個入口。,…,…,,內(nèi)存inode表,內(nèi)存file表,fd[0],fd[1],u_ofile表,…,…,…,,,,,進程執(zhí)行pipe(fd)之后,…,…,,內(nèi)存inode表,內(nèi)存file表,fd[0],fd
51、[1],u_ofile表,…,…,…,,,,,fork創(chuàng)建子進程1之后,fd[0],fd[1],…,…,…,父進程:,子進程1:,,,…,…,,內(nèi)存inode表,內(nèi)存file表,fd[0],fd[1],u_ofile表,…,…,…,,,,,fork創(chuàng)建子進程2之后,…,…,…,父進程:,子進程1:,,,…,…,…,子進程2:,,,…,…,,內(nèi)存inode表,內(nèi)存file表,fd[0],fd[1],u_ofile表,…,…,…,,,父進程
52、close(fd[0]),close(fd[1]),…,…,…,父進程:,子進程1:,,,…,…,…,子進程2:,,,…,…,,內(nèi)存inode表,內(nèi)存file表,fd[0],fd[1],u_ofile表,…,…,…,,,子進程1(讀者) : close(fd[1]),…,…,…,父進程:,子進程1:,,…,…,…,子進程2:,,,…,…,,內(nèi)存inode表,內(nèi)存file表,fd[0],fd[1],u_ofile表,…,…,…,,,子進程
53、2(寫者) : close(fd[0]),…,…,…,父進程:,子進程1:,,…,…,…,子進程2:,,…,…,,,,,,內(nèi)存inode表,內(nèi)存file表,u_ofile表,,,子進程2(寫) : write(fd[1],buf1,count1)子進程1(讀) : read(fd[0],buf0,count0),父進程:,子進程1:,,子進程2:,,,,,,write(fd[1],…),read(fd[0],…),盤塊(有緩沖),…
54、,…,,,,,,內(nèi)存inode表,內(nèi)存file表,u_ofile表,,子進程2(寫完) :close(fd[1]),父進程:,子進程1:,,子進程2:,…,…,…,,,,,close(fd[1]),read(fd[0],…),盤塊(有緩沖),…,…,,內(nèi)存inode表,內(nèi)存file表,u_ofile表,子進程1(讀完) :close(fd[0]),父進程:,子進程1:,子進程2:,fd[0],fd[1],…,…,…,close(fd[
55、1]),close(fd0]),Pipe文件同步與互斥,pipe讀寫同步寫滿:寫者等待,讀出后喚醒讀空:讀者等待,寫入后喚醒讀寫關(guān)閉所有讀者關(guān)閉:寫時返回錯誤信號所有寫者關(guān)閉:讀者立即返回讀寫互斥i_flag|ILOCK,管道通訊的局限性,只有相關(guān)進程(同一家族進程)能通訊先創(chuàng)建管道再創(chuàng)建子進程, 子進程繼承父進程打開的文件(包括管道文件)管道是沒有名字的文件所有進程都關(guān)閉后即被撤銷,命名管道(FIFO),長久性通
56、訊機構(gòu)具有文件名可被打開、讀寫、關(guān)閉和刪除任何進程都能找到它即使是不同祖先的進程,也可以利用命名管道進行通信。讀取和寫入遵循FIFO原則阻塞:管道讀: 假如沒有線程實行寫管道操作,讀線程將一直阻塞,直到有線程往里面寫為止;管道寫: 假如沒有線程實行讀操作,寫線程將一直阻塞,直到有線程讀數(shù)據(jù)為止。不阻塞:管道讀:假如沒有線程實行寫管道操作,讀線程將立即返回;管道寫:假如沒有線程實行讀操作,寫線程將立即返回,返回不正確
57、碼-1。,系統(tǒng)調(diào)用mkfifo,int mkfifo(pathname,mode)pathname:FIFO文件名mode: 權(quán)限說明0666, 所有用戶可讀可寫返回值:正常0, 失敗-1一旦創(chuàng)建了一個FIFO,就可用open打開它,一般的文件訪問函數(shù)(close、read、write等)都可用于FIFO,但lseek不可以(為什么?),FIFO例子,include include include main(){
58、 unlink(FIFO); mkfifo(FIFO, 0666); if(fork()>0) { char s[]=“hello!\n”; fd=open(FIFO, O_WRONLY); write(fd, s, sizeof(s)); close(fd);},else{ fd=open(FIFO, O_RDONLY)
59、; read(fd, buffer, 80); printf(“%s”, buffer); close(fd);},,link(oldpathname, newpathname)oldpathname: 已存在文件名;newpathname: 待連接文件名;1. 查目錄找到oldpathname(inode);2. 查目錄找到newpathname的末級目錄;3. 檢查操作合法
60、性;4. Inode的i_nlink++;5. (name, i_number)?newpathname的末級目錄。例子:link(“d1/d2/f1”,“d1/d3/f2”)d1,d2,f1: 存在;d1,d3: 存在,f2: 不存在,,unlink(pathname)pathname: 文件路徑名;1. 查目錄找到pathname(inode);2. i_nlink--; 如結(jié)果為0, 釋放所有磁盤塊 (刪除文
61、件);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 permissions: 節(jié)點類型和訪問權(quán)限;dev: 主
62、次設備號;功能: 創(chuàng)建特殊文件.1. 如非特權(quán)用戶,失敗;2. 建立一個i_node, 初始化(i_mode=type and permission; i_addr[0]=dev);3. 填寫目錄項。,struct mount{ int m_dev; struct buf *m_bufp; //超級塊 struct inode *m_inodep;}mount[NMOUNT];#def
63、ine NMOUNT 5,,,,,dev,,,root,,rk05,makenode創(chuàng)建,,,usr,Li,,,d01,安裝: smount(“/dev/rk05”, “/usr/Li/d01”, 0)卸下: sumount(“/dev/rk05”),i_flag =| IMOUNT,,,bit: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0,,,,,,,
64、,,,,,,,,,,,,,,Set gid,,Set uid,,大文件,,00普通01字符10目錄11塊型,i_mode:,i_flag:,,,,,,,,,ILOCK,,IUPD,,IACC,,IMOUNT,,IWANT,,ITEXT,執(zhí)行該文件進程的身份暫時改為文件主的身份即: u_uid = i_uid; u_gid = i_gid,,,文件主權(quán)限,同組用戶權(quán)限,其他用戶權(quán)限,smount(special_pathname,
65、 directory_pathname, roflag)special_pathname: 特殊文件名directory_pathname: 目錄文件名(安裝節(jié)點)roflag: 只讀標志1. 檢查是否超級用戶;2. 找到special_pathname文件的inode(用mknode建立);3. 合法性檢查(特殊塊型文件);4. 找到directory_pathname節(jié)點的inode;5. 如非目錄或引用數(shù)大于1,錯
66、返;6. 安裝節(jié)點inode的i_addr[0]=設備文件i_addr[0]; (dev) 7. 讀入super block到buf,按filesys格式解釋.8. 分配一個mount表項,填寫(m_dev,m_bufp,m_inodep),9 安裝節(jié)點inode的i_flag =| IMOUNT.,例子:smount(“/dev/disk1”,“/usr/d1”,0)安裝之前: disk1只能作為特殊文件
67、(塊序列文件)訪問(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對應的卷,用于回寫。,sumount(special_file_name)s
68、pecial_file_name: 待卸下卷的特殊文件名;1. 查目錄找到inode,取dev(i_addr[0]);2. 釋放特殊文件的inode;3. 由dev查mount表(m_dev)找到對應super block;4. 系統(tǒng)緩沖區(qū)延遲寫塊寫回;5. 該卷所有更新i_node寫回;6. super block寫回;7. 釋放super block所占用的緩沖區(qū);8. 由m_inodep找到安裝節(jié)點的inode;
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論