理解操做系統之存儲管理

本文是介紹操做系統存儲管理的入門級文章,旨在介紹操做系統中存儲管理的通常內容,本文主要圍繞如下話題展開。算法

  • 計算器系統中的存儲結構
  • 程序的連接和裝入的概念
  • 程序存儲空間的分配
    1. 連續存儲空間分配
    2. 離散存儲空間分配(分頁存儲,分段存儲,段頁式存儲)
  • 虛擬存儲器
    1. 請求分頁存儲
    2. 請求分段存儲
    3. 置換算法

一丶計算機系統中的存儲結構

計算機系統中的存儲結構
上圖中描述了計算機系統中的通常存儲結構,從左往右存儲資源的價格愈來愈便宜,可是存取的速度愈來愈貴。本文研究的存儲管理指的主存管理以及少部分磁盤和主存之間的交互。

  • CPU寄存器,這是最昂貴的存儲資源,裏面通常緩存了些極其重要且頻繁使用的數據。好比地址變換表的基地址等信息。
  • 高速緩存,是爲了提升CPU資源利用率而設計的存儲結構,存放的時最近使用以及未來會使用的數據。越靠近CPU側存取速度越快,存儲價格越高。
  • 主存,這是最主要的存儲區域。運行中的程序(進程)都是被加載到主存中的。
  • 磁盤,這是生活中最接觸的存取區域,通常存放可執行文件,資源文件,配置文件等。IO操做就是指對磁盤進行的讀寫操做。不少場景下IO操做是系統性能的瓶頸

二丶程序的連接和裝入

  1. 裝入編程

    這是一個比較容易理解的概念,將位於硬盤上的代碼加載至內存中的過程即爲裝入。在裝入的過程當中,存在一個轉換的過程。該過程將程序代碼中的邏輯地址轉換物理內存中絕對地址。不一樣的地址轉換方式對應三種不一樣裝入方式緩存

  • 絕對裝入函數

    在程序代碼編寫的過程就肯定了存儲的物理地址。此時邏輯地址和物理地址保持一致。在如今操做系統中不會採用這種方式性能

  • 可重定位裝入操作系統

    在程序加載到內存地址中是,其能夠存儲到內存的任意位置。物理地址 = 邏輯地址(相對地址) + 物理內存加載處的起始地址。 可重定位的裝入方式比絕對裝入靈活多了,可是其存儲地址在剛載入內存後就固定了,後續不能夠移動存儲位置。在如今操做系統中也不使用這種方式設計

  • 運行時裝入cdn

    目前主流的裝入方式,其在程序加載到內存時,不會將邏輯地址轉換物理地址,僅僅在程序代碼被執行時,纔將邏輯地址轉換爲物理地址。 運行時裝入,容許程序在在讀內存後,依舊可以在存儲空間中移動。能知足內存整理等場景的要求。blog

  1. 連接進程

    連接也是一個比較易懂的概念,和裝入的過程頗爲類似。程序在通過編譯以後,將造成多個目標模塊,將這多個目標模塊組合成一個總體的過程即爲連接。根據這些目標模塊組合的不一樣時機,連接分爲如下三類

  • 靜態連接

    在程序運行之間,就將像目標模塊以及庫函數合=連接成一個總體模塊。

  • 裝入時連接

    在裝入目標模塊的時候,一邊裝入一邊連接

  • 動態連接

    在使用到相關程序邏輯的時候,開始連接。

三丶程序存儲空間的分配

在程序執行完連接和裝入過程後,位於硬盤上的代碼就將載入內存中。此處必需要爲程序分配其所須要的存儲空間。依據分配存儲空間是否連續這一特色,可將存儲空間的分配分爲連續分配以及離散分配

  1. 連續存儲空間分配

    • 單一連續存儲分配

      該種方法適用於單用戶,單任務的操做系統。其將主內存分爲系統內存和工做內存。系統內存負責載入操做系統等內容。工做內存僅載入需執行的任務,每一個被加載的任務將獨佔內存。系統內存和工做內存之間相互獨立。

    • 固定存儲分配

      該方法適用於適用於多任務操做系統。其將主內存分爲多個大小相等的子內存區域,當存在任務加載需求的時候,將任務加載去子內存區域。該方法採用的固定分區,靈活性不夠。不能解決分區過大致使的內存碎片的問題,也不能解決分區太小致使沒法載入大做業的問題。(也能夠將內存固定劃分爲不等的子內存區域,又稱爲不等分區固定分配)

    • 動態存儲空間分配

      在任務加載進內存時,依據任務所需內存大小實現按需分配。動態存儲空間分配,看似解決了內存碎片問題,實際上並非這樣的。在動態存儲空間分配時,屢次內存分配操做,會產生一系列地址不聯繫,大小各異的內存空間。當這些內存空間被回收後,將退化成不等分區的固定存儲分配。

    • 可重定位的分區分配

      該存儲方式,在動態存儲空間分配上添加了內存整理功能。若當前內存空間不能知足任務所需內存空間時,其會將已分配的內存空間所有移動,使未分配的內存空間造成一片連續的地址空間。該種方法則要求程序的裝入方式是動態裝入

    上述介紹的四種存儲空間分配方法被稱爲連續的分配是由於其不能分割做業存儲。只能將做業存儲在一塊連續內存空間中,並不能將做爲劃分紅更小的單位進行分塊存儲。

  2. 離散存儲空間分配

    離散存儲空間分配是指,其能將任務分割成更小的存儲單位。分割後的存儲單位連續存儲,而存儲單位與存儲單位之間並不要求連續。經過將任務拆分進行存儲的方法,能極大的提升存儲空間的利用率。

    • 頁式存儲空間分配

      這裏將定義爲一個固定大小的存儲單位。在將任務載入內存時,一個完整的任務能夠被劃分紅多頁。每頁獨立的存儲到內存空間中,內存空間中存儲位置可用物理頁號描述。每頁的存儲是連續,頁與頁之間的存儲並非連續的,而是離散存儲的。 爲了創建任務的地址與物理空間地址之間的聯繫。在內存表中將創建頁表,完成頁號到物理號的映射

    頁表

    • 段式存儲空間分配

      段式存儲的方法和頁式存儲的方法手段都是一致。將任務以**段爲存儲單位,將任務分紅多段進而離散存儲。**在內存中一樣維護了一張段表。段表和頁表結構是一致的。

      段表
      那麼頁式存儲和段式存儲這二者的差異究竟何在呢? 如下是頁式存儲和段式存儲的差異

      • 頁是信息的物理單位,分頁式爲了減小內存碎片,提升內存利用率而提出的。段是信息的邏輯單位,它包含一組完成的邏輯意義,其不只能提升內存利用率,並且在方便編程,信息共享,信息保護等方面均有好處。
      • 頁的大小是有操做系統固定設計的,在系統中頁的大小是固定且惟一的。段長度並非固定的,取決於用戶所編寫的程序,一般由編譯程序在對源程序進行編譯時,根據信息的性質決定。
    • 段頁式存儲空間分配

      該存儲方式其實是,分頁存儲和分段存儲的組合。先將任務按照段進行劃分,而後每段按照分頁的方式進行存儲,即爲段頁式存儲。下文將比較分頁存儲,分段存儲,以及段頁式存儲內存地址的變化

      • 分頁存儲地址(頁號:頁內偏移地址)
      • 分段存儲地址(段號:段內偏移地址)
      • 段頁式存儲(段號段內偏移頁號:頁內偏移地址)

四丶虛擬存儲器

虛擬存儲器是如今操做系統普遍使用的一種存儲方式,虛擬存儲能在不對物理內存擴容的基礎上,保證可以運行更多更大的內存任務。虛擬存儲器和常規存儲器的不一樣之處在於,虛擬存儲器不要求你任務一次性所有載入內存,而是按需載入內存。而且能在內存空間受限時,將閒置的內存做業調出內存,這種將內存做業調出內存的過程稱爲置換,完成置換過程的方式則稱爲置換算法。在上述過程當中,不將做業一次性徹底載入內存,顯然是創建在分頁存儲或者分段存儲的基礎上,下文對這兩種狀況分別介紹

  • 請求分頁存儲

    請求分頁存儲具備兩點內容須要理解:

    1. 分頁加載,按需加載

      請求分頁存儲將任務以頁爲單位進行劃分,在載入內存時,並不將所有頁面載入。而是將部分必須的頁面載入內存,其餘的頁面在程序運行中,若使用則按需載入內存。

    2. 分頁置換

      在內存空間緊張時,會將程序中某些使用或者近期不在使用的頁面,從內存置換到磁盤中去。

    在請求分頁存儲中,內存中維護的頁表再也不是簡單的頁號到內存物理號之間的映射了。其頁表結構通常以下:

    • 頁號,這個字段表明分頁順序
    • 物理塊號,這個字段表明,該頁在內存中的位置
    • 狀態位P,該狀態位用來標識該頁是否載入內存,true表明載入內存,false表明未載入內存
    • 訪問字段,該狀態位是統計狀態位,能夠用來記錄該頁最近被訪問的次數
    • 修改位,該位用來標識,該頁載入到內存後是否被修改過了。若內存中修改事後,其置換到外存時,須要回寫回去。若是沒有修改過,那麼其置換到外存時,無須回寫回去。
    • 外存地址,該位存儲該也在外存中的地址。通常來講,在載入內存後,外存上依舊會留有一一份拷貝信息。
  • 請求分段存儲

    請求分段存儲與請求分頁存儲及其類似。惟一的區別即是,載入和置換的單位從轉換到了

  • 置換算法

    置換算法,在虛擬存儲器中是很是重要的內容。在虛擬存儲器設計理念中,當內存資源緊張的時候,會依據置換算法將內存中的頁面置換到外存中。此處介紹兩種置換算法

    1. LRU(Least Recently used,最近最久使用算法)

      最近最久未使用算法,在頁面項中添加了訪問時間字段T,記錄最近一次訪問到目前過去的時間。在須要進行頁面置換時候,將T最大的頁面置換出去。

    2. LFU(Least Frequently used,最少使用算法)

      最少使用算法,在頁面項中添加了訪問頻率字段F,計算最近一段時間內該頁面被訪問的頻率。在須要進行頁面置換時候,將F最小的頁面置換出去

相關文章
相關標籤/搜索