Linux怎樣讀取一個文件/數據是怎麼恢復的?

First and Foremost 寫在最前面
本文會持續更新,在學朱有鵬老師的Linux多進程多線程ing,是對Linux_os最淺顯的理解

Linux讀取文件流程

文件IO效率和標準IO

在Linux裏面的叫做API,在C語言裏的叫做就庫函數

(1)文件IO就指的是我們當前在講的open、close、write、read等API函數

構成的一套用來讀寫文件的體系,這套體系可以很好的完成文件讀寫,但是效率並不是最高的。

(2)應用層C語言庫函數提供了一些用來做文件讀寫的函數列表,叫標準IO。

標準IO由一系列的C庫函數構成(fopen、fclose、fwrite、fread),

這些標準IO函數其實是由文件IO封裝而來的

(fopen內部其實調用的還是open,fwrite內部還是通過write來完成文件寫入的)。

標準IO加了封裝之後主要是爲了在應用層添加一個緩衝機制buffer

這樣我們通過fwrite寫入的內容不是直接進入內核中的buf,

而是先進入應用層標準IO庫自己維護的buffer中,

然後標準IO庫自己根據操作系統單次write的最佳count來選擇好的時機來完成write到內核中的buf

(內核中的buf再根據硬盤的特性來選擇好的實際去最終寫入硬盤中)。

如圖所示:
文件流程
第一個buffer是應用層的,第二個buffer是內核中的。

講完文件讀取流程,讓我們再來看看文件是怎樣被存放再硬盤中的:

文件在硬盤中的存儲

(1)文件平時都在存放在硬盤中的,硬盤中存儲的文件以一種固定的形式存放的,我們叫靜態文件。

(2)一塊硬盤中可以分爲兩大區域:

一個是硬盤內容管理表項,另一個是真正存儲內容的區域。

操作系統訪問硬盤時是先去讀取硬盤內容管理表,

從中找到我們要訪問的那個文件的扇區級別的信息,

然後再用這個信息去查詢真正存儲內容的區域,最後得到我們要的文件。

(3)操作系統最初拿到的信息是文件名,最終得到的是文件內容。

第一步就是去查詢硬盤內容管理表,這個管理表中以文件爲單位記錄了各個文件的各種信息,

每一個文件有一個信息列表(我們叫inode,i節點,其實質是一個結構體,
這個結構體有很多元素,每個元素記錄了這個文件的一些信息,
其中就包括文件名、文件在硬盤上對應的扇區號、塊號那些東西·····)

強調:硬盤管理的時候是以文件爲單位的,每個文件一個inode,

每個inode有一個數字編號,對應一個結構體,結構體中記錄了各種信息。

內存中被打開的文件和vnode(v節點)

(1)一個程序的運行就是一個進程,我們在程序中打開的文件就屬於某個進程。

每個進程都有一個數據結構用來記錄這個進程的所有信息(叫進程信息表),

表中有一個指針會指向一個文件管理表,

文件管理表中記錄了當前進程打開的所有文件及其相關信息。

文件管理表中用來索引各個打開的文件的index就是文件描述符fd,

我們最終找到的就是一個已經被打開的文件的管理結構體vnode

(2)一個vnode中就記錄了一個被打開的文件的各種信息,

而且我們只要知道這個文件的fd,

就可以很容易的找到這個文件的vnode進而對這個文件進行各種操作。
conclusion

  1. 創建一個進程,得到一個進程信息表
  2. 根據文件在硬盤中存儲的位置得到文件的fd(file describe)
  3. 只要打開一個文件就會創建一個文件管理表vnode,記錄了被打開文件的各種信息
  4. 得到以上三個信息就可以對文件進行讀寫操作了。
  5. 爲了避免對硬件的多次訪問,所以建立了緩存機制,每個緩存2M,通過lseek函數定位到自己想要修改的位置
  6. 兩個進程共享同一個文件的實現:o_append屬性。

數據恢復原理

聯繫平時實踐,大家格式化硬盤(U盤)時發現有:快速格式化和底層格式化。

快速格式化非常快,格式化一個32GB的U盤只要1秒鐘,普通格式化格式化速度慢。

這兩個的差異?其實快速格式化就是隻刪除了U盤中的硬盤內容管理表(其實就是inode),

真正存儲的內容沒有動。這種格式化的內容是有可能被找回的。

底層格式化是很難找回的,需要通過flash的記憶找回,費用很高。

請大家批評指正

over

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章