1. 程式人生 > >記憶體管理、分段、分頁

記憶體管理、分段、分頁

記憶體管理

為什麼要有記憶體管理

  多道程式作業系統中,程序的併發執行依賴於CPU排程。CPU能訪問的儲存器只有記憶體(處理器中的)暫存器(機器指令可以用記憶體地址作為引數)。
  暫存器價格昂貴且儲存空間小,因此程序執行的指令以及指令使用的資料主要還是儲存在記憶體上。(如果這些資料不在記憶體中,CPU在使用前也需要將資料移到記憶體中)。
  由上可見,CPU要執行的程序(指令和資料)需要儲存在記憶體中,(而記憶體的空間也是有限), 那麼如果進行記憶體的管理就是一個問題了。

如何進行記憶體管理

  要讓CPU執行的程序儲存在記憶體中,其實有兩個記憶體管理的方向

  • 1. 交換:
    在程序要執行時(佔有CPU)再移入記憶體,記憶體中的程序不在執行時就移出記憶體。 由於交換(程序的滾入和滾出)有較大的時間開銷,因而標準的交換應用並不廣泛。
  • 2. 在記憶體中儲存多個程序: 現代系統大多會在記憶體中儲存多個程序。

      我們知道作業系統本身儲存在核心中,進行記憶體管理要保證使用者程序不能訪問核心空間。另外,不同程序之間也不能互相訪問對方的記憶體空間,以免造成不合法的訪問。 因此,每個程序都應該有自己獨立的記憶體空間
      為了保證每個程序由自己獨立的記憶體空間,要為每個程序分配一塊記憶體空間,各個程序只能訪問分配給自己的記憶體空間。

地址繫結

  程序在調入CPU執行時,系統會為其分配記憶體空間。程序在執行時,需要通過記憶體地址訪問其要使用的資料。然而,我們並不知道系統為程序分配的記憶體地址空間是那一段,也就是說在程式執行之前,我們並不知道資料所儲存的實體地址。 這樣的話,程式如何使用自己記憶體空間的資料呢。 系統設計人員提出了邏輯地址

地址繫結的概念。
  地址繫結的原理其實就是不再使用絕對實體地址, 而是以系統分配給程序的起始地址作為基地址,然後通過相對地址(邏輯地址)來訪問資料。 這樣在程式執行時,系統再將邏輯地址根據繫結的對映關係轉化實體地址來訪問記憶體了。

連續記憶體的分配

  CPU能併發執行多個程序,作業系統要為這些程序分配核心空間。程序執行結束後,作業系統需要回收記憶體空間。各個程序需要的空間大小不一致,如果要為每個程序分配連續的記憶體空間,那麼就會產生許多記憶體浪費(碎片)。即每個空閒的空間都不足以儲存要執行的程序,但是有許多比該程序所需空間小的記憶體,(這些記憶體的總和可能遠大於要執行的程序所需的記憶體空間)。
  可以看出連續記憶體的分配有很大的侷限性。(儘管可以通過演算法進行一定的優化,但仍然不能滿足需求)。因此,為了提高記憶體空間的利用率,更好的方式就是支援給程序分配實體地址不連續的記憶體空間。 分頁和分段

是兩種互補的(可合併的)用於分配不連續實體地址的記憶體空間的方法。

分頁

  分頁的原理是,把程序的邏輯記憶體空間劃分為許多個固定長度的小片(稱之為頁、page)。對應的,實體記憶體空間也分為許多個固定長度的小部分(稱為幀 frame)。 每個頁對應一個幀(幀不需要連續)。 這樣,再記憶體管理時,一個程序最多也就產生最後一頁的一部分的空間浪費。幾乎不會到時大的碎片(空間開銷)。
頁表:
  分頁對記憶體管理的優化,最關鍵的就是使得分配給一個程序的記憶體不需要連續了,而是分配給程序一些不連續的幀。 既然如此,我們就需要為每個程序管理一張頁表,用於告訴程序它的頁分別對應到實體記憶體中的哪些幀。

分段

  分段的基本思想是:將使用者程式地址空間分成若干個大小不等的段,每段可以定義一組相對完整的邏輯資訊。儲存分配時,以段為單位,段與段在記憶體中可以不相鄰接,也實現了離散分配。

分頁與分段的主要區別

分頁和分段有許多相似之處,比如兩者都不要求作業連續存放.但在概念上兩者完全不同,主要表現在以下幾個方面:
(1)頁是資訊的物理單位,分頁是為了實現非連續分配,以便解決記憶體碎片問題,或者說分頁是由於系統管理的需要.段是資訊的邏輯單位,它含有一組意義相對完整的資訊,分段的目的是為了更好地實現共享,滿足使用者的需要.
(2)頁的大小固定,由系統確定,將邏輯地址劃分為頁號和頁內地址是由機器硬體實現的.而段的長度卻不固定,決定於使用者所編寫的程式,通常由編譯程式在對源程式進行編譯時根據資訊的性質來劃分.
(3)分頁的作業地址空間是一維的.分段的地址空間是二維的.
 

小結

記憶體管理其實就是管理如何在記憶體中儲存程序的資訊。

  • 我們可以在記憶體中儲存一個程序,也可以儲存多個程序。 如果記憶體中,儲存一個程序。那麼就需要在另一程序要執行時,將該程序交換進記憶體。這顯然要產生很多(程序滾入、滾出的)開銷。 因此 標準的交換 已經很少被用到。 (在虛擬記憶體的管理中,會發現一些改進的交換有了很廣泛的應用。)
  • 如果在記憶體中儲存多個程序,那麼程序的地址空間就不是從0地址開始了,而又可能發生變化。(不確定程序滾入時,程序的基地址)。這就有了地址繫結和邏輯地址的概念。
  • 多個程序如何在記憶體中儲存呢?連續儲存 開起來會產生很多碎片。 而分頁和分段則是優化記憶體管理的手段。