前面博客講解的是內存級文件管理,接下來介紹磁盤級文件管理
文件系統分為兩部分
- 內存級文件系統 : OS加載進程 ,進程打開文件, OS為文件創建struct file?和文件描述符表 ,將進程與打開的文件相連,?struct file 內還函數有指針表,?屏蔽了底層操作的差異,struct file中還有內核級文件緩沖區(提高效率)
- 磁盤級文件系統:?管理磁盤上的文件
磁盤結構
它通過磁性材料或閃存技術將數據持久化存儲,即使在斷電后數據也不會丟失
主要分為機械硬盤(HDD)和固態硬盤(SSD)
今天我們講解機械硬盤
機械硬盤(HDD,Hard Disk Drive)
工作原理:
使用磁性材料涂覆的旋轉盤片存儲數據, 比如磁性南極代表1 ,磁性北極代表0(打比方)
通過磁頭在盤片上移動來讀寫數據
定位扇區
CHS尋址模式
????????在硬盤的傳統尋址模式中,數據是通過柱面(Cylinder)、磁頭(Head)、扇區(Sector)的組合來尋址的,這種方式被稱為CHS尋址(Cylinder-Head-Sector)
????????扇區:?磁盤存儲數據的基本單位 ,512字節, 因此,磁盤是塊設備
????????柱?上的每個磁道,扇區個數是?樣的
注意: C H都是從0編碼 ,S從1編碼
真實過程??個細節:傳動臂上的磁頭是共進退的
LBA邏輯塊尋址模式
????????LBA(Logical Block Addressing)邏輯塊尋址模式。在 LBA 模式下,我們知道硬盤上的一個數據區域由它所在的磁頭、柱面(也就是磁道)和扇區所唯一確定。
????????在LBA地址中,地址不再表示實際硬盤的實際物理地址(柱面、磁頭和扇區)。LBA編址方式將 CHS這種三維尋址方式轉變為一維的線性尋址,它把硬盤所有的物理扇區的C/H/S編號通過一定的規則轉變為一線性的編號,系統效率得到大大提高,避免了煩瑣的磁頭/柱面/扇區的尋址方式。
????????在訪問硬盤時,由硬盤控制器再這種邏輯地址轉換為實際硬盤的物理地址。
????????OS只需要使?LBA就可以了!!LBA地址轉成CHS地址,CHS如何轉換成為LBA地址。誰做啊??磁盤?自己來做!固件(硬件電路,伺服系統)
LBA與C/H/S 之間的轉換:
LBA =柱面號C*單個柱面的扇區總數 +?磁頭號H*每個磁道扇區的數量+?扇區號S-1
? ? ? ?=柱面號*(磁頭數*每個磁道扇區數)+磁頭號H*每個磁道扇區的數量+?扇區號S-1
?
柱面號C = LBA//(磁頭數*每磁道扇區數)? ?就是單個柱面的扇區總數
磁頭號H =(LBA% (磁頭數* 每磁道扇區數)) //?每磁道扇區數
扇區號S =(LBA%?每磁道扇區數)+1
//?代表除法向下取整
????????所以:從此往后,在磁盤使用者看來,根本就不關心CHS地址,?是直接使?LBA地址,磁盤內部自己轉換。所以: 從現在開始,磁盤就是?個? 元素為扇區? 的?維數組,數組的下標就是每?個扇區的LBA地址。OS使用磁盤,就可以??個數字訪問磁盤扇區了。
在磁盤如何管理文件
引入"塊"概念
????????其實硬盤是典型的“塊”設備,操作系統讀取硬盤數據的時候,其實是不會?個個扇區地讀取,這樣 效率太低,?是?次性連續讀取多個扇區,即?次性讀取?個”塊”(block)。
?????????硬盤的每個分區是被劃分為?個個的”塊”。?個”塊”的??是由格式化的時候確定的,并且不可 以更改,最常?的是4KB,即連續?個扇區組成?個”塊”。”塊”是?件存取的最?單位。
注意:
- 磁盤就是?個三維數組,我們把它看待成為?個"一維數組",數組下標就是LBA,每個元素都是扇區
- 每個扇區都有LBA,那么8個扇區?個塊,每?個塊的地址我們也能算出來.
- 知道LBA:塊號 = LBA / 8
- 知道塊號:LAB=塊號*8+n? (n是塊內第幾個扇區 1<= n <=8)
引入"分區"概念
????????其實磁盤是可以被分成多個分區(partition)的,以Windows觀點來看,你可能會有?塊磁盤并且將 它分區成C,D,E盤。那個C,D,E就是分區。分區從實質上說就是對硬盤的?種格式化。但是Linux的設備 都是以文件形式存在,那是怎么分區的呢?
????????柱面是分區的最?單位,我們可以利?參考柱?號碼的?式來進?分區,其本質就是設置每個區的起 始柱?和結束柱?號碼。此時我們可以將硬盤上的柱?(分區)進?平鋪,將其想象成?個?的平面,如下圖所示:
????????柱面大小?致,扇區個位?致,那么其實只要知道每個分區的起始和結束柱?號,知道每 ?個柱面多少個扇區,那么該分區多?,其實和解釋LBA是多少也就清楚了.
也就是OS管理磁盤,通過分治思想,將磁盤進行分區處理,但分出的區大小還有幾百GB ,進一步對區分組?分成Block Group ,直接將每個組管理好即可.
- 文件 =?內容+屬性?
- 文件內容存儲在(Block Group)組的 Data blocks中
- 文件屬性也是數據 ,linux中?文件的屬性數據(比如文件的創建者、文件的創建日期、文件的大小等等)以數據結構(inode)的方式?存儲
- 一個文件一個inode ,inode大小有128字節?或者256字節, inode又存在?inodetable中
- ls -l -i? ? 可以打印出文件詳細信息? ?包括文件的inode值