工作也有兩年了,在研究很多項目時發現很多問題追根溯源都會到計算機底層的知識,也是越來越發現編程語言只是一層外殼,這個外殼需要去和操作系統協商使用後者管理的的計算機資源,包括存儲資源和計算資源。如果計算機底層知識不牢靠,遇到一些問題還真是不好分析,也很容易成爲職業上升的瓶頸。現在回想起大學時學習這麼課時是比較抽象的,那時沒有太多編程經驗,知識很難落地,造成了只知其然不知其所以然的情況,所以現在重新梳理一下計算機操作系統的一些底層知識,在這裏記錄一下。
我們最常使用的各種文件是進程創建的信息邏輯單元,同時文件也是對磁盤的一種建模模型。
文件系統是對磁盤的抽象,他用於管理文件和磁盤的使用,一塊磁盤有成千上萬個文件,每個文件都是獨立與其它文件的。
這裏先簡單的介紹一下磁盤的一些知識,磁盤盤片的示意圖如下所示:
盤片:磁盤中圓形的盤片是主要記錄數據的物理介質
扇區:爲磁盤的最小物理存儲單元,每個扇區的大小都是固定的,同時每個磁道的扇區數量都是相同的。
柱面:將扇區組成一個圓環就是柱面,柱面是磁盤分區的最小單位。
磁盤分區:就是在分區表中記錄可以訪問的柱面範圍。
其中磁盤的第一個扇區是最重要的,這裏面記錄了硬盤的主引導記錄(Master boot Record)MBR,以及記錄磁盤的分區表。
我們常見的文件系統主要有FAT,ext2,ext3,NTFS等,下圖爲一個典型的文件系統的組織結構示意圖。
我們知道在使用一塊磁盤之前是一定要進行格式化的,而這個格式化的過程就是將文件系統的一些元數據寫入到磁盤中,比如描述正文件管理系統的超級塊,分區表信息,MBR信息,一旦格式化完成這些信息就很難修改了。磁盤屬於塊設備,每次操作系統讀磁盤都是一塊一塊的從磁盤讀取數據,下面我們主要通過linux系統下的ext2文件系統。
文件
在Linux系統中一個文件包含文件的權限(rwx)與文件屬性(所有者,羣組,時間參數),ext2文件系統將這些參數分別存放在不同的塊中,權限與屬相放置到inode中,至於實際的數據則放置到data block塊中。在格式化磁盤分區格式化的時候,就爲磁盤每個inode和block創建好了唯一的編號,每一個分區都有一個超級塊,這個超級塊記錄了文件系統的整體信息,包括inode與block的總量,使用量,剩餘量,同時在磁盤的使用過程中這些數據是實時變化的。
總結一下文件的存儲結構:
- super block:記錄文件系統的總體信息,包括inode/block的總量、使用量、剩餘量,以及文件系統的格式與相關信息。
- inode:記錄文件的屬性,一個文件佔用一個inode,同時記錄此文件的數據所在的block編號。inode篤定大小爲128bytes。
- block:實際記錄文件的內容,根據文件大小不同,佔用的block的個數也不同。block的大小有1k\2k\4k三種。
我們用上圖來說明一下inode與block的關係,假如一個文件的屬性與權限存在編號爲4的inode上,inode記錄了文件的存儲位置爲2、7、13、15這幾個block上。這樣操作系統就能在短時間內讀取出全部的數據。
inode和block在磁盤格式化之後就已經規劃好了,由於現在磁盤容量巨大,如果將所有的inode和block都放在一起是不容易管理的,所以,磁盤在格式化的時候是按照磁盤分區inode/block/super block分組進行格式化的。在本文的第一幅圖中我們可以看到,磁盤分區爲塊組0、塊組1、塊組2、塊組3等。
- 組描述符:這項描述的是每個組塊中block的起始編號。
- block塊位圖:這個位圖表是記錄block的使用狀態的,這裏面的值是要隨着添加和刪除文件變化的。
- inode位圖:功能類似於block塊位圖。
- 先確定用戶對於要添加文件的目錄是否有w和x的權限
- 根據根據inode bitmap和block bitmap找到沒有使用的inode和block,然後將數據寫入對於的磁盤位置
- 同步更新使用的inode bitmap和block bitmap
從虛擬內存的角度來說,虛擬頁和磁盤中的塊映射起來,當虛擬頁被加載到內存的物理頁的時候,就由DMA把虛擬內存對應的磁盤塊加載到內存的對應地址的物理頁中。當物理頁寫回到磁盤時,也是由DMA把數據傳輸到磁盤控制器,由磁盤控制器寫到磁盤塊對應的扇區。內存和磁盤交換數據的時候實際採用了內存的緩衝區來加速磁盤的訪問速度。
緩衝區的目的是適配兩個速度不一致的設備,從磁盤的工作原理我們看到磁盤操作是一個很慢的操作,內存操作相比磁盤操作是一個很快的操作,爲了讓內存對磁盤的讀寫不必等待磁盤操作返回再返回,操作系統設置了內存緩衝區來加速對磁盤的訪問速度。