1. 程式人生 > >操作系統-存儲器管理

操作系統-存儲器管理

源程序 每一個 一道 事件 設立 又是 分類 位置 物理

存儲器管理

存儲器的層次結構

技術分享圖片

程序的裝入和鏈接

用戶程序要在系統中運行的話,就必須裝入內存,然偶後將其轉變為一個可執行的程序。

  • 編譯

    由編譯程序對用戶源程序進行編譯,形成若幹個目標文件

  • 鏈接

    由鏈接程序將編譯後形成的一組目標模塊以及它們所需要的庫函數接在一起,形成一個完整的裝入模塊

  • 裝入

    由裝入程序將裝入模塊裝入內存

技術分享圖片

程序的鏈接

  • 靜態鏈接方式

    在程序運行前,就先將各個目標模塊以及它們所需要的庫函數鏈接成一個完成的裝配模塊,之後都不會拆開,這樣需要解決兩個問題:修改相對地址,變換外部調用符號

    技術分享圖片

  • 裝入時動態鏈接

    在用戶源程序編譯後得到的一組目標模塊,在把目標模塊裝入內存時,采用邊裝入邊鏈接的方式,在轉入目標模塊時,若發生一個外部模塊調用事件,將引起裝入程序去找出相應的外部目標模塊,並將其裝入內存,也需要修改目標模塊中的相對應的地址

  • 運行時動態鏈接

    在執行過程中,當發現一個被調用模塊沒有裝入內存時,立即由OS去找到該模塊,並將之裝入內存中,將其鏈接到調用者模塊上去

程序的裝入

  • 絕對裝入方式

    當計算機系統很小,且僅能運行單道程序,完全有可能知道程序將駐留在內存的什麽位置,此時可以采用絕對裝入方式,用戶程序經過編譯後產生絕對地址

  • 可重定位裝入方式

    在多道程序環境下,編譯程序時不可能知道編譯後的模塊地址放在在內存的什麽地方,它們的起始地址時候從0開始,程序的其他地址是相對於起始地址計算的,所有要采取可重地位方式,根據內存的情況裝入到內存中

  • 動態運行時的裝入方式

    可重定位裝入方式雖然可以將模塊裝入到內存中任意允許的地方,但是不允許程序在內存中移動位置,因為在具有對換功能的系統,一個進程可能會被多次換進換出,所有采用動態運行的裝入方式會比可重定位的轉入方式好,動態運行時裝入並不會立即把裝入模塊的邏輯地址轉換為物理地址,而是在程序真正運行的時候才會進行轉換,這種方式需要一個重定位寄存器的支持

程序裝入內存的問題解決了,但是內存又是怎麽為程序分配內存的?

分配存儲管理

連續分配

  • 單一連續分配

    在單道程序環境下,內存分為系統區和用戶區,系統區只留給OS時候,放在低地址部分,用戶區僅裝有一道用戶程序。

  • 固定分區分配

    將內存的用戶空間劃分為若幹個固定大小的分區,,並為之建立一張分區使用表,包含每個分區的起始地址,大小,狀態

  • 動態分區分配

    要實現動態分區分配,必須解決分區所用的數據結構,分區分配算法和分區的分配與回收這三個問題。

    • 數據結構

      • 空閑分區表
      • 空閑分區鏈
    • 分配算法

      • 基於順序搜索

        • 首次適應(FF)算法

          從鏈首開始順序查找,知道找到適合空閑分區大小,從中劃分進程所需要的內存空間,每次查找都是從低地址部分開始

        • 循環首次適應(NF)算法

          和首次適應算法差不多,但開始位置不再是從鏈首開始,而是從上次找到的空閑分區額下一個空閑分區開始

        • 最佳適應(BF)算法

          該算法要求將所有的空閑分區按其容量從小到大的順序形成一個空閑分區鏈表

        • 最壞適應(WF)算法

          掃描整個空閑分區表,總是挑選一個最大的空閑區,從中分割一部分存儲空間給進程使用。

      • 基於索引搜索

        • 快速適應算法

          將空閑分區根據容量大小進行分類,對於每一類具有相同容量的所有空閑分區,單獨設立一個空閑分區鏈表

        • 夥伴系統

          該算法規定無論已經分配分區或是空閑分區,大小都為2的K次冪,當2的i次冪的空閑分區不夠用的時候,會將2的i+1次冪的空閑分區拆分為兩個相等的2的i次冪分區,這兩個分區就稱為一對夥伴

        • 哈希算法

    • 分配操作

      • 分配內存

      事先規定最小的剩余分區大小size,當需要分配u.size大小內存的時候,從空閑分區表(鏈)中尋找到分區大小m.size,如果,u.size-m.size>size,那麽把剩余的空閑大小劃分出來,否則就直接全部分配。

      技術分享圖片

      • 回收內存

        回收內存有四種情況:

        • 回收區與插入點的前一個空閑分區F1相鄰,此時只需將回收區和插入點的前一個分區合並,不需要為回收區分配新表項,只需要修改前一個分區的F1的大小(圖a)
        • 回收區與插入點的後一個空閑分區F2相鄰,分區合並,用回收區的首地址作為新空閑區的首地址,大小為兩個之和。(圖b)
        • 回收區同時與插入點前後兩個分區鄰借,將三個分區合並,取消F2的表項,大小為者之和(圖c)

        技術分享圖片

        • 回收區既不與F1相鄰,與不與F2相鄰,這是要為回收區單獨建立一個新表項,填入回收區的首地址和大小
  • 動態可重定位分區分配:需要一個重定位寄存器

    在動態分區分配方式中,內存經過一段時間的分配回收後,內存中存在很多很小的空閑塊。它們每一個都很小,不足以滿足分配要求;但其總和滿足分配要求。這些空閑塊被稱為碎片。造成了存儲資源的浪費。

    碎片問題的解決: 緊湊技術(拼接):通過在內存中移動程序,將所有小的空閑區域合並為大的空閑區域。每次“緊湊”後,都必須對移動了的程序或數據進行重定位。

    技術分享圖片

    分配算法

    技術分享圖片

離散分配

  • 分頁存儲

    頁面:分頁存儲管理將進程的邏輯地址空間分為了若幹個頁,並為各個頁加以編號,這個頁叫做頁面,頁面大小為2的冪,通常為1KB~8KB

    物理塊:在內存的物理地址空間也分為了若幹個塊,稱為物理塊

    地址結構:它包含兩個部分,前一部分為頁號,後一部分為位(偏)移量,即頁內地址

    頁表:為了完成頁號到物理塊號的地址映射,采用了頁表。

    技術分享圖片

    快表:為了提高地址變換速度,增加了一個具有並行查找能力的高速緩沖寄存器,這個寄存器叫做快表或者TLB,有了快表之後,當快表中有CPU需要的內存地址頁號時,直接從快表中獲取,不需要訪問內存中頁表

  • 分段存儲

    段:將地址空間分為若幹個段,每一個段定義一組邏輯信息,段的長度並不一定相等,邏輯地址由段號和段內地址組成

    段表:和頁表一樣的,是一張段映射表

    技術分享圖片

    分段存儲和分頁存儲的區別:

    • 頁是信息的物理單位,段是信息的邏輯單位
    • 頁的大小是固定的,由操作系統決定,而段的長度是不確定的,決定於用戶所編寫的程序。
    • 分頁的用戶程序地址空間是一維的,而分段系統中,用戶的地址空間是二維的,程序員在標識一個地址時,需要給出段名,有需要給出段內地址。
  • 段頁式存儲

    基本原理:先將用戶程序分成若幹個段,再把每一個段分成若幹個也,並為每一個段賦予一個段名

    地址結構由段號,段內頁號,頁內地址三部分組成

技術分享圖片

操作系統-存儲器管理