現代操作系統之存儲管理(上)

操作系統中管理分成存儲器的部分成爲存儲管理器。他的任務是有效地管理內存,即記錄哪些內存是正在使用的,哪些內存是空閒的;在進程需要時爲其分配內存,在進程使用完後釋放內存。


無存儲器抽象

 最簡單的模型,及存儲器模型就是物理內存,不過有三種變體:
  1. 操作系統位於RAM的地步
  2. 操作系統位於內存頂端的ROM
  3. 設備驅動程序位於內存頂端的ROM,而操作系統中其它部分位於下面的RAN的底部

第一種和第三種方案的確定是用戶程序出現的錯誤可能摧毀操作系統(RAM)

在沒有內存抽象的系統中實現並行的一種方法是使用多線程編程。更進一步,一個沒有內存抽象的系統也不大可能具有線程抽象的功能。

程序直接使用絕對物理地址是最需要避免的。

不過在收音機,洗衣機等設備就完全被(ROM形式)軟件控制,這些軟件都採用訪問絕對內存地址的尋址方式。


一種存儲器抽象:地址空間

將物理地址暴露給進程會導致一下嚴重問題:
  1. 如果用戶程序可以尋址內存的美國字節,則可以很容易的破壞系統,泵式系統慢慢停止運行(除非有硬件保護),這個問題在單用戶使用時也存在
  2. 單CPU同時運行多個程序是非常困難的


地址空間概念

要保證多個應用程序同時處於內存中並且互不影響,則需要解決兩個問題——保護和重定位。

地址空間是一個進程可用於尋址內存的一套地址的集合。每個進程都有一個自己的地址空間,並且這個地址空間獨立於其他進程的地址空間(除了共享空間)


很多CPU中都有兩個特殊的寄存器——基址寄存器和界限寄存器,當一個進程運行時,程序的起始物理地址裝載到基址寄存器,程序的長度裝載到界限寄存器。

每次一個進程訪問內存,取一條指令,讀或寫一個數據字,CPU硬件會把地址發送到內存總線前,字段吧基址值加到進程發出的地址值上,同時,他堅持程序提供的地址是否等於或大於界限寄存器裏的值,如果訪問的地址超出界限,則會產生錯誤終止訪問。

在很多實際系統中,對基址寄存器和界限寄存器會以一定的方式加以保護,使得只有操作系統可以修改他們。

使用基址寄存器和界限寄存器重定位的缺點是——每次訪問內存都需要進行假髮和比較運算,比較可以做的很快,但加法由於今晚傳遞時間的問題,在沒有使用特殊電路的情況下速度較慢。


交換技術

有兩週處理內存超載的通用辦法,最簡單的策略是交互技術,即吧一個進程完成調入內存,是該進程運行一段時間,然後把它存回磁盤。空閒進程主要存儲在磁盤上。
另一種則爲細膩內存,該策略使程序在只有一部分被調入內存的情況下運行。


由於交換產生的位置變化,在換入式可以通過引進對其地址進行重定位。

交換在內存中會產生多個空閒區,吧所有進程儘可能向下移動,有可能將這些空閒區合成一大塊,這種技術成爲內存緊縮。這種操作很少進行,因爲耗費時間漫長。

若一個進程在內存中不能增長,而且磁盤上的交換區也已滿了,那麼這個進程只有掛起直到一些空間空閒(或者可以結束進程傷害)

若干大部分進程在運行時都要增長,爲了減少內存區域不夠而引起的進程交換和移動所產生的開銷,一種可用的方法是,當還入或移動進程時爲它分配一些額外的內存。不過當進程被換到磁盤上時,不需要交換出額外的內存。

如果進程有兩個可增長的段,那麼放在中間,堆棧段在進程所佔內存的頂端並向下增長,緊接在程序段後面的數據段向上增長。

空閒內存分配

在動態分配內存時,操作系統必須對其進行內存管理。一般而言,有兩種方式可以跟蹤內存使用情況——“位圖和空閒鏈表。

在使用位圖時,內存可能被劃分成或大或小的分配單元,位圖中的一位代表一個分配單元。

因爲內存的大小和分配單元的大小決定了位圖的大小,所以它提供了一種簡單的利用一塊固定大小的內存區就能對內存使用情況進行記錄的方法。這種方法主要的問題是在覺得一個站K個分配單元的進程進入內存時,存儲古娜裏奇必須搜索位圖,哎位圖中找出有k個連續0的字符串。查找位圖中指定長度的連續0串是耗時的操作(因爲可能跨越字的邊界),這是位圖的缺點。



而另一種方法則是維護一個記錄已分配內存段和空閒內存段的鏈表,其中鏈表中的一個階段或者包含一個進程,或者是兩個進程之間的一個空的空閒區。

因爲進程表中表示終止進程的節點中通常含有執行對應於其段鏈表節點的指針,因此段鏈表使用雙鏈表往往比單鏈表方便,這樣更容易找到上一個節點。
段鏈表常見算法:
  • 首次適配算法(找到第一個足夠大的空間)
  • 下次適配算法(和1相同,不過找到空閒區會記錄位置,下次從結束的位置開始搜索,而不是想首次適配那樣從頭開始,不過性能甚至略低於首次適配)
  • 最佳適配算法(找到最合適的,每次都會搜索整個鏈表,因此較慢,在內存利用率上也低,因爲產生大量無用的小空間)
  • 最差適配算法(每次總分配最大的,然而依舊不佳)

如果爲進程和空閒區維護各自獨立的鏈表,那麼四種算法的速度都可以得到提高,但是代價爲增加複雜度和內存釋放四度變慢,因爲必須將一個回收的段從進程鏈表中刪除而插入到空閒鏈表中

如果進程和空閒區使用不同的離那邊時,則可以可以按照大小按空閒區鏈表排序,以便提高最佳適配算法的速度。

單獨聯邦不必用單獨的數據結構存儲這些信息,而是可以利用空閒區存儲這些信息。


還有一種算法成爲快速適配,它爲那些常用大學的空閒區維護單獨的鏈表,比如第一個4kb,第二個8kb,第三個16kb。。。其查找指定大小的空閒區速度極快,但是它和所有將空閒區按大小順序排序的算法一樣存在着一個確定——當進程終止或被換出時,尋找它的想link,查看是否可以合併的過程非常費時,而不合並則會迅速產生大量無法利用的小空閒區。
發佈了92 篇原創文章 · 獲贊 30 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章