從原理敘述索引節點、索引節點號、文件描述符的區別

要理解索引節點(inode)是什麼,要從文件的存儲開始說起,文件存儲在磁盤上是一塊(塊也稱為物理記錄)為單位的,每個塊包括多個扇區,每個扇區大小為512字節,關於文件存儲知識在擴充一下,其實是這樣的:文件裡面的數據先存在邏輯記錄上,然後打包存在物理記錄上(塊)比如一個文件的數據大小為1949B通過一個字節一個字節的記錄在邏輯記錄上,那麼文件就會分到4塊(2048B)的磁盤容量,因為存儲的最小單位為塊,要容納1949B就要2048B的大小,那麼就有99B會浪費,浪費的部分稱為內部碎片。若是不記錄到邏輯記錄上,而是按照文件的大小平均分配塊的話浪費的會更多,比如有2字節的文件,若是按照1字節存入一個快,那麼內部碎片就會更大!!!其實通過採用邏輯記錄的方法,好比往杯中倒水,每一個空間儘量的用到,直到利用率最大化。

好了,把數據存起來後,那怎麼知道是哪個用戶存的???所以就有了索引節點用來存儲文件的信息:文件的權限、擁有者、大小、數據的位置等等,具體如下:

1:文件的字節數

2:文件擁有者的User ID

3:文件的Group ID

4:文件的讀、寫、執行權限

5:文件的時間戳,共有三個:

ctime指inode上一次變動的時間

mtime指文件內容上一次變動的時間

atime指文件上一次打開的時間。

6:鏈接數,即有多少文件名指向這個inode

7:文件數據block的位置

可以輸入:stat + 文件名查看:

從原理敘述索引節點、索引節點號、文件描述符的區別

對於索引節點號其實也就是索引節點的一個別名,操作系統通過這個索引節點號來識別文件,若是通過文件名來識別,那多麻煩啊!!!程序上可以通過這個方法(我自己想的,借鑑了win32句柄hwnd的方法,當然操作系統不是這麼做的),因為每個文件都有一個索引節點,索引節點也要被存儲下來,每個索引節點都有一個地址,關鍵是這個地址還不同,所以把地址強制轉化為int型,並賦值給索引節點號,就能識別每一個文件了。所以嘛,多看高端人寫的代碼還是很有好處的->_->

對於文件描述符,先說說兩個概念:系統範圍內的打開文件表、單個進程的打開文件表,我們再來說說open()函數的機制:是這樣的若是一個進程調用這個函數,那麼首先系統範圍內的打開文件表會記錄該文件,也就是根據文件名搜索目錄,並將目錄條目複製到系統範圍內的打開文件表中,同時對於進程的打開文件表也會記錄同樣的信息,並通過指針指向整個系統範圍內的打開文件表,若是又有一個進程用同樣的方法調用open()函數要打開該文件,只是在進程的打開文件表中添加一個條目,並指向整個系統範圍內的打開文件表,由於系統的存在,所以沒必要添加了,那麼open()函數返回一個紙箱單個進程的打開文件表的指針,之後所有的操作都是通過該指針,那麼這個指針就是所謂的文件描述符,描述符,描述符,描述了這樣的一些信息:文件指針、文件打開計數器、文件磁盤的位置、訪問權限等。對於文件打開計數器,我們可以進一步的深入理解關閉文件到底是個什麼意思,就是因為文件打開計數器這個東東記錄了,有多少個進程在訪問該文件,每當一個進程調用close()函數時該值就會減少,單個進程的打開文件表就會刪除相應的該文件信息,但是系統範圍內的不會刪除,只有文件打開計數器的值減少到0以後,系統範圍內的打開文件表就會刪除該文件相關的信息,這個時候才叫真正的關閉文件!!!其實還可以解釋一個現象:當打開兩個同一個記事本,有個記事本什麼都沒寫,一個記事本記錄了數據,當你關閉文件時會提示你保存數據否,若是保存,在關閉那個什麼都沒寫的記事本後,再次打開時,這個記事本依然會有記錄(原因就是多個單個進程打開文件表都指向了系統範圍內的打開文件表),其實也算是一種共享的方式!!!

若是理解有錯誤,還請指出來,以免誤人子弟哈,大家一起進步!!!


分享到:


相關文章: