2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩111頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、第七章 文件系統(tǒng),7.1 文件與文件系統(tǒng)文件具有符號名而且在邏輯上具有完整意義的信息項(xiàng)的序列。文件系統(tǒng)文件與管理文件的程序集合。,UNIX文件分類,普通文件內(nèi)容可以是程序、數(shù)據(jù)、圖象、MP3等,保存在磁盤塊中目錄文件(文件名,文件號)序列,保存在磁盤塊中特殊文件設(shè)備設(shè)備作為文件管理的好處界面統(tǒng)一,使用文件與使用設(shè)備命令相同,申請?jiān)O(shè)備open, 釋放close, 讀read, 寫write利用文件保護(hù)

2、功能可以保護(hù)設(shè)備,7.2 文件的訪問方式,順序訪問從文件起始位置開始順序訪問從文件中間某處開始順序訪問隨機(jī)訪問按記錄編號隨機(jī)訪問按關(guān)鍵字(key)隨機(jī)訪問,7.3 文件的組織,邏輯組織用戶看到的文件組織形式記錄式文件:記錄的序列等長記錄(優(yōu)點(diǎn):處理方便,速度快;缺點(diǎn):空間浪費(fèi))不等長記錄(優(yōu)點(diǎn):省空間;缺點(diǎn):處理不便,速度慢)流式文件:字節(jié)的序列(UNIX, Windows, etc)物理組織邏輯組織到磁盤塊的映

3、射文件:記錄(字節(jié))序列磁盤:塊(block)序列,,變換關(guān)系,7.3.2 文件的物理組織,考慮因素記錄格式等長或不等長, 流式不必考慮空間開銷除保存文件內(nèi)容之外的存儲(chǔ)開銷訪問速度隨機(jī)訪問速度長度變化動(dòng)態(tài)增長,順序結(jié)構(gòu): 一個(gè)文件占有若干連續(xù)的磁盤塊。優(yōu)點(diǎn):速度快,節(jié)省空間缺點(diǎn):長度變化困難,鏈接結(jié)構(gòu): 一文件可存于不連續(xù)塊中,塊間以指針相連。優(yōu)點(diǎn):節(jié)省空間,長度變化容易。缺點(diǎn)

4、:隨機(jī)訪問速度慢。,,,,,,索引結(jié)構(gòu): 一文件可存于不連續(xù)塊中,塊號記在索引塊中。優(yōu)點(diǎn):速度快,長度變化容易。缺點(diǎn):索引塊占空間。,磁盤空間,…索引塊=29塊數(shù)=4...,FCB,,,,,,,索引塊29,Hash結(jié)構(gòu): 計(jì)算地址:hash(key)=addr (在磁盤或文件中的存放位置)問題:給定key1?key2 hash(key1)=addr1;

5、 hash(key2)=addr2; addr1=addr2 (conflict)Conflict resolution: 順序探查法:如發(fā)生沖突,則在沖突位置開始順序探查第一個(gè)空閑的存儲(chǔ)位置。,,,...,...,文件空間,,,Hash(key)=addr,,起始位置,計(jì)算addr=hash(key),對應(yīng)沖突記數(shù)加1,本記錄空閑,順取下一個(gè),標(biāo)記為占用填記錄內(nèi)容,,保存記錄:,,,,,T,F,

6、,記錄內(nèi)容,查找記錄:,計(jì)算addr=hash(key),取addr對應(yīng)記錄的沖突記數(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),找到,錯(cuò)誤返回,置空閑標(biāo)志(找到記錄)沖突記數(shù)-1對應(yīng)has

7、h(key),,,,,,特點(diǎn):按關(guān)鍵字檢索速度非??臁S猛荆撼S糜谀夸洐z索。注意:文件可循環(huán)使用,滿時(shí)保存失敗。,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 文件目錄,文件控制塊與目錄項(xiàng)文件控制塊(FCB)文件存在的標(biāo)志,其中保存系統(tǒng)管理文件需要的全部信息目錄項(xiàng)目錄文件中的一項(xiàng),內(nèi)容為FCB文件目錄與目錄文件文件目錄用于檢索文件的目錄目錄文件內(nèi)容為目錄項(xiàng)的文件,文件控制塊FCB(File Control Block),文件名文件號文件主文件類型文件屬性共享說明文件長度文件地址建立日期最后修改日期最后訪問日期

9、口令其它,FCB創(chuàng)建:建立文件時(shí)FCB撤消:刪除文件時(shí),單級目錄(Single-Level Directory),A single directory for all users.,缺點(diǎn):Naming problemGrouping problemProtection problem,兩級目錄(Two-Level Directory),Separate directory for each user.,特點(diǎn): 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,,,文件目錄的查找,查找路徑由根目錄開始查找由當(dāng)前目錄開始查找查找算法順序查找(UNIX)hash查找(Solo)對分查找(要求文件名排序),文件目錄的改進(jìn),FCB次部:(文件名, 文件號) (UNIX 16 bytes)保存在目錄文件中主部:(其它, 鏈接記數(shù))(UN

12、IX 32 bytes)保存在外存inode區(qū)域, 打開時(shí)讀入內(nèi)存.改進(jìn)的好處可以提高查找速度(順序查找)可以實(shí)現(xiàn)文件鏈接(link),UNIX文件卷(volume)組織形式:,7.5 文件的共享,共享目的節(jié)省存儲(chǔ)空間(cc,vi,yacc)進(jìn)程相互通訊UNIX pipe()文件共享模式不同時(shí)使用根據(jù)共享說明同時(shí)使用根據(jù)共享說明和(relaxed)R/W規(guī)則,文件的共享,文件共享的實(shí)現(xiàn)公共目錄共享說明連接

13、,d1,link(“/usr/users/wang/d1/f1”, “/usr/users/li/f2”)unlink(“/usr/users/wang/d1/f1”),,usr,,,,root,7.6 文件的保護(hù)、保密與安全,保護(hù)防止用戶對文件進(jìn)行非授權(quán)的訪問保密防止文件內(nèi)容泄露安全防止文件被破壞自然因素人為因素,,,7.6.1文件的保護(hù)(Protection),File owner/creator s

14、hould be able to control:what can be doneby whomTypes of accessReadWriteExecuteAppendDeleteList,1. 存取控制矩陣,aij:,特點(diǎn):權(quán)限規(guī)定細(xì),過于繁瑣,占較多存儲(chǔ)空間,2. 訪問權(quán)限說明(UNIX)i_mode,,R W E R W E R W E,,,,,,,,,,,,文件主,同組用戶,其他用戶,文件主

15、判別:訪問進(jìn)程u_uid==i_uid同組用戶判別:訪問進(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中訪問文件要求給出口令,并與FCB中口令比較特點(diǎn)簡單保密性不強(qiáng)(eg. 對系統(tǒng)操作員不保密)密碼特點(diǎn)

16、對文件內(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ù): Procedure random(Var key:integer); Begin key:=(ke

17、y*C1+C2)MOD C3 End;,7.6.3 文件系統(tǒng)的安全,Backup(備份)定期將磁盤上文件復(fù)制到磁帶上發(fā)生故障時(shí)由磁帶恢復(fù)(limited recovery) 實(shí)現(xiàn)方法完全轉(zhuǎn)儲(chǔ)定期將磁盤上文件全部復(fù)制到磁帶上恢復(fù):最后一次轉(zhuǎn)儲(chǔ)磁帶優(yōu)點(diǎn):恢復(fù)容易缺點(diǎn):大量冗余增量轉(zhuǎn)儲(chǔ)(incremental backup)每次只復(fù)制上次轉(zhuǎn)儲(chǔ)以來修改部分恢復(fù):由初始轉(zhuǎn)儲(chǔ)磁帶起,利用第二次轉(zhuǎn)儲(chǔ)磁帶、第三次轉(zhuǎn)儲(chǔ)磁帶、

18、…、最后一次轉(zhuǎn)儲(chǔ)磁帶,逐步恢復(fù)到最終版本優(yōu)點(diǎn):每次轉(zhuǎn)儲(chǔ)數(shù)據(jù)少缺點(diǎn):實(shí)現(xiàn)麻煩,某次轉(zhuǎn)儲(chǔ)磁帶發(fā)生問題將使恢復(fù)困難,7.6.3 文件系統(tǒng)的安全,差分轉(zhuǎn)儲(chǔ)(differential backup)開始進(jìn)行一次完全轉(zhuǎn)儲(chǔ)以后每次備份當(dāng)天與開始第一次備份不同的數(shù)據(jù)恢復(fù):利用第一次轉(zhuǎn)儲(chǔ)磁帶和最后一次轉(zhuǎn)儲(chǔ)磁帶優(yōu)點(diǎn):實(shí)現(xiàn)簡單,恢復(fù)容易磁盤整理利用轉(zhuǎn)儲(chǔ)和恢復(fù)可以對磁盤進(jìn)行整理(使文件物理塊連續(xù),空閑盤塊連續(xù)),7.7 文件系統(tǒng)的實(shí)現(xiàn),7.7.

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

20、接):100個(gè)空閑塊為一組,組之間相互鏈接,最前面的組記在超級塊中,安裝后緩沖到內(nèi)存。,,,...,...,...,...,特點(diǎn):速度快,空間省。,空閑塊管理:申請時(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í):

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、) 為此文件分配一個(gè)FCB主部,初始化(文件主、共享說明、創(chuàng)建時(shí)間、長度等)(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)打開文件表看該文件是否已被打開, 如是共享計(jì)數(shù)加1; 否則取一個(gè)空閑的系統(tǒng)打開文件表項(xiàng)并將外存中 FCB主部等信息填入此表項(xiàng), 共享計(jì)數(shù)置為1;(4) 在用戶打開文件表中取一空表項(xiàng), 填寫打開方式和讀寫指針, 并指向系統(tǒng)打開文件表的對應(yīng)表項(xiàng).返回信息: fd: 文件描述符(在用戶打開文件表中的入口), 它是一個(gè)非負(fù)整數(shù).,7.8 文件系統(tǒng)的

24、界面,關(guān)閉文件命令形式: close(fd)參數(shù)說明 fd: 文件描述符.執(zhí)行步驟: (1) 由fd查用戶打開文件表, 找到系統(tǒng)打開文件表入口; (2) 系統(tǒng)打開文件表中共享計(jì)數(shù)減1, 如減1后的值為0且修改標(biāo)志為1, 則將此FCB 由內(nèi)存寫回外存FCB主部; (3) 將fd所對應(yīng)的用戶打開文件表項(xiàng)置為空閑.,7.8 文件系統(tǒng)的界面,指針定位命令形式: seek(fd,offset)參數(shù)說明:fd: 文件描述符;o

25、ffset: 新的指針位置.執(zhí)行步驟:(1) 由fd查用戶打開文件表, 得系統(tǒng)打開文件表入口;(2) 查系統(tǒng)打開文件表, 得文件長度;(2) 檢查參數(shù)合法性;(3) 將用戶打開文件表中文件讀寫指針位置設(shè)定為offset, 后繼讀寫命令由該指針處存取文件內(nèi)容.,7.8 文件系統(tǒng)的界面,讀文件命令形式: read(fd,nrd,buf) 參數(shù)說明:fd: 文件描述符;nrd: 讀入記錄個(gè)數(shù);buf: 內(nèi)存起始位置. 步

26、驟:(1) 由fd查用戶打開文件表, 找到對應(yīng)的入口;(2) 合法性檢查(用戶打開文件表中所記錄的打開方式、存取方式);(3) 查系統(tǒng)打開文件表, 找到文件的地址;(4) 根據(jù)邏輯地址(offset)和物理結(jié)構(gòu)計(jì)算物理地址;(5) 如在緩沖區(qū)中; 所需字節(jié)復(fù)制到進(jìn)程空間buf起始位置; (6) 否則申請緩沖區(qū)(可能多個(gè)), 鏈入設(shè)備IO隊(duì)列, 若設(shè)備空閑啟動(dòng)設(shè)備, 等待IO傳輸完成(切換進(jìn)程), 所需字節(jié)復(fù)制到進(jìn)程空間buf

27、起始的位置.,7.8 文件系統(tǒng)的界面,寫文件命令形式: write(fd,nwt,buf)參數(shù)含義: fd: 文件描述符;nwt: 寫出記錄個(gè)數(shù);buf: 內(nèi)存起始位置. 執(zhí)行步驟: (1) 由fd查用戶打開文件表, 找到對應(yīng)的入口;(2) 合法性檢查(用戶打開文件表中所記錄的打開方式、存取方式);(3) 查系統(tǒng)打開文件表, 找到文件的地址;(4) 根據(jù)邏輯地址(offset)和物理結(jié)構(gòu)計(jì)算物理地址;(5) 如果需

28、要, 分配磁盤塊;(6) 將內(nèi)存中由buf起始的nwt個(gè)記錄復(fù)制到緩沖區(qū)中(可能多個(gè)), 緩沖區(qū)鏈入磁盤IO隊(duì)列, 如設(shè)備空閑啟動(dòng)設(shè)備.,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)成一個(gè)新的目錄項(xiàng), 將其填入new_name的末級目錄文件中;(4) 將FCB主部中的連接計(jì)數(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) 將連接計(jì)數(shù)i_nlink減1;(3) 如減1后的值為0, 則歸還該文件所占用的全部存儲(chǔ)塊, 該文件將被撤銷;(4) 將FCB次部由上級目錄中清除.,如: unlink(“/usr/Zhang/d2/f2”),UNIX文件系統(tǒng)的實(shí)現(xiàn),內(nèi)存所需表目(UNIX)用戶打開文件表u_ofile (每個(gè)進(jìn)程一個(gè))file (整個(gè)系統(tǒng)一個(gè))系統(tǒng)打開文件表Inode (整個(gè)系統(tǒng)一個(gè))外存空間的

31、管理空閑塊表位示圖(bit map, Linux)成組連接 (UNIX approach),1. u_ofile (每進(jìn)程一個(gè))struct user{ … int u_ofile[NOFILE]; …}#define NOFILE 15,2. file (系統(tǒng)一個(gè))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個(gè)空閑inode. (緩存) 文件安裝(mount)后超級塊讀入內(nèi)存。注:占用區(qū)域已經(jīng)記載在各個(gè)文件的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個(gè)空閑塊為一組,組之間相互

39、鏈接。,,,...,...,...,...,特點(diǎn):速度快,空間省。,申請時(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++]=釋放塊號;

40、 (2) s_nfree=100, 將s_nfree和s_free拷貝到釋放塊中,寫回外存, s_free[0]=釋放塊號, s_nfree=1.,空閑塊管理:,s_inode最多可以記載100個(gè)空閑inode(編號)申請時(shí): (1) s_ninode>0, 取s_inode[--s_ninode]; (2) s_ninode=0, 由磁盤inode區(qū)順取100個(gè)空閑I節(jié)點(diǎn)(i_nlink=0)

41、 將其編號填入s_inode表中,修改s_ninode,然后分配。釋放時(shí): (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: 共享說明;分配一個(gè)inode, 初始化(i_size=0, i_mode=mode, i_nlink=1,i_uid=u_uid, i_gid=u_gid );2. 填寫目錄項(xiàng)(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表中分配一個(gè)表項(xiàng)(f_count==0的), 初始化 f_count=1; f_offset=0; f_flag=mode, f_inodep指向inode;4. 在u_ofile中取一空閑表目,指向file表中對應(yīng)表目;5. 返回文件描述符fd(在u_ofile表

45、中的入口)。,close(fd)fd: 文件描述符;1. 由fd查u_ofile找到對應(yīng)入口;2. 由u_ofile[fd]找到file表對應(yīng)入口;3. f_count--, 如>0轉(zhuǎn)6;4. 由f_inode找到對應(yīng)inode, f_inode指向空;5. i_count--, 如為0,i_flag標(biāo)志有修改,寫回外存inode區(qū);6. u_ofile[fd]=-1(空閑標(biāo)志)。,seek(fd, whence,

46、offset)fd: 文件描述符;whence: 相對位置(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指針。,nrd=read(fd,buf,count)fd

47、: 文件描述符;buf: 進(jìn)程空間接收區(qū)地址;count: 讀字節(jié)數(shù);1. 由u_ofile[fd],找到file表對應(yīng)入口;2. 檢查訪問合法性(f_flag, READ);3. 由f_inode找到內(nèi)存inode入口;4. 由f_offset, count和i_addr計(jì)算訪問磁盤塊號(可能多個(gè)塊) 和塊內(nèi)字節(jié); (bmap函數(shù));5. 若緩沖區(qū)有, 所需字節(jié)復(fù)制到進(jìn)程空間由buf起始位置(iomove);

48、6. 若緩沖區(qū)無, 申請空緩沖(可能多個(gè)), 緩沖區(qū)鏈入設(shè)備IO隊(duì)列,若設(shè)備空閑 啟動(dòng)設(shè)備(切換進(jìn)程), 緩沖區(qū)信息復(fù)制到進(jìn)程空間(iomove);7. 返回實(shí)際傳輸字節(jié)數(shù)nrd。,nwt=write(fd,buf,count)fd: 文件描述符;buf:進(jìn)程空間發(fā)送地址;count: 寫字節(jié)數(shù);1. 由u_ofile[fd],找到file表對應(yīng)入口;2. 檢查訪問合法性(f_flag, WRITE);3. 由f_

49、inode找到內(nèi)存inode入口;4. 由f_offset, count和i_addr計(jì)算磁盤地址塊號(可能分配盤塊);5. 申請系統(tǒng)緩沖區(qū),將buf起始count字節(jié)送到緩沖區(qū)(可多次);6. 緩沖區(qū)鏈到設(shè)備IO鏈上, 如設(shè)備空閑啟動(dòng)設(shè)備;7. 修改inode中文件長度i_size;8. 返回實(shí)際傳輸字節(jié)數(shù)nwt。,pipe(fd)int fd[2];1. 分配一個(gè)inode,(i_count=2);2. 分配2個(gè)fi

50、le表目(f_flag分別為PipeR和PipeW,讀/寫指針 offset為0)3. 分配2個(gè)u_ofile表目, 分別指向2個(gè)file表目;4. 返回2個(gè)文件描述符fd[0],fd[1], 分別為u_ofile中的2個(gè)入口。,…,…,,內(nèi)存inode表,內(nèi)存file表,fd[0],fd[1],u_ofile表,…,…,…,,,,,進(jìn)程執(zhí)行pipe(fd)之后,…,…,,內(nèi)存inode表,內(nèi)存file表,fd[0],fd

51、[1],u_ofile表,…,…,…,,,,,fork創(chuàng)建子進(jìn)程1之后,fd[0],fd[1],…,…,…,父進(jìn)程:,子進(jìn)程1:,,,…,…,,內(nèi)存inode表,內(nèi)存file表,fd[0],fd[1],u_ofile表,…,…,…,,,,,fork創(chuàng)建子進(jìn)程2之后,…,…,…,父進(jìn)程:,子進(jìn)程1:,,,…,…,…,子進(jìn)程2:,,,…,…,,內(nèi)存inode表,內(nèi)存file表,fd[0],fd[1],u_ofile表,…,…,…,,,父進(jìn)程

52、close(fd[0]),close(fd[1]),…,…,…,父進(jìn)程:,子進(jìn)程1:,,,…,…,…,子進(jìn)程2:,,,…,…,,內(nèi)存inode表,內(nèi)存file表,fd[0],fd[1],u_ofile表,…,…,…,,,子進(jìn)程1(讀者) : close(fd[1]),…,…,…,父進(jìn)程:,子進(jìn)程1:,,…,…,…,子進(jìn)程2:,,,…,…,,內(nèi)存inode表,內(nèi)存file表,fd[0],fd[1],u_ofile表,…,…,…,,,子進(jìn)程

53、2(寫者) : close(fd[0]),…,…,…,父進(jìn)程:,子進(jìn)程1:,,…,…,…,子進(jìn)程2:,,…,…,,,,,,內(nèi)存inode表,內(nèi)存file表,u_ofile表,,,子進(jìn)程2(寫) : write(fd[1],buf1,count1)子進(jìn)程1(讀) : read(fd[0],buf0,count0),父進(jìn)程:,子進(jìn)程1:,,子進(jìn)程2:,,,,,,write(fd[1],…),read(fd[0],…),盤塊(有緩沖),…

54、,…,,,,,,內(nèi)存inode表,內(nèi)存file表,u_ofile表,,子進(jìn)程2(寫完) :close(fd[1]),父進(jìn)程:,子進(jìn)程1:,,子進(jìn)程2:,…,…,…,,,,,close(fd[1]),read(fd[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],…,…,…,close(fd[

55、1]),close(fd0]),Pipe文件同步與互斥,pipe讀寫同步寫滿:寫者等待,讀出后喚醒讀空:讀者等待,寫入后喚醒讀寫關(guān)閉所有讀者關(guān)閉:寫時(shí)返回錯(cuò)誤信號所有寫者關(guān)閉:讀者立即返回讀寫互斥i_flag|ILOCK,管道通訊的局限性,只有相關(guān)進(jìn)程(同一家族進(jìn)程)能通訊先創(chuàng)建管道再創(chuàng)建子進(jìn)程, 子進(jìn)程繼承父進(jìn)程打開的文件(包括管道文件)管道是沒有名字的文件所有進(jìn)程都關(guān)閉后即被撤銷,命名管道(FIFO),長久性通

56、訊機(jī)構(gòu)具有文件名可被打開、讀寫、關(guān)閉和刪除任何進(jìn)程都能找到它即使是不同祖先的進(jìn)程,也可以利用命名管道進(jìn)行通信。讀取和寫入遵循FIFO原則阻塞:管道讀: 假如沒有線程實(shí)行寫管道操作,讀線程將一直阻塞,直到有線程往里面寫為止;管道寫: 假如沒有線程實(shí)行讀操作,寫線程將一直阻塞,直到有線程讀數(shù)據(jù)為止。不阻塞:管道讀:假如沒有線程實(shí)行寫管道操作,讀線程將立即返回;管道寫:假如沒有線程實(shí)行讀操作,寫線程將立即返回,返回不正確

57、碼-1。,系統(tǒng)調(diào)用mkfifo,int mkfifo(pathname,mode)pathname:FIFO文件名mode: 權(quán)限說明0666, 所有用戶可讀可寫返回值:正常0, 失敗-1一旦創(chuàng)建了一個(gè)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é)點(diǎn)名;type and permissions: 節(jié)點(diǎn)類型和訪問權(quán)限;dev: 主

62、次設(shè)備號;功能: 創(chuàng)建特殊文件.1. 如非特權(quán)用戶,失??;2. 建立一個(gè)i_node, 初始化(i_mode=type and permission; i_addr[0]=dev);3. 填寫目錄項(xiàng)。,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í)行該文件進(jìn)程的身份暫時(shí)改為文件主的身份即: 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é)點(diǎn))roflag: 只讀標(biāo)志1. 檢查是否超級用戶;2. 找到special_pathname文件的inode(用mknode建立);3. 合法性檢查(特殊塊型文件);4. 找到directory_pathname節(jié)點(diǎn)的inode;5. 如非目錄或引用數(shù)大于1,錯(cuò)

66、返;6. 安裝節(jié)點(diǎn)inode的i_addr[0]=設(shè)備文件i_addr[0]; (dev) 7. 讀入super block到buf,按filesys格式解釋.8. 分配一個(gè)mount表項(xiàng),填寫(m_dev,m_bufp,m_inodep),9 安裝節(jié)點(diǎn)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對應(yīng)的卷,用于回寫。,sumount(special_file_name)s

68、pecial_file_name: 待卸下卷的特殊文件名;1. 查目錄找到inode,取dev(i_addr[0]);2. 釋放特殊文件的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é)點(diǎn)的inode;

溫馨提示

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

評論

0/150

提交評論