自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

內(nèi)存管理兩部曲之虛擬內(nèi)存管理

云計(jì)算 虛擬化
所謂邏輯擴(kuò)充,就是說(shuō)實(shí)際上物理內(nèi)存的容量沒(méi)有發(fā)生改變,但是它能裝的東西卻變多了,使得用戶看來(lái)似乎有一個(gè)比實(shí)際內(nèi)存大得多的內(nèi)存。

[[402636]]

本文轉(zhuǎn)載自微信公眾號(hào)「飛天小牛肉」,作者飛天小牛肉。轉(zhuǎn)載本文請(qǐng)聯(lián)系飛天小牛肉公眾號(hào)。

傳統(tǒng)存儲(chǔ)管理存在的問(wèn)題

虛擬內(nèi)存這個(gè)東西他為什么會(huì)出現(xiàn)?他出現(xiàn)的背景是什么?

前文 內(nèi)存管理兩部曲之物理內(nèi)存管理 提到:隨著用戶程序功能的增加,進(jìn)程所需要的內(nèi)存空間越來(lái)越大,進(jìn)程空間很容易就突破了物理內(nèi)存的實(shí)際大小,導(dǎo)致進(jìn)程無(wú)法運(yùn)行。

因此,為了解決內(nèi)存不足的情況,緩和大程序與小內(nèi)存之間的矛盾,擴(kuò)充內(nèi)存容量勢(shì)在必行。

可以從物理和邏輯兩方面來(lái)考慮擴(kuò)充內(nèi)存容量,物理擴(kuò)容沒(méi)啥技術(shù)含量,需要我們研究的自然是如何從邏輯上擴(kuò)充內(nèi)存容量。

所謂邏輯擴(kuò)充,就是說(shuō)實(shí)際上物理內(nèi)存的容量沒(méi)有發(fā)生改變,但是它能裝的東西卻變多了,使得用戶看來(lái)似乎有一個(gè)比實(shí)際內(nèi)存大得多的內(nèi)存。

對(duì)內(nèi)存的邏輯擴(kuò)充技術(shù)主要有三種:覆蓋技術(shù)、交換技術(shù)、以及虛擬內(nèi)存(Virtual Memory),也稱為虛擬存儲(chǔ)器。事實(shí)上,這些邏輯擴(kuò)充技術(shù)的核心理念都是一致的,研究的都是將哪個(gè)進(jìn)程(或進(jìn)程的某部分)暫時(shí)從內(nèi)存移到外存(磁盤),以騰出內(nèi)存空間供其他進(jìn)程(或進(jìn)程的某部分)占用。

覆蓋(Overlay)和交換(Swapping)這兩種存在于早期操作系統(tǒng)中的邏輯擴(kuò)充技術(shù)現(xiàn)在已經(jīng)成為歷史,這里就簡(jiǎn)單介紹下:

前文說(shuō)過(guò),早期操作系統(tǒng)僅將內(nèi)存空間分成兩塊:系統(tǒng)區(qū)(用于存放操作系統(tǒng)相關(guān)數(shù)據(jù))和用戶區(qū)(用于存放用戶進(jìn)程相關(guān)數(shù)據(jù),內(nèi)存中只能有一道用戶程序,用戶程序獨(dú)占整個(gè)用戶區(qū)空間,顯然,內(nèi)存空間容不下某個(gè)用戶程序的現(xiàn)象常會(huì)發(fā)生。

覆蓋技術(shù)(Overlay)的基本思想就是:程序運(yùn)行時(shí)并非任何時(shí)候都要訪問(wèn)程序及數(shù)據(jù)的所有部分(尤其是大程序),因此可以把用戶空間(內(nèi)存)分成一個(gè)固定區(qū)和一個(gè)或多個(gè)覆蓋區(qū)。

將程序經(jīng)?;钴S的部分放在固定區(qū),其余部分按調(diào)用關(guān)系進(jìn)行分段:首先將那些即將要用的段放在覆蓋區(qū),其他段放在外存(磁盤),在需要調(diào)用前由用戶來(lái)安排特定的系統(tǒng)調(diào)用將這些放在外存中的段調(diào)入覆蓋區(qū),替換覆蓋區(qū)中原有的段。

覆蓋技術(shù)的缺點(diǎn)顯而易見(jiàn)并且可以說(shuō)是讓人無(wú)法接受的,那就是覆蓋技術(shù)是把解決內(nèi)存空間不足的問(wèn)題交給了用戶。操作系統(tǒng)僅僅為用戶提供將覆蓋段調(diào)入內(nèi)存的系統(tǒng)調(diào)用,但是必須由用戶自己來(lái)說(shuō)明覆蓋哪個(gè)段、調(diào)入哪個(gè)段。

合著我用個(gè)電腦還得算著怎么才能讓我的程序不崩潰?

OK,可以看出來(lái),覆蓋技術(shù)其實(shí)是用在同一個(gè)作業(yè)/進(jìn)程的不同段之間的,那么不同的作業(yè)/進(jìn)程之間怎么辦呢?

這就是交換技術(shù)的適用場(chǎng)景。

交換技術(shù)(Swapping)的基本思想是:空閑進(jìn)程/作業(yè)主要存儲(chǔ)在外存(磁盤)上,當(dāng)其中某個(gè)進(jìn)程/作業(yè)需要運(yùn)行的時(shí)候,就將其從磁盤中完整地調(diào)入內(nèi)存,使該進(jìn)程運(yùn)行一段時(shí)間,然后再把它返回磁盤。所以說(shuō)當(dāng)進(jìn)程/作業(yè)不運(yùn)行的時(shí)候它們是不會(huì)占用內(nèi)存的。

事實(shí)上,覆蓋和交換技術(shù)分別解決了傳統(tǒng)存儲(chǔ)管理(物理內(nèi)存管理)中存在的某個(gè)問(wèn)題:

  • 覆蓋技術(shù)打破了作業(yè)/進(jìn)程必須一次性全部裝入內(nèi)存后才能開(kāi)始運(yùn)行(一次性)的限制
  • 交換技術(shù)打破了一旦作業(yè)被裝入內(nèi)存,就會(huì)一直駐留在內(nèi)存中,直至作業(yè)運(yùn)行結(jié)束(駐留性)的限制

當(dāng)然了,Anyway,這兩種邏輯擴(kuò)充技術(shù)已經(jīng)成為歷史,虛擬內(nèi)存技術(shù)才是目前的主流,它綜合了這兩種古老技術(shù)的特點(diǎn),單槍匹馬解決了傳統(tǒng)存儲(chǔ)管理中存在的這兩個(gè)問(wèn)題。

什么是虛擬內(nèi)存

有了上述交換技術(shù)的鋪墊,理解起虛擬內(nèi)存來(lái)也就不那么陌生了。

當(dāng)然了,在此之前,我一定要著重聲明的是,不要把虛擬內(nèi)存當(dāng)作一個(gè)實(shí)際存在的東西,它是一門技術(shù)!和交換技術(shù)覆蓋技術(shù)一樣是一門用來(lái)邏輯擴(kuò)充內(nèi)存空間的技術(shù)!

虛擬內(nèi)存技術(shù)基于一個(gè)非常重要的原理,局部性原理:

1)時(shí)間局部性:如果執(zhí)行了程序中的某條指令,那么不久后這條指令很有可能再次執(zhí)行;如果某個(gè)數(shù)據(jù)被訪問(wèn)過(guò),不久之后該數(shù)據(jù)很可能再次被訪問(wèn)。(因?yàn)槌绦蛑写嬖诖罅康难h(huán))

2)空間局部性:一旦程序訪問(wèn)了某個(gè)存儲(chǔ)單元,在不久之后,其附近的存儲(chǔ)單元也很有可能被訪問(wèn)(因?yàn)楹芏鄶?shù)據(jù)在內(nèi)存中都是連續(xù)存放的,并且程序的指令也是順序地在內(nèi)存中存放的)

基于這個(gè)局部性原理,在一個(gè)程序裝入內(nèi)存的時(shí)候,可以只將這個(gè)程序中很快會(huì)用到的部分裝入內(nèi)存,暫時(shí)用不到的部分仍然留在外存(磁盤),并且程序可以正常執(zhí)行;

而在程序執(zhí)行過(guò)程中,當(dāng) CPU 所需要的信息不在內(nèi)存中的時(shí)候,由操作系統(tǒng)負(fù)責(zé)將所需信息從外存(磁盤)調(diào)入內(nèi)存,然后繼續(xù)執(zhí)行程序;

如果調(diào)入內(nèi)存的時(shí)候內(nèi)存空間不夠,由操作系統(tǒng)負(fù)責(zé)將內(nèi)存中暫時(shí)用不到的信息換出到外存。

以上,就是虛擬內(nèi)存技術(shù)。

如何實(shí)現(xiàn)虛擬內(nèi)存技術(shù)

可以看見(jiàn),虛擬內(nèi)存允許一個(gè)作業(yè)/進(jìn)程分多次調(diào)入內(nèi)存,那如果采用連續(xù)分配方式,不方便實(shí)現(xiàn),所以虛擬內(nèi)存技術(shù)的實(shí)現(xiàn)是建立在不連續(xù)分配管理方式之上的。

傳統(tǒng)的基本分頁(yè)管理、基本分段管理、基本段頁(yè)式管理和虛擬內(nèi)存技術(shù)結(jié)合,分別稱為請(qǐng)求分頁(yè)管理(頁(yè)式虛存系統(tǒng))、請(qǐng)求分段管理(段式虛存系統(tǒng))、請(qǐng)求段頁(yè)式管理(段頁(yè)式虛存系統(tǒng))。

這幾個(gè)概念非常容易混淆,其實(shí)很容易區(qū)分,記住這句話就 OK,摘自百度百科:

如果不具備請(qǐng)求調(diào)頁(yè)、頁(yè)面置換的功能,則稱為基本分頁(yè)管理(或稱為純分頁(yè)管理),它不具有支持實(shí)現(xiàn)虛擬內(nèi)存的功能,它要求把每個(gè)作業(yè)(進(jìn)程)全部裝入內(nèi)存后方能運(yùn)行。

請(qǐng)求分段存儲(chǔ)管理也差不多,它建立在分段存儲(chǔ)管理之上,但增加了請(qǐng)求調(diào)段、段置換功能。

請(qǐng)求調(diào)頁(yè)、頁(yè)面置換 和 請(qǐng)求調(diào)段、段置換概念差不多,這里以請(qǐng)求調(diào)頁(yè)和頁(yè)面置換為例解釋下。

  • 在程序執(zhí)行過(guò)程中,當(dāng)所訪問(wèn)的信息不在內(nèi)存時(shí),由操作系統(tǒng)負(fù)責(zé)將所需信息從外存(磁盤)調(diào)入內(nèi)存,然后繼續(xù)執(zhí)行程序(操作系統(tǒng)要提供請(qǐng)求調(diào)頁(yè)的功能, 將內(nèi)存中缺失的頁(yè)面從磁盤調(diào)入內(nèi)存 );
  • 若內(nèi)存空間不夠,由操作系統(tǒng)負(fù)責(zé)將內(nèi)存中暫時(shí)用不到的信息換出到磁盤(操作系統(tǒng)要提供頁(yè)面置換的功能, 將暫時(shí)用不到的頁(yè)面換出磁盤)。

具體來(lái)說(shuō),在頁(yè)式虛存系統(tǒng)中,每當(dāng) CPU 要訪問(wèn)的頁(yè)面不在內(nèi)存時(shí),就會(huì)產(chǎn)生一個(gè)缺頁(yè)中斷,然后由操作系統(tǒng)的缺頁(yè)中斷處理程序來(lái)處理中斷。此時(shí),缺頁(yè)的這個(gè)進(jìn)程/作業(yè)就會(huì)被阻塞住,放入阻塞隊(duì)列,調(diào)頁(yè)完成后再將其喚醒,放回就緒隊(duì)列。

  • 如果內(nèi)存中有空閑塊,則為該進(jìn)程分配一個(gè)空閑塊,將所缺的頁(yè)面裝入這個(gè)塊中,并修改頁(yè)表中相應(yīng)的頁(yè)表項(xiàng)。
  • 如果內(nèi)存中沒(méi)有空閑塊,則由頁(yè)面置換算法選擇一個(gè)頁(yè)面淘汰,若該頁(yè)面在內(nèi)存期間被修改過(guò),則要將其寫回外存,未修改過(guò)的頁(yè)面不用寫回外存。

可以看出來(lái),這并不是一個(gè)簡(jiǎn)單的過(guò)程,基本分頁(yè)管理中的簡(jiǎn)單頁(yè)表已經(jīng)無(wú)法勝任這樣的工作。

我們還是先來(lái)回顧下基本分頁(yè)管理的頁(yè)表,它只有頁(yè)號(hào)和塊號(hào)兩個(gè)字段:

請(qǐng)求分頁(yè)管理的頁(yè)表自然是會(huì)復(fù)雜不少的:

1)為了實(shí)現(xiàn) “請(qǐng)求調(diào)頁(yè)” 功能,操作系統(tǒng)需要知道每個(gè)頁(yè)面是否已經(jīng)調(diào)入內(nèi)存,如果還沒(méi)調(diào)入,那么也需要知道該頁(yè)面在磁盤中存放的位置。

2)而當(dāng)內(nèi)存空間不夠時(shí),要實(shí)現(xiàn) “頁(yè)面置換” 功能,操作系統(tǒng)需要通過(guò)某些指標(biāo)來(lái)決定到底換出哪個(gè)頁(yè)面,有的頁(yè)面沒(méi)有被修改過(guò),就不用浪費(fèi)時(shí)間寫回磁盤;有的頁(yè)面修改過(guò),就需要將磁盤中的舊數(shù)據(jù)覆蓋。因此,操作系統(tǒng)也需要記錄各個(gè)頁(yè)面是否被修改的信息。

為此,請(qǐng)求分頁(yè)管理的頁(yè)表中添加了 4 個(gè)字段:

  • 狀態(tài)位:該頁(yè)面是否已調(diào)入內(nèi)存
  • 訪問(wèn)字段:可記錄該頁(yè)面最近被訪問(wèn)過(guò)幾次,或記錄上次訪問(wèn)該頁(yè)面的時(shí)間,供頁(yè)面置換算法換出頁(yè)面時(shí)參考
  • 修改位:該頁(yè)面調(diào)入內(nèi)存后是否被修改過(guò)
  • 外存地址:該頁(yè)面在外存中的存放地址

頁(yè)面置換算法也是一個(gè)很重要的內(nèi)容,本來(lái)應(yīng)該在這篇文章里一起寫的,But 想到 “頁(yè)面置換” 問(wèn)題不僅僅是在虛擬內(nèi)存中存在,在計(jì)算機(jī)設(shè)計(jì)的其他領(lǐng)域也會(huì)同樣發(fā)生(比如多數(shù)計(jì)算機(jī)都會(huì)把最近使用過(guò)的 32 字節(jié)或者 64 字節(jié)存儲(chǔ)塊保存在一個(gè)或多個(gè)高速緩存中,當(dāng)這些高速緩存存滿后就必須選取一些塊丟棄掉,以此來(lái)存入最新的使用過(guò)的存儲(chǔ)塊),所以決定后續(xù)單開(kāi)一篇文章。

 

 

責(zé)任編輯:武曉燕 來(lái)源: 飛天小牛肉
相關(guān)推薦

2009-05-26 16:08:38

網(wǎng)管軟件網(wǎng)絡(luò)拓?fù)?/a>摩卡

2010-06-10 17:12:23

Linux 內(nèi)存監(jiān)控

2011-08-03 10:33:05

網(wǎng)絡(luò)管理網(wǎng)絡(luò)拓?fù)涔芾?/a>

2022-08-02 09:02:17

虛擬內(nèi)存操作系統(tǒng)

2019-12-26 08:45:46

Linux虛擬內(nèi)存

2020-04-14 16:03:31

Linux虛擬內(nèi)存操作系統(tǒng)

2022-10-24 08:48:07

虛擬內(nèi)存Linux

2010-06-02 11:33:26

Linux 內(nèi)存監(jiān)控

2023-03-30 07:39:57

云計(jì)算虛擬化CPU

2021-06-01 08:20:55

Linux虛擬內(nèi)存命令

2019-03-20 14:29:46

Linux虛擬內(nèi)存

2018-08-09 16:32:49

內(nèi)存管理框架

2013-10-11 17:32:18

Linux運(yùn)維內(nèi)存管理

2018-07-23 09:26:08

iOS內(nèi)存優(yōu)化

2009-06-26 08:21:57

微軟Windows 7操作系統(tǒng)

2023-10-18 13:31:00

Linux內(nèi)存

2011-04-07 09:25:25

內(nèi)存Java

2014-01-14 10:52:06

Linux vmsta虛擬內(nèi)存

2020-08-10 07:44:13

虛擬內(nèi)存交換內(nèi)存Linux

2020-11-06 07:11:40

內(nèi)存虛擬Redis
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)