1. 程式人生 > >JAVA File類 分析(二)

JAVA File類 分析(二)

本章開始介紹UNIX檔案系統。

檔案系統是如何管理檔案的呢?那咱們要先檔案的儲存介質開始--磁碟

磁碟是計算機系統的一個硬體裝置,檔案系統為了能夠管理磁碟,對其進行了三層抽象(本文所有內容均指UNIX檔案系統,windows檔案系統有興趣的同學自行研究!~)

第一層抽象:將一整塊磁碟分割槽

第二層抽象:將磁碟分割為block

第三層抽象:將block 邏輯上劃分為四個區域

第三個層次也就是咱們要研究的部分

Unix系統的分割槽如下:

引導塊 超級塊 i節點表 檔案儲存區
(1)引導塊:0號塊,是每個檔案系統的第一塊,儲存的是用於系統啟動時引導執行作業系統的核心程式,當整個檔案系統由多個檔案系統構成時,只有根檔案系統的引導塊才有效。

(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 找到了。

今天就到這裡,接下來將討論檔案屬性和目錄