JAVA File類 分析(二)
本章開始介紹UNIX檔案系統。
檔案系統是如何管理檔案的呢?那咱們要先檔案的儲存介質開始--磁碟
磁碟是計算機系統的一個硬體裝置,檔案系統為了能夠管理磁碟,對其進行了三層抽象(本文所有內容均指UNIX檔案系統,windows檔案系統有興趣的同學自行研究!~)
第一層抽象:將一整塊磁碟分割槽
第二層抽象:將磁碟分割為block
第三層抽象:將block 邏輯上劃分為四個區域
第三個層次也就是咱們要研究的部分
Unix系統的分割槽如下:
引導塊 | 超級塊 | i節點表 | 檔案儲存區 |
(2)超級塊:1號塊,通常也成為管理塊,是檔案系統的第二塊,也是檔案系統的頭,存放安裝和管理檔案系統的全部管理資訊,包括檔案系統大小、檔案系統所在的裝置區、i節點表大小、空閒空間大小、空閒連結串列頭等。
(3)i節點表:由若干塊構成的一片磁碟區域,i節點表在超級塊中指明,一個i節點號對應一個檔案,i節點相關內容如下:
mode |
type |
uid |
gid |
link.no |
size |
addr.pt |
time |
佔用標誌,0:空,1:佔用 |
檔案型別 |
屬主 |
屬組 |
連結數 |
大小 |
指向檔案實際資料塊的指標 |
最近訪問/修改日期時間 |
每個檔案系統的屬性,如大小,檔案的所有者,最近修改時間等,都記錄在I-節點的結構中,所有的I-節點都有相同的大小
(4)檔案儲存區:除了前三部分外,其餘空間都是檔案儲存區,該區佔了整個儲存空間的絕大部分。
生命短暫,咱們還是通過例項來看
一、建立檔案:檔案系統是如何分配這三個區域的
執行一個cat spwd.c > test 如圖:
建立的過程如下圖
建立一個檔案主要有四個操作
1、找到一個空i-節點儲存檔案屬性
2、核心從free的資料block中找出能夠儲存檔案大小的幾個block,儲存資料圖中是找出A,B,C三塊
3、將A,B,Cblock記錄到第40個block i節點上(i-節點,一共能儲存13個block,僅僅能儲存10個數據block,後3個空間在存在大檔案使用,11塊叫二級間接塊,12塊叫三級間接塊,13呢?那就說明檔案太大了,需要重新定義block的大小,block大了,自然i-節點就可以放下了)
4、將i-節點 新增到目中,對映關係是40:test,目錄下邊將討論
二、什麼是目錄
目錄是一種包含檔名字列表的特殊檔案,不同的系統實現方式不同,但是,其抽象模型基本一致-------i-節點和檔名列表。知道這些 就差不多了。
三、檔案是如何被讀取出來的呢?
可以看做是建立檔案的逆操作。
1、去目錄 查詢與test檔名相同的i-節點號
2、去順序為40i-節點的記錄中 查詢blockA,B,C
3、讀取A,B,C
4、複製到使用者空間
需要注意是1,2,3 過程都是在核心空間中,第4步 才到使用者堆疊空間,這裡有涉及到了核心態和使用者態,依然不會再這裡討論,內容太多了。
以上僅僅是粗略的介紹,檔案系統涉及內容還有很多,比如大檔案的儲存,多個檔案系統的整合,虛擬檔案系統等
在結束本篇之前,再說兩句,一個block 是5 1 2位元組,我們經常使用的find 命令中size選項 的大小就是blcok為計算,find 命令的使用請自行查閱man find 手冊
至於是不是5 1 2位元組,那麼咱們就實踐一下,spwd是9368個位元組
執行一下 find . -type f -size +19
意思查詢當前目錄下type為檔案型別,大於19個block的檔案。
沒有找到,那麼咱們執行 find . -type f -size +18 (18*512=9126)
OK 找到了。
今天就到這裡,接下來將討論檔案屬性和目錄