linux內核的一些知識點(下)

內核以物理頁做爲內存的基本單位,內存管理單元(MMU)正式以頁做爲單位進行處理,內存管理單元硬件負責將虛擬地址轉爲物理地址。因此從虛擬內存的角度來看,頁就是最小的單位。node

多數32位體系結構的頁大小爲4KB,而64位體系結構則爲8KB。也就是說1G大小的內存會被劃分爲262144個頁來進行管理。linux內核使用page結構來描述物理頁,位於linux/mm_types.h中。這個結構體大小爲40B,對於頁大小爲8KB內存大小爲4GB的系統來講,要描述全部內存則須要524288個物理頁,總大小爲20MB。linux

內核會把頁劃分爲不一樣的區,將類似特性的頁分爲一組,有些頁位於內存特定的物理地址上,因此不能用於特定任務。因爲硬件的限制,內核須要對物理頁區分對待。好比某些硬件只能經過某些特定的內存地址來執行直接內存訪問。還有一些體系結構的內存物理尋址範圍比虛擬尋址範圍大,因而某些內存就不能永久地映射到內核空間上。算法

linux經過四種區來區份內存頁,後端

  • ZONE_DMA,表示能用來執行DMA操做。
  • ZONE_DMA32,表示能用來執行DMA操做,可是隻能被32位設備訪問。
  • ZONE_NORMAL,表示能正常映射的頁。
  • ZONE_HIGHEM,表示高端內存,其頁不能永久地映射到內核地址空間。

32位x86系統中,小於16MB的物理內存爲ZONE_DMA區,能用DMA操做。從16MB到896MB物理內存爲ZONE_NORMAL區,正常可尋址頁。高於896M的全部內存爲ZONE_HIGHEM區,動態映射頁。緩存

內核棧

內核的棧不能像用戶空間那樣奢侈分配,內核棧大小是固定的,每一個進程都分配到一個固定大小的內核棧。每一個進程的內核棧大小與體系結構和編譯選項有關,一般每一個進程有2個頁大小的內核棧,因此32位和64位的內核棧大小分別爲8KB和16KB。此外,中斷棧不共享進程的內核棧,中斷棧專門爲進程提供用於中斷處理程序的棧。網絡

虛擬文件系統

虛擬文件系統即VFS,屬於內核子系統,爲用戶空間提供文件和文件系統相關接口。全部文件系統都依賴VFS共存且協同工做,經過VFS可使用標準UINX系統調用完成文件操做。VFS讓用戶可以直接使用open、read、write等系統調用來實現不一樣物理介質的文件操做,它對不一樣文件系統進行抽象並提供統一的操做。數據結構

系統調用經過VFS接口提供給用戶空間使用,它實現了具體的文件系統細節。好比用戶空間調用write()函數,會間接調用sys_wirte()函數,而後調用具體的文件系統去與物理介質交互。機器學習

unix的文件系統提供了四種抽象概念:文件、目錄項、索引節點和安裝點。文件和文件相關信息進行分離,文件相關的信息保存在索引節點中,即inode。分佈式

VFS包括四個主要的對象類型:函數

  • 超級塊對象,表示具體的已安裝的文件系統。
  • 索引節點對象,表示文件的屬性描述。
  • 目錄項對象,表示目錄項,是路徑的組成部分。
  • 文件對象,表示進程打開的文件。

塊設備

可以隨機訪問固定大小數據的硬件設備稱爲塊設備,塊就是這裏固定大小的數據。常見塊設備有硬盤、軟盤、閃存等等。相對於塊設備,還有一類設備被稱爲字符設備。字符設備就是按照字符流的方式有序地訪問,好比串口、鍵盤等。數據的隨機訪問是區分它們的主要依據。內核沒有專門的子系統處理字符設備,但提供了專門的子系統來管理塊設備,由於塊設備的執行性能要求很高。

塊設備最小可尋址單元是扇區,是塊設備的基本單元,扇區大小爲2的整數倍,常見的是512字節。塊是最小邏輯可尋址單元,內核的全部操做都是按照塊來執行的,塊的大小不能超過頁大小。扇區也稱硬扇區或設備塊,塊也稱文件塊或I/O塊。

緩衝區

當一個塊被調入內存時會存儲在一個緩衝區中,每一個緩衝區與塊相對應。內核須要知道哪一個塊設備和對應哪一個緩衝區,因此須要一個描述符來描述,它使用buffer_head結構體來表示,即緩衝區頭。對於磁盤來講,它的做用就是來描述磁盤塊和物理內存緩衝區之間的映射關係。

請求隊列

塊設備會將掛起的I/O請求放到請求隊列中,該隊列由reques_queue結構體表示,是一個雙向鏈表。塊設備驅動程序會根據請求隊列的請求去操做塊設備。

磁盤I/O調度

磁盤尋址是最慢的操做之一,每次尋址都會耗費較多時間,因此須要儘可能提高尋址性能。爲了提高尋址性能,不能簡單地按請求順序去執行操做,而是會作一些合併和排序的預操做,以此來提高總體性能。內核中負責I/O請求的子系統稱爲I/O調度程序。

IO調度主要經過合併和排序來減小尋址時間,合併就是將兩個或兩個以上請求合併爲一個請求,好比扇區相鄰的請求就能夠合併,只需一次就能拿到屢次請求的數據。而排序就是讓整個請求隊列按照扇區增加的方向有序地排序,這樣就能保證磁盤頭以直線方向移動,從而縮短尋址時間。

  • linus電梯調度,當有新請求加入隊列時會先檢查是否能夠合併,包括向前向後合併。
  • deadline調度,爲了解決linus電梯帶來的飢餓問題而提出deadline調度,一個對磁盤同一位置的操做流可能會致使較遠的請求沒法獲得運行機會。deadline調度引入了超時時間來解決這個問題,保證請求最多等待不超過超時時間。
  • 預測IO調度,它提供了良好的讀響應和吞吐量,提交請求後不直接返回處理其餘請求,而是有意空閒片刻來處理應用提交的其它讀請求,結束後纔回到原來位置,繼續往下執行。
  • 徹底公正排隊IO調度,它以時間片輪轉來調度請求隊列,每一個隊列中會被選中若干請求去執行。每一個進程都有本身的等待隊列,從而保證每一個進程能有公平的磁盤資源。

進程地址空間

內核除了管理自身內存外還要管理用戶空間的進程的內存,這個內存就是進程地址空間,即用戶空間看到的內存。linux採用虛擬內存技術,每一個用戶進程都以虛擬方式來共享內存,對某個進程它就像能訪問全部物理內存。

進程地址空間由進程可尋址的虛擬內存組成,內核容許進程使用虛擬內存中的地址。一個進程的地址空間能夠與另一個進程的地址空間相同,它們彼此不相干,便是線程。

進程只能訪問有效內存區域的內存地址,每一個內存區域具備相關權限,若是一個進程訪問不在有效範圍內的內存區域,則內核會將該進程終止。

內存區域包括如下對象:

  • 可執行文件代碼的內存映射,即代碼段。
  • 可執行文件的已初始化全局變量的內存映射,即數據段。
  • 未初始化全局變量的內存映射。
  • 進程用戶空間棧的零頁內存映射。
  • 動態連接共享庫的代碼段、數據段、未初始化全局變量。
  • 內存映射文件。
  • 共享內存段。
  • 匿名內存映射,好比由malloc()分配的內存。

內核經過mm_struct結構體來描述進程的地址空間,它包含了全部相關信息。

頁表

當程序訪問一個虛擬地址時須要將虛擬地址轉爲物理地址,而後CPU才能解析地址訪問請求。地址的轉換須要經過查頁表來完成,將虛擬地址分段,使每一個虛擬地址都做爲一個索引指向頁表,頁表則會指向下一級的頁表或最終的物理頁面。

linux使用三級頁表來完成地址轉換,利用多級頁表可以節約地址轉換須要佔用的存放空間。頂級頁表是頁全局目錄,二級頁表是中間頁目錄,最後一級頁表指向物理頁面。每一個進程都有本身的頁表,線程則會共享頁表。

頁高速緩存

頁高速緩存是linux內核實現的磁盤緩存,做用是減小磁盤的IO操做。主要是將磁盤數據緩存到物理內存中,從而讓對磁盤的訪問變爲對物理內存的訪問。這個主要的思想就是數據被一旦被訪問,那麼它極可能短時間會再次被訪問。

寫緩存策略

  • 不緩存策略,高速緩存不換成任何寫操做。
  • 寫操做自動更新內存緩存和磁盤文件策略。
  • 回寫策略,寫操做直接寫到緩存中,後端存儲不會當即更新,而是將被寫入的頁面標記爲髒,並加入到髒頁鏈表中。而後由回寫進程週期將髒頁鏈表寫回到磁盤中。

緩存回收策略

  • 最近最少使用,LRU,回收最老時間戳的頁面。
  • 雙鏈策略,活躍鏈表和非活躍鏈表,活躍鏈表的不會被換出,而非活躍鏈表的會被換出。

設備類型

  • 塊設備,提供對數據的隨機訪問,好比硬盤、光碟、閃存等。
  • 字符設備,提供數據的流式訪問,好比鼠標、鍵盤、打印機等。
  • 網絡設備,提供對網絡的訪問,好比internet。網絡設備打破了unix一切皆文件的設計思想。

有些設備是虛擬的,僅僅提供訪問內核功能而已,稱爲僞設備。好比內核隨機數發生器、空設備、零設備、滿設備、內存設備。

專一於人工智能、讀書與感想、聊聊數學、計算機科學、分佈式、機器學習、深度學習、天然語言處理、算法與數據結構、Java深度、Tomcat內核等。

相關文章
相關標籤/搜索