論操作系統的內存分配方式
在多道程序當中,如果要讓我們的程序運行,必須先創建進程。而創建進程的***步便是要將程序和對應的數據裝入內存。把用戶的源程序變成可執行的程序要經歷 編譯 - 鏈接 - 裝入 三個過程。
此刻我要說的就是***的一個步驟,如何為一個用戶程序分配相應的內存空間。
***種:單一連續分配方式
適用于單用戶、單任務的操作系統。沒什么好講的。
第二種:固定分區分配
此種分配方式把內存空間分為固定大小的區域,每個分區允許一個作業被裝入。分區大小可以不相同。通常會建立一張分區使用表來記錄每個分區的起始地址、分區大小、狀態。沒有足夠大的分區則拒絕分配內存。此種分配方式是最早的多道程序的存儲管理方式。
缺點:限制了進程的數目,內存空間利用率比較低。
第三種:動態分區分配
此種方式涉及到相應的數據結構(分區表、分區鏈),分區分配算法和回收操作。
分區分配算法有:***適應算法 ( 以鏈表結構為例,下同。從鏈首開始順序查找,找到一個符合條件的分區即可進行相應的分配,沒有符合條件的則分配失敗 ) 、循環***適應算法(從上一次符合條件的分區進行循環查找 ) 、***適應算法(首先需要把空閑分區鏈表按容量排序 [ 排序的目的是為了加速查找,否則就要遍歷整個鏈表 ] ,然后從鏈首進行順序查找 ) 、最壞適應算法( 選擇***的空閑分區,然后進行分配 ) 、快速適應算法 ( 分類搜索算法,采取分區表加上相同類別管理的鏈表進行記錄,僅需根據進程的長度,即可分配相應的內存空間 )。
回收內存的方式:只要回收空間與空閑分區相鄰接,那么僅需與空閑分區合并即可;否則,需為回收區單獨建立一項新的表,然后把回收區的首地址插入到空閑鏈中相應的位置。
缺點:相應分配的算法比較復雜,回收空間需要合并分區,系統開銷大。
第四種:伙伴系統
規定:已分配區間或空閑區間的大小均為2的k次冪。
具體:當進程需要一個長度為n的空間時,需要計算一個i值,使得2的i-1次方小于n,2的i次方大于等于n。然后根據計算結果,得到空閑分區鏈表中查找大小為2的i次方的空閑分區,如果不存在這樣的分區,則將2的i+1次方化成兩個2的i次方的空閑分區,以此類推,總有符合的空閑分區。回收與分配空間的方式恰好相反。
第五種:哈希算法
在分類搜索算法的基礎上,利用哈希快速查找的優點,快速到查找相同容量類別的鏈表,實現***的分配策略。
第六種:可重定位分區分配
此種算法考慮到的情況是:有很多內存碎片。對于一個進程來說,沒有任何一個碎片能夠滿足進程所需的容量要求,但是碎片的容量總和能夠滿足一個或者多個進程的容量要求。
解決方案:①把內存中的所有作業全部移動,讓他們緊湊在一起,這樣內存碎片便集中在一起了。(需要對移動的程序地址進行修改才行)
分區分配算法:與動態分區分配算法類似,不過多了“緊湊”的操作。
第七種:對換
將占用內存卻沒有干什么事情的進程給放到對換區(外存分為文件區和對換區)。