亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

關(guān)于文件的INode與Java中的文件操作接口

W_BinaryTree / 1992人閱讀

摘要:文件名是可以隨時(shí)被改變的,只要其中的沒(méi)有發(fā)生改變,則指向的就是同一個(gè)文件。關(guān)于和,還有關(guān)于緩存的重要注意事項(xiàng)。由于操作系統(tǒng)在接收到文件寫請(qǐng)求時(shí)可能將寫入內(nèi)容放到緩存中,所以提供了和等操作來(lái)將緩存中的內(nèi)容強(qiáng)制刷入磁盤。文章來(lái)源網(wǎng)易云社區(qū)

本文由作者周梁偉授權(quán)網(wǎng)易云社區(qū)發(fā)布。

近日做的項(xiàng)目中涉及到多進(jìn)程共同讀寫多個(gè)文件的問(wèn)題,文件名和最后修改時(shí)間都是可能會(huì)被頻繁修改的,因而識(shí)別文件的唯一性會(huì)產(chǎn)生相當(dāng)?shù)穆闊?,于是專門再學(xué)習(xí)了一下文件系統(tǒng)對(duì)文件的組織管理方式。

一、 文件在文件系統(tǒng)中的組織方式
一塊物理磁盤可以被分為若干個(gè)分區(qū),分區(qū)的初始化操作就是在上面建立文件系統(tǒng),如ext3,ext4,ntfs或fat32等都是文件系統(tǒng)的概念,還有網(wǎng)絡(luò)文件系統(tǒng)如NFS等。同塊磁盤上的不同分區(qū)也可以被指定不同的文件系統(tǒng),文件系統(tǒng)對(duì)文件在磁盤上的數(shù)據(jù)讀寫方式做了抽象。一個(gè)文件系統(tǒng)中又被分為多個(gè)卷(Cylinder Group),每個(gè)卷中最主要的部分是inode基路段和數(shù)據(jù)塊段。i-node結(jié)構(gòu)唯一指定了一個(gè)文件實(shí)例,這個(gè)數(shù)據(jù)結(jié)構(gòu)中包括了inode編號(hào),所有包含的數(shù)據(jù)塊的信息和該inode被引用的計(jì)數(shù)等。可以這么認(rèn)為,要唯一識(shí)別的一個(gè)磁盤上的文件,只需要獲得inode-number就可以了。文件或者目錄則是存放在數(shù)據(jù)塊中directory block,其中包含了文件名和實(shí)體文件的inode-number等信息。文件名是可以隨時(shí)被改變的,只要其中的inode-number沒(méi)有發(fā)生改變,則指向的就是同一個(gè)文件。所以在應(yīng)用程序中要判斷文件是否相同如果依靠filename是不可靠的,只有獲取到文件的inode-number才是可靠的。如在log4j這種日志應(yīng)用中,日志文件的歸檔方式會(huì)使文件名不斷發(fā)生變化,當(dāng)前你less到的app.log在下一分鐘可能就變成了app.log.1。在這種場(chǎng)景下,程序只能通過(guò)獲取文件inode-number來(lái)識(shí)別文件。

二、 文件操作
前面說(shuō)了文件在磁盤上的存放是以inode-number為唯一id來(lái)區(qū)分的,在進(jìn)程打開一個(gè)文件讀寫時(shí),操作系統(tǒng)又會(huì)為文件分配一個(gè)"指針"來(lái)訪問(wèn)文件,而不是直接使用inode-number。這個(gè)指針就是FileDescriptor(下面簡(jiǎn)稱FD),F(xiàn)D是一個(gè)動(dòng)態(tài)的概念,是進(jìn)程中調(diào)用create后open文件操作是返回的一個(gè)Long值,當(dāng)文件關(guān)閉時(shí)這個(gè)FD也就失效了,所以同一個(gè)文件如果被打開兩次獲取到的FD會(huì)是不同的。進(jìn)程打開文件的情況如下圖所示,在進(jìn)程中維護(hù)了一張表記錄所有打開的文件,每一條記錄表示一個(gè)FileDescriptor,每個(gè)進(jìn)程在開始時(shí)都默認(rèn)打開了三個(gè)文件,F(xiàn)ileDescriptor分別是0,1,2,既stdin, stdout和stderr。FD記錄中包含了一張F(tuán)ileTable,記錄了文件的狀態(tài)信息,offset和V-node指針,V-Node指針才真正指向了磁盤上的文件實(shí)體。(這里的V-Node是在inode之上抽象出來(lái)的概念,因?yàn)閕-node在不同的文件系統(tǒng)中會(huì)有實(shí)現(xiàn)上的差異,V-Node是為了統(tǒng)一不同文件系統(tǒng)的接口抽象出來(lái)的一層,在Linux中V-Node被稱為 FileSystem independent INode ,而INode 稱為FileSystem dependent Inode,我們可以簡(jiǎn)單的理解為 V-Node就是INode)。

當(dāng)一個(gè)文件被多個(gè)進(jìn)程共享讀寫時(shí),可以看如下圖:

這里進(jìn)程A的fd3和進(jìn)程B的fd4其實(shí)指向的是同一個(gè)實(shí)體文件,但是這兩個(gè)進(jìn)程維護(hù)了兩張不同的文件表,維護(hù)了不同的offset位置。所以如果進(jìn)程不是采用append方式寫文件,兩個(gè)進(jìn)程寫入的內(nèi)容可能出現(xiàn)相互覆蓋。這里也可能看到雖然FD不同,但是可以指向同一個(gè)實(shí)體文件,也說(shuō)明了用FD來(lái)判斷文件唯一性是不靠譜的。
關(guān)于FD和INode,還有關(guān)于緩存的重要注意事項(xiàng)。
由于操作系統(tǒng)在接收到文件寫請(qǐng)求時(shí)可能將寫入內(nèi)容放到緩存中,所以提供了flush和sync等操作來(lái)將緩存中的內(nèi)容強(qiáng)制刷入磁盤。但是這兩個(gè)操作作用是不同的。
flush會(huì)將數(shù)據(jù)刷入到FileDescriptor中,但是不會(huì)刷入Inode
sync/fsync/fdatasync則會(huì)強(qiáng)制將FD中的數(shù)據(jù)刷入Inode中。

三、 Java操作文件的接口

最后需要注意的一點(diǎn)是,雖然在文件的存續(xù)期間,inode可以認(rèn)為是識(shí)別該文件的唯一標(biāo)識(shí),但是文件系統(tǒng)對(duì)inode有回收重用的機(jī)制,在文件被刪除之后,原來(lái)的inode可以被分配給新創(chuàng)建的文件,這種情況下,如果一味以inode相同來(lái)判定新舊文件是不是同一個(gè)文件可能會(huì)出現(xiàn)錯(cuò)誤;應(yīng)對(duì)這種情況確實(shí)也沒(méi)有更好的辦法,一種解決方法是,提取文件中部分內(nèi)容的MD5或SHA-1這種指紋信息作為標(biāo)識(shí),以inode+md5是否相同來(lái)決定是否是同個(gè)文件。

免費(fèi)領(lǐng)取驗(yàn)證碼、內(nèi)容安全、短信發(fā)送、直播點(diǎn)播體驗(yàn)包及云服務(wù)器等套餐

更多網(wǎng)易技術(shù)、產(chǎn)品、運(yùn)營(yíng)經(jīng)驗(yàn)分享請(qǐng)?jiān)L問(wèn)網(wǎng)易云社區(qū)。

文章來(lái)源: 網(wǎng)易云社區(qū)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/25350.html

相關(guān)文章

  • 初探Linux---Linux文件系統(tǒng)概覽

    摘要:六文件類型與目錄結(jié)構(gòu)支持很多文件類型,其中非常重要的文件類型有普通文件,目錄文件,鏈接文件,設(shè)備文件,管道文件,套接字文件等。套接字文件套接字文件被用于網(wǎng)絡(luò)進(jìn)程之間的通信,既可以使臺(tái)不同的機(jī)器進(jìn)行通信,也可以用于本機(jī)的網(wǎng)絡(luò)程序。一、Linux簡(jiǎn)介類Unix系統(tǒng): Linux是一種自由、開放源碼的類似Unix的操作系統(tǒng)Linux內(nèi)核: 嚴(yán)格來(lái)說(shuō),Linux這個(gè)詞本身只表示Linux內(nèi)核Linu...

    Tecode 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<