作業系統離散儲存方式
儲存分配方式
上一篇部落格筆者談到了儲存器的分配方式包括連續儲存和離散儲存。我們再回顧一下那個圖:
上一篇部落格中我們提到聯絡儲存的一些概念,包括:單一連續分配,固定分割槽分配,動態分割槽分配,其中對動態分割槽分配的分配演算法做了介紹。這一次我們繼續來聊一聊離散儲存的幾種方式。之所以出現離散分配方式,是因為連續分配方式會出現“碎片”,造成空間浪費。
離散分配方式分為三種:
- 分頁儲存管理
- 分段儲存管理
- 段頁式儲存管理
一、分頁儲存管理方式
1、分頁結構
分頁儲存方式引出了三個概念,一個叫頁面(在頁表中對應頁號),一個叫物理塊(在頁表中對應塊號),一個叫頁表。
- 頁面:指的是將程式按邏輯地址空間分成若干個頁,每個頁的大小是相同的,給他們編號得到頁號。
- 物理塊:指的是將程式的實際實體地址空間分成若干個塊,給他們編號得到塊號。
- 頁表:系統為每一個程序建立了一張頁面和物理塊的對映表。
結構如下:
這裡我們不妨先分析一下,這樣的結構有哪些優勢和問題。
優勢在於,通過將邏輯地址和實體地址分開劃分,然後設定對映建立聯絡的方式,我們可以實現程式在記憶體上的離散儲存。
劣勢在於,頁面固定的情況下,總會出現程式填不滿完整的一個頁面的情況,那樣也會出現“碎片”現象,我們稱之為“頁內碎片”,同時,增加對映關係也會增加我們的訪問成本。
前人大佬當然也想到了這一點, 大佬們發現如果僅僅採用頁表來對映邏輯地址和實體地址的關係,那麼,在程式執行的過程中CPU每一次存取一個數據的時候,都要先去記憶體訪問頁表,獲得塊號,然後將其與頁內偏移量拼接,形成實體地址;獲得實體地址後再去記憶體處理資料。這樣一來處理速度降低了將近1/2。
這當然不行,於是大佬們提出了“快表”的概念。也就是設立一個處理速度很快的高速緩衝暫存器,用來存放一些當前程式正在訪問的那些頁表項,CPU每次訪問的時候,先去快表裡面找找有沒有“捷徑”,如果有,就直接訪問得到塊號;如果沒有,再去記憶體讀取,讀取後將這個新的被訪問頁表放到快表中;如果快表滿了,那麼就從快表中找出最少使用的頁表和這個新頁表交換,我們稱之為更新快表。
那既然有了新的機制,當然我們也需要一些方法來判斷這個機制是否有用,所以我們引出了訪問記憶體的有效時間的概念,具體的公式和結果比較,大家可以通過《作業系統》等書籍瞭解。
最後,分頁儲存還有一個好處就是頁面是虛擬地址,我們可以設定一層,也可以設定很多層,針對難於找到大的連續空間的記憶體空間來存放頁表的問題,我們就可以使用多級頁表如圖(圖片來源:https://blog.csdn.net/ergouge/article/details/7460058)
二、分段儲存管理方式
首先我們依然要知道,為什麼要引入分段儲存管理方式,畢竟分頁管理已經可以做到將資料離散存放。引入分段儲存管理的原因,一方面是將程式分成若干個程式段後,可以使程式更直觀;另一方面,分段實現和滿足了資訊共享,資訊保護,資訊動態增長等需要。簡單來說就是方便程式設計。
那麼分段的方式是怎樣的呢?
分段儲存福管理方式中,作業的地址空間被劃分為若干個段,每個段定義了一組邏輯資訊。系統為每一個分段分配一個連續的分割槽。同時引入段表的概念,段表表示了邏輯段和實體地址的對映。
三、段頁式儲存管理方式
段頁式儲存管理其實就是把分段和分頁原理結合,即先將使用者程式分成若干個段,然後再將每個段分為若干個頁,併為每一個段賦予一個段名。