第8章 記憶體管理的概念
作業系統對於使用者程式 的處理過程
記憶體的種類 揮發性記憶體(volatile memory) 非揮發性記憶體(nonvolatile memory) 電腦關機以後揮發性記憶體中的資料會消失,但是非揮發性記憶體中的資料依然存在 唯讀記憶體(ROM,read only memory)屬於非揮發性記憶體,裡頭儲存了電腦啟動時所需要的資料 一般PC的ROM主要用來儲存BIOS(basic input/output system),有點像一個小型的作業系統,在電腦開機時擔當大任
主記憶體在主機板上的位置
各種不同的記憶體封裝方式
處理器與記憶體之間的連結
快取記憶體(Cache Memory) 記憶體的速度跟CPU比起來還是太慢,所以跟CPU搭配工作的還有所謂的快取記憶體 一般說來,L1快取記憶體 (primary cache)位於CPU晶片內,L2 快取記憶體(secondary cache)在CPU晶片內或獨立的印刷電路版上 L3 cache也是一種快取記憶體,內建於記憶體中,儲存空間大小是L1<L2<L3 在現代記憶體的架構中,快取記憶體的容量一直在增加,對於CPU效能的提昇有很大的幫助
記憶體的架構
電腦的儲存媒體 主要的儲存媒體(primary storage) 次要的儲存媒體(secondary storage)
各種記憶體模組(memory module)
記憶體的技術規格 記憶體的技術規格有兩個最重要的特徵:儲存密度(density)與工作頻率 儲存密度是指矽晶片單位面積內記憶單位的數目,不過現在大家都習慣以記憶體晶片的儲存容量來描述這一部分的特徵
以DDR 500的記憶體為例 記憶體的資料頻寬可以由工作頻率與資料寬度來計算 記憶體工作頻率=500 MHz 則資料頻寬=(8 bytes)*500 MHz=4000 MB/s
記憶體管理程式的主要功能 管理主記憶體的分享(sharing)。 降低記憶體的存取時間(access time)。 將主記憶體空間分配給處理元。 協調處理元位址空間(address space) 與主記憶體之間的對應關係(mappings) 。 在現有的主記憶體容量下縮短存取時間。
各種記憶體的特徵與記憶體架構
記憶體設計主要的要求 系統的硬體與軟體設計應該儘量讓主記憶體的存取時間縮短。 主記憶體越大則系統可運用的資源就越豐裕,使用虛擬記憶體的技巧可以讓主記憶體用起來好像比實際的容量為大。 主記憶體的成本要合理,應該只占整個電腦系統的一小部分。
簡單的記憶體分配的演算法
靜態記憶體分配的演算法
程式處理的方式
程式的處理
原始碼編譯以後產生的relocatable object module
連結以後產生的absolute module
載入時期 (load time)
動態記憶體的觀念 程式語言通常會提供一些管理記憶體空間的功能 程式語言本身與記憶體空間的管理是無關的,作業系統才是主控者 我們可以在執行時期要求更多的記憶體空間,在系統層次上,其實作業系統並未真正的多分配了一些記憶體空間,只是把處理元還未用到的記憶體空間連結(bind)到動態的資料結構(dynamic data structure) UNIX系統的malloc程序就可以做到上述的功能
UNIX系統的記憶體配置情況
記憶體的配置 在作業系統的組態設定中就將主記憶體空間分割成固定數目固定大小的方塊。這就是前面曾經介紹的靜態的固定分割的方式。 使用動態決定而且大小不一的(variable-sized)方塊來配置。我們盡量分配剛好符合需求的記憶體空間給處理元使用。
空間散佈(fragmentation)的問題 固定大小的配置方法會造成內部的空間散佈(internal fragmentation) ,因為分配給處理元的空間都是固定大小的,而且大於實際的需求 變動大小的配置方式依照處理元的需求來分配記憶體空間,內部的空間散佈比較不嚴重,記憶體管理程式必須監控變動大小的記憶體方塊,這種配置方式會造成所謂的外部的空間散佈(external fragmentation)問題
空間配置的策略 最佳配置(best fit) 最糟配置(worst fit) 最先配置(first fit) 下一個配置(next fit)
重定位的問題 載入程式(loader)只能針對絕對模組(absolute module)重定位,無法對執行映像(executable image)做類似的處理。 絕對模組具有特殊的格式,包括了compiler與linkage editor留下來的一些旗標(flags) ,載入程式產生執行映像時會移除這些旗標。
動態位址重定位(dynamic address relocation) 原始程式中的符號最先會連結到compiler產生的可重定位模組(relocatable module)裡的相對位址(relative address) link時則連結到絕對模組(absolute module)裡的位址,載入時則連結到真正的記憶體位址(memory address) 之後就可以進入執行時期
用硬體來支援動態位址重定位的方式
擴充之後的硬體重定位方法
交換作業(swapping) 把記憶體分割以後便於支援多工的(multiprogramming)作業,但是占有記憶體的處理元有可能在某些原因下暫停(blocked)執行 假如此時有其他的處理元需要記憶體空間繼續執行,則我們可以考慮把暫停的處理元移出主記憶體,讓其他的處理元能得到記憶體的資源 這是交換作業(swapping)的由來