計算機操作系統基礎(八)---存儲管理之內存分配與回收

引言

本文爲第八篇,存儲管理之內存分配與回收,早期計算機編程並不需要過多的存儲管理,隨着計算機和程序越來越複雜,存儲管理成爲必要。本篇主要是瞭解內存分配的過程內存回收的過程

存儲管理的意義

  • 確保計算機有足夠的內存處理數據
  • 確保程序可以從可用內存中獲取一部分內存使用
  • 確保程序可以歸還使用後的內存以供其它程序使用

內存分配的過程

單一連續分配

  • 單一連續分配是最簡單的內存分配方式
  • 只能在單用戶單進程的操作系統中使用

它分配的過程就是把內存分爲系統區用戶區

系統區指的是系統區所有的內存都給操作系統區使用,用戶區指的是用戶區所有的內存都給用戶區的程序使用(這種已經是過時的方法)

固定分區分配

  • 固定分區分配是支持多道程序的最簡單存儲分配方式
  • 內存空間被劃分爲若干固定大小的區域
  • 每一個分區只提供給一個程序所使用,互不干擾

將主存分爲若干個分區,每一個分區提供給某一個進程所使用,這就是固定分區的分配方法

動態分區分配

  • 根據進程實際需要,動態分配內存空間
  • 涉及到相關數據結構和具體的一些算法

動態分區空閒表數據結構

假設主存中有若干個分區,有些被使用而有些未被使用,這樣就需要一個數據結構去存儲某一個分區它是否被使用了,此時就需要空閒表數據結構

在表中有若干個分區,每一個分區都有一個標記,0或1,0表示未被使用,1表示被使用。這就是動態分區空閒表數據結構

動態分區空閒鏈數據結構

這個是使用雙向鏈表來保存動態分區中的空閒區域。將所有分散的空閒區域,通過鏈表進行首尾相連,組成一個空閒鏈表,但是,會存在像下圖中空閒區2和3是連續的,因此可以將節點2和節點3給合併起來,這樣就可以減少空閒鏈表的節點。因此,每個節點的大小不一樣,所以需要在每個節點裏邊存儲記錄這個節點可存儲的容量。這個就是動態分區空閒鏈數據結構

動態分區分配算法

  • 首次適應算法(FF算法)
  • 最佳適應算法(BF算法)
  • 快速適應算法(QF算法)

這些算法是實際進行動態內存分配所使用的算法

首次適應算法(FF算法)

每一次進行內存分配時,從開始順序查找適合內存區(主要使用空閒鏈的數據結構)
若沒有合適的空閒區,則該次分配失敗,如果找到了,就將該空閒區劃分給這個進程使用。每次都是從頭部開始,使得頭部地址空間不斷被劃分

最佳適應算法(BF算法)

  • 最佳適應算法要求空閒區鏈表按照容量大小排序
  • 遍歷空閒區鏈表找到最佳空閒區

將空閒區按照大小進行排序,在需要內存的時候,從節點頭部開始遍歷,尋找最佳的空閒區節點。這種算法的好處就是可以避免一種大材小用的情況,因爲它是從小到大遍歷這個空閒鏈表的,所以它匹配到的第一個合適的空閒區,一定是最佳的。

快速適應算法(QF算法)

  • 快速適應算法要求有多個空閒區鏈表
  • 每個空閒區鏈表存儲一種容量的空閒區

將擁有一個空閒區節點的和擁有兩個空閒區節點,分成兩個鏈表。當需要內存分配時,就可以快速的找到適合某一個進程的內存區域。

內存回收的過程

內存回收過程,可能有以下幾種情況:

  • 回收區和一塊空閒區相鄰,且回收區在空閒區下邊
  • 回收區和一塊空閒區相鄰,且空閒區在回收區下邊
  • 回收區在兩塊空閒區中間
  • 單獨的回收區

每種情況的回收過程

回收區在空閒區下邊

使用空閒鏈表的數據結構來保存空閒區,不需要新建空閒鏈表節點、只需要將空閒區1的容量增大爲空閒區即可(也就是將回收區包含進來)

回收區在空閒區上邊
  • 將回收區與空閒區合併
  • 新的空閒區使用回收區的地址

回收區位於兩個空閒區中間
  • 將空閒區1、空閒區2和回收區合併
  • 新的空閒區使用空閒區1的地址

單獨的回收區
  • 爲回收區創建新的空閒節點
  • 插入到相應的空閒區鏈表中去

在快速變化的技術中尋找不變,纔是一個技術人的核心競爭力。知行合一,理論結合實踐

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章