回覆列表
  • 1 # 使用者8185745889975

    頁式儲存方式,是以計算機的角度設計的,以便提高記憶體的利用率和計算機的效能,且分頁機制是透過硬體實現的。對使用者而言是完全透明的段式儲存器的引入,主要是為了滿足使用者在程式設計和使用上的要求。具體來說:

    1. 方便程式設計。因為人們寫的程式是分成了許多個段的,比如一個程式裡面有很多和函式等等

    2. 段的共享。實現程式和資料的共享,都是以資訊的邏輯單位為基礎的。比如一些公共函式,一些全域性變數等等。

    3. 動態連結。動態連結是程式在執行的過程中實現目標模組的連結,動態連結同樣要求以段為儲存管理的單位。(寫過dll的同學應該深有體會,裡面就是一些類庫)

    4. 動態增長。程式執行過程中,往往有些段,特別是資料段,會不斷的往上增長。而分頁確實固定的。

    5. 段的保護

    段式儲存的基本原理

    將程序對應的程式和資料段,按本身的特性,分成若干段,每段定義一組有意義的邏輯資訊單位。每個段有自己的名字,並從0開始編址。在記憶體中,每個段佔用一段連續分割槽。 由於程序的地址空間被分成很多個段,因此,在標識某一個程序的時候,我們需要同時給出它的段名跟段內地址。所以段式儲存的地址空間是二維的。假設有一個32位的邏輯地址欄位如下:

    類似於頁式儲存,作業系統同樣為每個程序建立一張段表。並透過查詢段表來找到相應的段號來實現邏輯地址到物理地址的對映。

    段式儲存的地址變換過程

    同樣,作業系統設定了段表暫存器用來存放段表的初始地址跟段表的長度。

    1. 若邏輯地址中,所給的段號 > 段表暫存器的長度。那麼就產生越界中斷。否則轉2

    2. 由段表的初始地址,找到相應的段表的位置

    3. 檢查邏輯地址中,段內位移是否超過該段的長度,如果是,那麼發出越界中斷。否則轉4

    4. 將段的初始地址與段內位移相加,於是得到要訪問的物理地址。

    (同樣,這個過程很重要,等到刷題篇的時候好好做)。

    段頁式儲存管理

    到了現在我們至少知道,頁式儲存系統能更有效的提高記憶體的利用率,而段數系統能更好的滿足使用者的需要,於是各取所長,便有了段頁式儲存管理。

    段頁式儲存管理的基本思想

    先分段再分頁。先把程序分段,再將每個段分成若干頁,(即在分段中分頁)。對記憶體的管理仍然和分頁儲存管理一樣,將其分成若干個和頁面大小相同的儲存塊。(有沒有覺得跟組成原理中,cache和主存之間的對映方式相同的感覺?)

    程序的邏輯地址,由段號,段內頁號,頁內位移3部分組成。如下圖所示:

    同樣的,作業系統要配置段表跟頁表,要將一個段的若干頁離散的存放,段的大小變化不是段長的變化,而是頁表長度的變化。

    段頁式儲存的地址變換過程

    作業系統為該管理配置了段表暫存器,存放段表的初始地址以及段表的長度。程序中有一個段表,其段表項包括下面幾個欄位:

    變換過程如下: 1. 對於給定的邏輯地址,將段號與段表暫存器中的段表程度進行比較,判斷是否越界

    2. 透過段表暫存器中的段表初始地址,找到該段的段表,從而找到對應的段表項

    3. 檢視該段的狀態位,如果不在記憶體,則發生缺頁中斷。沒有空間就進行置換

    4. 從該段的頁表初始地址找到該段的頁表

    5. 將段內頁號與頁表長度比較,看看是否越界

    6. 檢視該頁的狀態位,若不在記憶體,則缺頁中斷,沒有空間則進行置換

    7. 按頁式儲存的運算規則進行物理地址的計算。

    總之,在尋找之前,務必判斷是否越界,是否存在於記憶體等異常情況。 在段頁式儲存管理當中,為了取到一條指令或者資料,需要訪問3次記憶體。在變換的過程中,透過段表找到頁表的起始地址(1次),然後進行頁式儲存的訪問(2次,前面說過)。但是這裡注意了,一個程序中的段表只能有一個,但是頁表可以有多個。(因為我們是把段的內部按頁來分的)

    分段與分頁的區別

    本質上的不同。頁是資訊的物理單位。段是資訊的邏輯單位。設計的出發點不同。分頁是為了實現程序在記憶體中的有效離散存放,減少碎片。而分段是為了滿足使用者的程式設計需要。實現的方式不同。分頁是由機器硬體實現的,其大小是固定的。而段是由使用者編寫的程式決定的,其長度是可變的。地址的格式不同。頁的邏輯地址空間是一維的,因為其大小跟物理的儲存塊的大小是一樣的,只用給出頁號,頁內偏移都是一樣的。而段的空間是二維的,要同時給出段號跟段內地址。

  • 中秋節和大豐收的關聯?
  • 動力節點就業率高嗎?零基礎適合學習Java嗎?