本文是介紹操作系統(tǒng)存儲(chǔ)管理的入門(mén)級(jí)文章,旨在介紹操作系統(tǒng)中存儲(chǔ)管理的一般內(nèi)容,本文主要圍繞以下話題展開(kāi)。
- 計(jì)算器系統(tǒng)中的存儲(chǔ)結(jié)構(gòu)
- 程序的鏈接和裝入的概念
- 程序存儲(chǔ)空間的分配
- 連續(xù)存儲(chǔ)空間分配
- 離散存儲(chǔ)空間分配(分頁(yè)存儲(chǔ),分段存儲(chǔ),段頁(yè)式存儲(chǔ))
- 虛擬存儲(chǔ)器
- 請(qǐng)求分頁(yè)存儲(chǔ)
- 請(qǐng)求分段存儲(chǔ)
- 置換算法
一丶計(jì)算機(jī)系統(tǒng)中的存儲(chǔ)結(jié)構(gòu)
上圖中描述了計(jì)算機(jī)系統(tǒng)中的一般存儲(chǔ)結(jié)構(gòu),從左往右存儲(chǔ)資源的價(jià)格越來(lái)越便宜,但是存取的速度越來(lái)越貴。本文研究的存儲(chǔ)管理指的主存管理以及少部分磁盤(pán)和主存之間的交互。
- CPU寄存器,這是最昂貴的存儲(chǔ)資源,里面一般緩存了些極其重要且頻繁使用的數(shù)據(jù)。比如地址變換表的基地址等信息。
- 高速緩存,是為了提高CPU資源利用率而設(shè)計(jì)的存儲(chǔ)結(jié)構(gòu),存放的時(shí)最近使用以及將來(lái)會(huì)使用的數(shù)據(jù)。越靠近CPU側(cè)存取速度越快,存儲(chǔ)價(jià)格越高。
- 主存,這是最主要的存儲(chǔ)區(qū)域。運(yùn)行中的程序(進(jìn)程)都是被加載到主存中的。
- 磁盤(pán),這是生活中最接觸的存取區(qū)域,一般存放可執(zhí)行文件,資源文件,配置文件等。IO操作就是指對(duì)磁盤(pán)進(jìn)行的讀寫(xiě)操作。很多場(chǎng)景下IO操作是系統(tǒng)性能的瓶頸
二丶程序的鏈接和裝入
-
裝入
這是一個(gè)比較容易理解的概念,將位于硬盤(pán)上的代碼加載至內(nèi)存中的過(guò)程即為裝入。在裝入的過(guò)程中,存在一個(gè)轉(zhuǎn)換的過(guò)程。該過(guò)程將程序代碼中的邏輯地址轉(zhuǎn)換物理內(nèi)存中絕對(duì)地址。不同的地址轉(zhuǎn)換方式對(duì)應(yīng)三種不同裝入方式
-
絕對(duì)裝入
在程序代碼編寫(xiě)的過(guò)程就確定了存儲(chǔ)的物理地址。此時(shí)邏輯地址和物理地址保持一致。在現(xiàn)在操作系統(tǒng)中不會(huì)采用這種方式
-
可重定位裝入
在程序加載到內(nèi)存地址中是,其可以存儲(chǔ)到內(nèi)存的任意位置。物理地址 = 邏輯地址(相對(duì)地址) + 物理內(nèi)存加載處的起始地址。 可重定位的裝入方式比絕對(duì)裝入靈活多了,但是其存儲(chǔ)地址在剛載入內(nèi)存后就固定了,后續(xù)不可以移動(dòng)存儲(chǔ)位置。在現(xiàn)在操作系統(tǒng)中也不使用這種方式
-
運(yùn)行時(shí)裝入
目前主流的裝入方式,其在程序加載到內(nèi)存時(shí),不會(huì)將邏輯地址轉(zhuǎn)換物理地址,僅僅在程序代碼被執(zhí)行時(shí),才將邏輯地址轉(zhuǎn)換為物理地址。 運(yùn)行時(shí)裝入,允許程序在在讀內(nèi)存后,依舊能夠在存儲(chǔ)空間中移動(dòng)。能滿足內(nèi)存整理等場(chǎng)景的要求。
-
鏈接
鏈接也是一個(gè)比較易懂的概念,和裝入的過(guò)程頗為相似。程序在經(jīng)過(guò)編譯之后,將形成多個(gè)目標(biāo)模塊,將這多個(gè)目標(biāo)模塊組合成一個(gè)整體的過(guò)程即為鏈接。根據(jù)這些目標(biāo)模塊組合的不同時(shí)機(jī),鏈接分為以下三類(lèi)
-
靜態(tài)鏈接
在程序運(yùn)行之間,就將像目標(biāo)模塊以及庫(kù)函數(shù)合=鏈接成一個(gè)整體模塊。
-
裝入時(shí)鏈接
在裝入目標(biāo)模塊的時(shí)候,一邊裝入一邊鏈接
-
動(dòng)態(tài)鏈接
在使用到相關(guān)程序邏輯的時(shí)候,開(kāi)始鏈接。
三丶程序存儲(chǔ)空間的分配
在程序執(zhí)行完鏈接和裝入過(guò)程后,位于硬盤(pán)上的代碼就將載入內(nèi)存中。此處必須要為程序分配其所需要的存儲(chǔ)空間。依據(jù)分配存儲(chǔ)空間是否連續(xù)這一特點(diǎn),可將存儲(chǔ)空間的分配分為連續(xù)分配以及離散分配
-
連續(xù)存儲(chǔ)空間分配
-
單一連續(xù)存儲(chǔ)分配
該種方法適用于單用戶,單任務(wù)的操作系統(tǒng)。其將主內(nèi)存分為系統(tǒng)內(nèi)存和工作內(nèi)存。系統(tǒng)內(nèi)存負(fù)責(zé)載入操作系統(tǒng)等內(nèi)容。工作內(nèi)存僅載入需執(zhí)行的任務(wù),每個(gè)被加載的任務(wù)將獨(dú)占內(nèi)存。系統(tǒng)內(nèi)存和工作內(nèi)存之間相互獨(dú)立。
-
固定存儲(chǔ)分配
該方法適用于適用于多任務(wù)操作系統(tǒng)。其將主內(nèi)存分為多個(gè)大小相等的子內(nèi)存區(qū)域,當(dāng)存在任務(wù)加載需求的時(shí)候,將任務(wù)加載去子內(nèi)存區(qū)域。該方法采用的固定分區(qū),靈活性不夠。不能解決分區(qū)過(guò)大導(dǎo)致的內(nèi)存碎片的問(wèn)題,也不能解決分區(qū)過(guò)小導(dǎo)致無(wú)法載入大作業(yè)的問(wèn)題。(也可以將內(nèi)存固定劃分為不等的子內(nèi)存區(qū)域,又稱為不等分區(qū)固定分配)
-
動(dòng)態(tài)存儲(chǔ)空間分配
在任務(wù)加載進(jìn)內(nèi)存時(shí),依據(jù)任務(wù)所需內(nèi)存大小實(shí)現(xiàn)按需分配。動(dòng)態(tài)存儲(chǔ)空間分配,看似解決了內(nèi)存碎片問(wèn)題,實(shí)際上并不是這樣的。在動(dòng)態(tài)存儲(chǔ)空間分配時(shí),多次內(nèi)存分配操作,會(huì)產(chǎn)生一系列地址不聯(lián)系,大小各異的內(nèi)存空間。當(dāng)這些內(nèi)存空間被回收后,將退化成不等分區(qū)的固定存儲(chǔ)分配。
-
可重定位的分區(qū)分配
該存儲(chǔ)方式,在動(dòng)態(tài)存儲(chǔ)空間分配上添加了內(nèi)存整理功能。若當(dāng)前內(nèi)存空間不能滿足任務(wù)所需內(nèi)存空間時(shí),其會(huì)將已分配的內(nèi)存空間全部移動(dòng),使未分配的內(nèi)存空間形成一片連續(xù)的地址空間。該種方法則要求程序的裝入方式是動(dòng)態(tài)裝入
上述介紹的四種存儲(chǔ)空間分配方法被稱為連續(xù)的分配是因?yàn)槠洳荒芊指钭鳂I(yè)存儲(chǔ)。只能將作業(yè)存儲(chǔ)在一塊連續(xù)內(nèi)存空間中,并不能將作為劃分成更小的單位進(jìn)行分塊存儲(chǔ)。
-
-
離散存儲(chǔ)空間分配
離散存儲(chǔ)空間分配是指,其能將任務(wù)分割成更小的存儲(chǔ)單位。分割后的存儲(chǔ)單位連續(xù)存儲(chǔ),而存儲(chǔ)單位與存儲(chǔ)單位之間并不要求連續(xù)。通過(guò)將任務(wù)拆分進(jìn)行存儲(chǔ)的方法,能極大的提高存儲(chǔ)空間的利用率。
-
頁(yè)式存儲(chǔ)空間分配
這里將頁(yè)定義為一個(gè)固定大小的存儲(chǔ)單位。在將任務(wù)載入內(nèi)存時(shí),一個(gè)完整的任務(wù)可以被劃分成多頁(yè)。每頁(yè)獨(dú)立的存儲(chǔ)到內(nèi)存空間中,內(nèi)存空間中存儲(chǔ)位置可用物理頁(yè)號(hào)描述。每頁(yè)的存儲(chǔ)是連續(xù),頁(yè)與頁(yè)之間的存儲(chǔ)并不是連續(xù)的,而是離散存儲(chǔ)的。
為了建立任務(wù)的地址與物理空間地址之間的聯(lián)系。在內(nèi)存表中將建立頁(yè)表,完成頁(yè)號(hào)到物理號(hào)的映射
頁(yè)表 -
- 段式存儲(chǔ)空間分配
段式存儲(chǔ)的方法和頁(yè)式存儲(chǔ)的方法手段都是一致。將任務(wù)以**段為存儲(chǔ)單位,將任務(wù)分成多段進(jìn)而離散存儲(chǔ)。**在內(nèi)存中同樣維護(hù)了一張段表。段表和頁(yè)表結(jié)構(gòu)是一致的。

那么頁(yè)式存儲(chǔ)和段式存儲(chǔ)這兩者的差別究竟何在呢? 以下是頁(yè)式存儲(chǔ)和段式存儲(chǔ)的差別
- 頁(yè)是信息的物理單位,分頁(yè)式為了減少內(nèi)存碎片,提高內(nèi)存利用率而提出的。段是信息的邏輯單位,它包含一組完成的邏輯意義,其不僅能提高內(nèi)存利用率,而且在方便編程,信息共享,信息保護(hù)等方面均有好處。
- 頁(yè)的大小是有操作系統(tǒng)固定設(shè)計(jì)的,在系統(tǒng)中頁(yè)的大小是固定且唯一的。段長(zhǎng)度并不是固定的,取決于用戶所編寫(xiě)的程序,通常由編譯程序在對(duì)源程序進(jìn)行編譯時(shí),根據(jù)信息的性質(zhì)決定。
- 段頁(yè)式存儲(chǔ)空間分配
該存儲(chǔ)方式實(shí)際上是,分頁(yè)存儲(chǔ)和分段存儲(chǔ)的組合。**先將任務(wù)按照段進(jìn)行劃分,然后每段按照分頁(yè)的方式進(jìn)行存儲(chǔ),即為段頁(yè)式存儲(chǔ)。下文將比較分頁(yè)存儲(chǔ),分段存儲(chǔ),以及段頁(yè)式存儲(chǔ)內(nèi)存地址的變化**
- 分頁(yè)存儲(chǔ)地址(頁(yè)號(hào):頁(yè)內(nèi)偏移地址)
- 分段存儲(chǔ)地址(段號(hào):段內(nèi)偏移地址)
- 段頁(yè)式存儲(chǔ)(段號(hào)段內(nèi)偏移頁(yè)號(hào):頁(yè)內(nèi)偏移地址)
四丶虛擬存儲(chǔ)器
虛擬存儲(chǔ)器是現(xiàn)在操作系統(tǒng)廣泛使用的一種存儲(chǔ)方式,虛擬存儲(chǔ)能在不對(duì)物理內(nèi)存擴(kuò)容的基礎(chǔ)上,保證能夠運(yùn)行更多更大的內(nèi)存任務(wù)。虛擬存儲(chǔ)器和常規(guī)存儲(chǔ)器的不同之處在于,虛擬存儲(chǔ)器不要求你任務(wù)一次性全部載入內(nèi)存,而是按需載入內(nèi)存。并且能在內(nèi)存空間受限時(shí),將閑置的內(nèi)存作業(yè)調(diào)出內(nèi)存,這種將內(nèi)存作業(yè)調(diào)出內(nèi)存的過(guò)程稱為置換,完成置換過(guò)程的方式則稱為置換算法。在上述過(guò)程中,不將作業(yè)一次性完全載入內(nèi)存,顯然是建立在分頁(yè)存儲(chǔ)或者分段存儲(chǔ)的基礎(chǔ)上,下文對(duì)這兩種情況分別介紹
-
請(qǐng)求分頁(yè)存儲(chǔ)
請(qǐng)求分頁(yè)存儲(chǔ)具有兩點(diǎn)內(nèi)容需要理解:
-
分頁(yè)加載,按需加載
請(qǐng)求分頁(yè)存儲(chǔ)將任務(wù)以頁(yè)為單位進(jìn)行劃分,在載入內(nèi)存時(shí),并不將全部頁(yè)面載入。而是將部分必須的頁(yè)面載入內(nèi)存,其他的頁(yè)面在程序運(yùn)行中,若使用則按需載入內(nèi)存。
-
分頁(yè)置換
在內(nèi)存空間緊張時(shí),會(huì)將程序中某些使用或者近期不在使用的頁(yè)面,從內(nèi)存置換到磁盤(pán)中去。
在請(qǐng)求分頁(yè)存儲(chǔ)中,內(nèi)存中維護(hù)的頁(yè)表不再是簡(jiǎn)單的頁(yè)號(hào)到內(nèi)存物理號(hào)之間的映射了。其頁(yè)表結(jié)構(gòu)一般如下:
image- 頁(yè)號(hào),這個(gè)字段代表分頁(yè)順序
- 物理塊號(hào),這個(gè)字段代表,該頁(yè)在內(nèi)存中的位置
- 狀態(tài)位P,該狀態(tài)位用來(lái)標(biāo)識(shí)該頁(yè)是否載入內(nèi)存,true代表載入內(nèi)存,false代表未載入內(nèi)存
- 訪問(wèn)字段,該狀態(tài)位是統(tǒng)計(jì)狀態(tài)位,可以用來(lái)記錄該頁(yè)最近被訪問(wèn)的次數(shù)
- 修改位,該位用來(lái)標(biāo)識(shí),該頁(yè)載入到內(nèi)存后是否被修改過(guò)了。若內(nèi)存中修改過(guò)后,其置換到外存時(shí),需要回寫(xiě)回去。如果沒(méi)有修改過(guò),那么其置換到外存時(shí),無(wú)須回寫(xiě)回去。
- 外存地址,該位存儲(chǔ)該也在外存中的地址。一般來(lái)說(shuō),在載入內(nèi)存后,外存上依舊會(huì)留有一一份拷貝信息。
-
-
請(qǐng)求分段存儲(chǔ)
請(qǐng)求分段存儲(chǔ)與請(qǐng)求分頁(yè)存儲(chǔ)及其相似。唯一的區(qū)別便是,載入和置換的單位從頁(yè)轉(zhuǎn)換到了段。
-
置換算法
置換算法,在虛擬存儲(chǔ)器中是非常重要的內(nèi)容。在虛擬存儲(chǔ)器設(shè)計(jì)理念中,當(dāng)內(nèi)存資源緊張的時(shí)候,會(huì)依據(jù)置換算法將內(nèi)存中的頁(yè)面置換到外存中。此處介紹兩種置換算法
-
LRU(Least Recently used,最近最久使用算法)
最近最久未使用算法,在頁(yè)面項(xiàng)中添加了訪問(wèn)時(shí)間字段T,記錄最近一次訪問(wèn)到目前過(guò)去的時(shí)間。在需要進(jìn)行頁(yè)面置換時(shí)候,將T最大的頁(yè)面置換出去。
-
LFU(Least Frequently used,最少使用算法)
最少使用算法,在頁(yè)面項(xiàng)中添加了訪問(wèn)頻率字段F,計(jì)算最近一段時(shí)間內(nèi)該頁(yè)面被訪問(wèn)的頻率。在需要進(jìn)行頁(yè)面置換時(shí)候,將F最小的頁(yè)面置換出去
-