本文是介紹操做系統存儲管理的入門級文章,旨在介紹操做系統中存儲管理的通常內容,本文主要圍繞如下話題展開。算法
裝入編程
這是一個比較容易理解的概念,將位於硬盤上的代碼加載至內存中的過程即爲裝入。在裝入的過程當中,存在一個轉換的過程。該過程將程序代碼中的邏輯地址轉換物理內存中絕對地址。不一樣的地址轉換方式對應三種不一樣裝入方式緩存
絕對裝入函數
在程序代碼編寫的過程就肯定了存儲的物理地址。此時邏輯地址和物理地址保持一致。在如今操做系統中不會採用這種方式性能
可重定位裝入操作系統
在程序加載到內存地址中是,其能夠存儲到內存的任意位置。物理地址 = 邏輯地址(相對地址) + 物理內存加載處的起始地址。 可重定位的裝入方式比絕對裝入靈活多了,可是其存儲地址在剛載入內存後就固定了,後續不能夠移動存儲位置。在如今操做系統中也不使用這種方式設計
運行時裝入cdn
目前主流的裝入方式,其在程序加載到內存時,不會將邏輯地址轉換物理地址,僅僅在程序代碼被執行時,纔將邏輯地址轉換爲物理地址。 運行時裝入,容許程序在在讀內存後,依舊可以在存儲空間中移動。能知足內存整理等場景的要求。blog
連接進程
連接也是一個比較易懂的概念,和裝入的過程頗爲類似。程序在通過編譯以後,將造成多個目標模塊,將這多個目標模塊組合成一個總體的過程即爲連接。根據這些目標模塊組合的不一樣時機,連接分爲如下三類
靜態連接
在程序運行之間,就將像目標模塊以及庫函數合=連接成一個總體模塊。
裝入時連接
在裝入目標模塊的時候,一邊裝入一邊連接
動態連接
在使用到相關程序邏輯的時候,開始連接。
在程序執行完連接和裝入過程後,位於硬盤上的代碼就將載入內存中。此處必需要爲程序分配其所須要的存儲空間。依據分配存儲空間是否連續這一特色,可將存儲空間的分配分爲連續分配以及離散分配
連續存儲空間分配
單一連續存儲分配
該種方法適用於單用戶,單任務的操做系統。其將主內存分爲系統內存和工做內存。系統內存負責載入操做系統等內容。工做內存僅載入需執行的任務,每一個被加載的任務將獨佔內存。系統內存和工做內存之間相互獨立。
固定存儲分配
該方法適用於適用於多任務操做系統。其將主內存分爲多個大小相等的子內存區域,當存在任務加載需求的時候,將任務加載去子內存區域。該方法採用的固定分區,靈活性不夠。不能解決分區過大致使的內存碎片的問題,也不能解決分區太小致使沒法載入大做業的問題。(也能夠將內存固定劃分爲不等的子內存區域,又稱爲不等分區固定分配)
動態存儲空間分配
在任務加載進內存時,依據任務所需內存大小實現按需分配。動態存儲空間分配,看似解決了內存碎片問題,實際上並非這樣的。在動態存儲空間分配時,屢次內存分配操做,會產生一系列地址不聯繫,大小各異的內存空間。當這些內存空間被回收後,將退化成不等分區的固定存儲分配。
可重定位的分區分配
該存儲方式,在動態存儲空間分配上添加了內存整理功能。若當前內存空間不能知足任務所需內存空間時,其會將已分配的內存空間所有移動,使未分配的內存空間造成一片連續的地址空間。該種方法則要求程序的裝入方式是動態裝入
上述介紹的四種存儲空間分配方法被稱爲連續的分配是由於其不能分割做業存儲。只能將做業存儲在一塊連續內存空間中,並不能將做爲劃分紅更小的單位進行分塊存儲。
離散存儲空間分配
離散存儲空間分配是指,其能將任務分割成更小的存儲單位。分割後的存儲單位連續存儲,而存儲單位與存儲單位之間並不要求連續。經過將任務拆分進行存儲的方法,能極大的提升存儲空間的利用率。
頁式存儲空間分配
這裏將頁定義爲一個固定大小的存儲單位。在將任務載入內存時,一個完整的任務能夠被劃分紅多頁。每頁獨立的存儲到內存空間中,內存空間中存儲位置可用物理頁號描述。每頁的存儲是連續,頁與頁之間的存儲並非連續的,而是離散存儲的。 爲了創建任務的地址與物理空間地址之間的聯繫。在內存表中將創建頁表,完成頁號到物理號的映射
段式存儲空間分配
段式存儲的方法和頁式存儲的方法手段都是一致。將任務以**段爲存儲單位,將任務分紅多段進而離散存儲。**在內存中一樣維護了一張段表。段表和頁表結構是一致的。
段頁式存儲空間分配
該存儲方式其實是,分頁存儲和分段存儲的組合。先將任務按照段進行劃分,而後每段按照分頁的方式進行存儲,即爲段頁式存儲。下文將比較分頁存儲,分段存儲,以及段頁式存儲內存地址的變化
虛擬存儲器是如今操做系統普遍使用的一種存儲方式,虛擬存儲能在不對物理內存擴容的基礎上,保證可以運行更多更大的內存任務。虛擬存儲器和常規存儲器的不一樣之處在於,虛擬存儲器不要求你任務一次性所有載入內存,而是按需載入內存。而且能在內存空間受限時,將閒置的內存做業調出內存,這種將內存做業調出內存的過程稱爲置換,完成置換過程的方式則稱爲置換算法。在上述過程當中,不將做業一次性徹底載入內存,顯然是創建在分頁存儲或者分段存儲的基礎上,下文對這兩種狀況分別介紹
請求分頁存儲
請求分頁存儲具備兩點內容須要理解:
分頁加載,按需加載
請求分頁存儲將任務以頁爲單位進行劃分,在載入內存時,並不將所有頁面載入。而是將部分必須的頁面載入內存,其餘的頁面在程序運行中,若使用則按需載入內存。
分頁置換
在內存空間緊張時,會將程序中某些使用或者近期不在使用的頁面,從內存置換到磁盤中去。
在請求分頁存儲中,內存中維護的頁表再也不是簡單的頁號到內存物理號之間的映射了。其頁表結構通常以下:
請求分段存儲
請求分段存儲與請求分頁存儲及其類似。惟一的區別即是,載入和置換的單位從頁轉換到了段。
置換算法
置換算法,在虛擬存儲器中是很是重要的內容。在虛擬存儲器設計理念中,當內存資源緊張的時候,會依據置換算法將內存中的頁面置換到外存中。此處介紹兩種置換算法
LRU(Least Recently used,最近最久使用算法)
最近最久未使用算法,在頁面項中添加了訪問時間字段T,記錄最近一次訪問到目前過去的時間。在須要進行頁面置換時候,將T最大的頁面置換出去。
LFU(Least Frequently used,最少使用算法)
最少使用算法,在頁面項中添加了訪問頻率字段F,計算最近一段時間內該頁面被訪問的頻率。在須要進行頁面置換時候,將F最小的頁面置換出去