計算機的作用就是執行程式,而程式是則指令和資料的集合,我們肯定需要把他存放在一個位置,即記憶體。就像JVM虛擬機器一樣有自己的記憶體分配和回收,計算機的記憶體也有多種記憶體管理方案。
計算機執行程式的大致過程,就是先從記憶體中讀取指令,接著被CPU解碼,然後根據需要從記憶體中讀取運算元,執行完指令後可能寫回記憶體。在這個過程中從可以發現需要從記憶體中讀取程式的指令和運算元,這個過程是怎麼實現的呢?
以下為使用者程式的大致執行過程
通常將指令和資料繫結到記憶體地址有以下幾種情況:
- 編譯時:編譯時就知道程式將在記憶體中的駐留地址,可以生成絕對程式碼。若發生變化,必須重新編譯
- 載入時:即地址繫結會延遲到載入時進行
- 執行時:程式可以在執行時從一個記憶體段移到另一個記憶體段,且需要特定的硬體輔助完成,而絕大多數作業系統採用這種方式
在分時系統中,使用者的程式比記憶體能容納的數量要多,這就需要在磁碟上儲存那些記憶體放不下的程式。在需要執行這些程式時,再將它們裝入記憶體。程式從記憶體移到磁碟並再移動回記憶體稱為交換。交換技術是程式在記憶體與外存之間的動態排程,是由作業系統控制的。
注意通常一個交換出的程式需要交換回它原來所佔有的記憶體空間的。這一限制是由程式的地址繫結方式實現的。編譯和載入是肯定不行的,執行是可以的!
交換技術的缺點:
由於交換時需要花費大量的CPU時間,這將影響對使用者的響應時間,因此,減少交換的資訊量是交換技術的關鍵問題。
連續分配方式是指為一個使用者程式分配一個連續的記憶體空間,連續分配方式有單一連續分配,固定分割槽分配和動態分割槽分配。
單一連續分配
記憶體在此方式下分為系統區和使用者區,系統區僅供作業系統使用,通常在低地址部分;使用者區是為使用者提供的,除系統區以外的記憶體區域,*這種方式無須進行記憶體保護,因為記憶體中只存在一道使用者程式,(在任何時間,使用者區域中最多隻有一個任務),不會因為訪問越界而干擾其它程式。 *- 優點是沒有外部碎片,分配方式簡單,可以採用覆蓋技術,不需要其它的技術支援。 - 缺點是隻能用於單使用者,單任務的作業系統中,有內部碎片,記憶體的利用率低,靈活性低(要求程式的儲存空間小於等於記憶體可用空間,否則不能使用覆蓋技術),週轉時間長(必須等記憶體中的作業執行完畢,下一個任務才能進入記憶體並執行)。
固定分割槽分配
固定分割槽分配是最簡單的一種多道程式儲存管理方式,它將使用者記憶體空間分成若干大小固定的區域。每個分割槽只放入一道作業,當有空閒分割槽時,便可再從當前佇列中選出一個作業進入。固定分割槽是可用於多道程式設計的最簡單的分配儲存,無外部碎片,但是存在內部碎片,而且也是較為嚴重,並且不能實現多個程式共享一個記憶體區,所以儲存效率低,不被現在的作業系統所通用。但是在某些作業系統控制多個相同物件時發揮重要作用。
動態分割槽分配
動態分割槽分配又稱可變分割槽分配,是一種動態劃分記憶體的分割槽方法,它並不預先的分配好記憶體空間,而是在程式裝入時,根據程式的大小為其分配正好合適的記憶體空間來滿足程式的需要,因此,系統分割槽的大小和數目是可變的。在程式裝入或換入記憶體時,若記憶體中有多個足夠大的記憶體塊時,則作業系統必須確定為該程式分配哪個記憶體塊,即以下四點記憶體分配策略:
首次適應演算法(First fit)
按空閒分割槽依地址遞增次序連結,分配記憶體時按順序查詢,放入第一個匹配到的空閒分割槽,會造成內部碎片,有著較大的浪費
最佳適應演算法(Best fit)
將空閒分割槽按記憶體大小遞增的順序連結起來,分配記憶體時按照順序放入第一個匹配的空閒分割槽。
最壞適應演算法(Worst fit)
將空閒分割槽按容量遞減的順序連結起來,分配記憶體時放入第一個匹配的空閒分割槽,即最大的分割槽,造成內部碎片
動態分割槽在開始分配是很好的,但隨著為程式不斷的分配和釋放記憶體空間,會產生越來越多的記憶體碎片,記憶體的利用率隨之降低,這些小的記憶體塊被稱之為外部碎片,這些外部碎片可以透過緊湊技術來解決,即作業系統透過不斷地對程式進行移動和整,但是這種操作需要動態重定位暫存器的支援,且相對比較費時
推薦閱讀博文:c.biancheng.net/cpp/html/2611.html
本作品採用《CC 協議》,轉載必須註明作者和本文連結