存儲管理——內存管理

存儲管理中首先要面對的第一個boss是內存管理。內存管理需要考慮這兩個問題:

  • 1)內存管理需要解決什麼問題?
  • 2)內存管理方式有哪些?

那接着具體看看兩個問題。

1)內存管理需要解決什麼問題?

程序運行需要存儲空間,將自身的代碼和數據存放起來。爲了更好的滿足程序對內存提出的存儲要求,需要解決的問題如下:
1. 重定位:如何確定程序所在的地址位置
2. 保護:程序之間相互獨立的代碼和數據如何確保互不干擾
3. 共享:程序之間相互通信的代碼和數據如何確保通信
4. 邏輯組織:程序內部如何組織代碼和數據
5. 物理組織:存儲器如何組織代碼和數據
簡單點:需要解決怎麼在存儲中圈一塊地出來給程序。在存儲中圈的地,保證這塊地的使用是當前程序說了算的,同時程序內或程序之間的是可以相互定位的。這就是內存管家需要做的事情。

2)內存管理方式有哪些?

內存管理方式是啥?就是怎麼圈地!
1. 固定分區分配:每塊地都是已經圈好了的,自己拿。
2. 動態分區分配:按需分配,要多少給多少。少給不行!多給不行!
3. 夥伴系統:一半分你多麼,太多了,一半再分成兩半分你一半,……
4. 分頁分配:一個人,一塊地(每塊地大小一樣)。一家有幾個人,每個人自己拿一塊地。
5. 分段分配:你家打獵,去拿山頭;他家種稻,去拿良田;我家養魚,去拿小池塘。
以上,說話的方式有點簡單。
知道怎麼圈地了,看看第二步,怎麼分地。(先不考慮別的操作,只考慮內存夠用)

2.1 固定分區分配

將內存提前分配好,一種是平均的分內存;另一種是封建的分內存。
對於平均主義式而言:
可以將程序塞到任意一個可以容納它的內存塊。
對於封建等級式而言:
把程序塞到能滿足其大小的最小內存,也就是裝入後剩下的空間最小的那塊內存。

2.2 動態分區分配

內存會隨着程序內存需求的增加,而減少相應的內存量。
其中有這樣幾個放置方式:首次適應算法、下次適應算法、最佳適應算法、最壞適應算法
1. 首次適應算法
按程序裝入順序,尋找能插入的內存塊,如果能放進去,那就放進去咯。
2. 下次適應算法
按程序裝入順序,從上一程序裝入的位置,開始尋找內存塊,如果能放進去,放進去。
3. 最佳適應算法
將內存空間從小到大排序,從第一塊空閒內存開始,尋找能裝入的最小內存塊並放入。
4. 最壞適應算法
將內存空間從大到小排序,從第一塊內存開始,尋找能裝入的內存。

2.3 夥伴系統

見過二叉樹麼?最多隻有兩個分支的那種,該樹結點值代表內存空間大小和是否被使用,初始化根結點未整個空間。
對於某個特定的程序對內存的需求,與未分配的子結點比較,如果子結點大於兩倍的申請空間,則將該子結點作爲父結點,申請空間繼續比較其子結點,直至裝入。從而得到其內存空間介於2is2i+1 之間。

2.4 分頁分配

考慮固定平均分區那樣的分配方式,在此基礎上,細分原有內存塊的大小;將程序所需的內存劃分爲同樣的大小;
在內存中尋找,將程序的一頁分配到可能不連續的內存塊中去;
通過一個頁表,將程序中的邏輯地址映射到內存中的實際地址,並將映射信息保存在頁表中。

2.5 分段分配:

這和分頁有點像,和動態分配有點像。
將程序分成若干具有特定功能的大小可不等的段塊(如數據段,代碼段等等);
像申請動態分區分配那樣,將不同的段分配到內存塊中去;
將不同段與內存塊的映射關係保存到段表中。

內存管理方式分優劣

最後看看每種分配方式(用上述的標號表示,如:2.1)的優劣:
2.1~2.3的分配方式,是將程序連續的分配到內存中,由於程序自帶的這個要求,引發的後果是,大量的零碎的空間面臨無法使用的情況,然而如果將其合併可能滿足其他程序的需求。這個缺陷在2.1中表現爲固定數量的程序可以裝入內存;在2.2中表現爲多次分配和回收之後,產生了極多的內存碎片;在2.3中相當於前兩者而言,都較好並不是表現的拙劣。爲了彌補這個缺陷,在2.2中採用碎片拼接的方法,引發的缺陷則是,移動大量內存地址,系統效率低下,而且重定位困難啊!安全措施難搞啊!(有種喜新厭舊感覺,說的一無是處了還)但是正是這種簡單的分配方式,我們可以將計算機系統得以實現,在歷史上是功不可沒的。
2.4、2.5則一改連續分配的風格,將連續變成離散的分配到內存中去。破其一點,收穫了大好前程!不僅減少了內存碎片的產生,而且能更好重定位,提供更好的保護和共享機制。儘管2.5中存在動態分配所帶有的外部碎片的問題,由於是按功能劃分段塊,也就能提供更好的保護和共享方式。至於重定位的方式,將在虛擬內存中做介紹。

雖然內存中如何存放程序的問題看似解決了,但是,在現實中,小內存碰見大程序該如何解決;內存中存滿了,調入新數據和程序時如何處理;空內存調入數據和程序時又該如何呢?
這些問題我們可以通過虛擬內存、中斷機制、置換算法解決,這些將在以後分享。

發佈了48 篇原創文章 · 獲贊 10 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章