操作系統(tǒng)

這篇文 章總結(jié)了一些重要的操作系統(tǒng)相關(guān)的問(wèn)題比如進(jìn)程管理、內(nèi)存管理剥悟、虛擬內(nèi)存等等灵寺。

1. 操作系統(tǒng)基礎(chǔ)

1.1 什么是操作系統(tǒng)?

  1. 操作系統(tǒng)(Operating System,簡(jiǎn)稱 OS)是管理計(jì)算機(jī)硬件與軟件資源的程序区岗,是計(jì)算機(jī) 的基石略板。
  2. 操作系統(tǒng)本質(zhì)上是一個(gè)運(yùn)行在計(jì)算機(jī)上的軟件程序 ,用于管理計(jì)算機(jī)硬件和軟件資源慈缔。 舉例:運(yùn)行在你電腦上的所有應(yīng)用程序都通過(guò)操作系統(tǒng)來(lái)調(diào)用系統(tǒng)內(nèi)存以及磁盤等等硬件叮称。
  3. 操作系統(tǒng)存在屏蔽了硬件層的復(fù)雜性。 操作系統(tǒng)就像是硬件使用的負(fù)責(zé)人藐鹤,統(tǒng)籌著各種相關(guān)事項(xiàng)瓤檐。
  4. 操作系統(tǒng)的內(nèi)核(Kernel)是操作系統(tǒng)的核心部分,它負(fù)責(zé)系統(tǒng)的內(nèi)存管理娱节,硬件設(shè)備的管理挠蛉,文件系統(tǒng)的管理以及應(yīng)用程序的管理。 內(nèi)核是連接應(yīng)用程序和硬件的橋梁肄满,決定著系統(tǒng)的性能和穩(wěn)定性谴古。
image.png

1.2 系統(tǒng)調(diào)用

介紹系統(tǒng)調(diào)用之前绍移,我們先來(lái)了解一下用戶態(tài)和系統(tǒng)態(tài)。
根據(jù)進(jìn)程訪問(wèn)資源的特點(diǎn)讥电,我們可以把進(jìn)程在系統(tǒng)上的運(yùn)行分為兩個(gè)級(jí)別:

  1. 用戶態(tài)(user mode) : 用戶態(tài)運(yùn)行的進(jìn)程或可以直接讀取用戶程序的數(shù)據(jù)蹂窖。
  2. 系統(tǒng)態(tài)(kernel mode):可以簡(jiǎn)單的理解系統(tǒng)態(tài)運(yùn)行的進(jìn)程或程序幾乎可以訪問(wèn)計(jì)算機(jī)的任何資源,不受限制恩敌。

說(shuō)了用戶態(tài)和系統(tǒng)態(tài)之后瞬测,那么什么是系統(tǒng)調(diào)用呢?我們運(yùn)行的程序基本都是運(yùn)行在用戶態(tài),如果我們調(diào)用操作系統(tǒng)提供的系統(tǒng)態(tài)級(jí)別的子功能咋辦 呢?那就需要系統(tǒng)調(diào)用了!

也就是說(shuō)在我們運(yùn)行的用戶程序中纠炮,凡是與系統(tǒng)態(tài)級(jí)別的資源有關(guān)的操作(如文件管理月趟、進(jìn)程控 制、內(nèi)存管理等)恢口,都必須通過(guò)系統(tǒng)調(diào)用方式向操作系統(tǒng)提出服務(wù)請(qǐng)求孝宗,并由操作系統(tǒng)代為完成。

這些系統(tǒng)調(diào)用按功能大致可分為如下幾類:

  • 設(shè)備管理耕肩。完成設(shè)備的請(qǐng)求或釋放因妇,以及設(shè)備啟動(dòng)等功能。
  • 文件管理猿诸。完成文件的讀婚被、寫、創(chuàng)建及刪除等功能梳虽。
  • 進(jìn)程控制址芯。完成進(jìn)程的創(chuàng)建、撤銷窜觉、阻塞及喚醒等功能谷炸。
  • 進(jìn)程通信。完成進(jìn)程之間的消息傳遞或信號(hào)傳遞等功能禀挫。
  • 內(nèi)存管理旬陡。完成內(nèi)存的分配、回收以及獲取作業(yè)占用內(nèi)存區(qū)大小及地址等功能特咆。

2. 進(jìn)程和線程

2.1 進(jìn)程和線程的區(qū)別

下圖是 Java 內(nèi)存區(qū)域季惩,我們從 JVM 的?度來(lái)說(shuō)一下線程和進(jìn)程之間的關(guān)系吧!


image.png

從上圖可以看出:一個(gè)進(jìn)程中可以有多個(gè)線程,多個(gè)線程共享進(jìn)程的堆和方法區(qū) (JDK1.8 之后的 元空間)資源腻格,但是每個(gè)線程有自己的程序計(jì)數(shù)器画拾、虛擬機(jī)棧 和 本地方法棧。

總結(jié): 線程是進(jìn)程劃分成的更小的運(yùn)行單位,一個(gè)進(jìn)程在其執(zhí)行的過(guò)程中可以產(chǎn)生多個(gè)線程菜职。線程和進(jìn)程最大的不同在于基本上各進(jìn)程是獨(dú)立的青抛,而各線程則不一定,因?yàn)橥贿M(jìn)程中的線程極 有可能會(huì)相互影響酬核。線程執(zhí)行開銷小蜜另,但不利于資源的管理和保護(hù)敌厘;而進(jìn)程正相反轮蜕。

2.2 進(jìn)程有哪幾種狀態(tài)?

我們一般把進(jìn)程大致分為 5 種狀態(tài)他宛,這一點(diǎn)和線程很像!

  • 新建狀態(tài)(new) :進(jìn)程正在被創(chuàng)建奴愉,尚未到就緒狀態(tài)。
  • 就緒狀態(tài)(ready) :進(jìn)程已處于準(zhǔn)備運(yùn)行狀態(tài)此迅,即進(jìn)程獲得了除了處理器之外的一切所需資 源汽畴,一旦得到處理器資源(處理器分配的時(shí)間片)即可運(yùn)行。
  • 運(yùn)行狀態(tài)(running) :進(jìn)程正在處理器上上運(yùn)行(單核 CPU 下任意時(shí)刻只有一個(gè)進(jìn)程處于運(yùn) 行狀態(tài))耸序。
  • 阻塞狀態(tài)(waiting) :又稱為等待狀態(tài)忍些,進(jìn)程正在等待某一事件而暫停運(yùn)行如等待某資源為 可用或等待 IO 操作完成。即使處理器空閑坎怪,該進(jìn)程也不能運(yùn)行罢坝。
  • 結(jié)束狀態(tài)(terminated) :進(jìn)程正在從系統(tǒng)中消失〗亮可能是進(jìn)程正常結(jié)束或其他原因中斷退出運(yùn)行嘁酿。

2.3 進(jìn)程間的通信方式

大概有 7 種常?的進(jìn)程間的通信方式。

  1. 管道/匿名管道(Pipes) :用于具有親緣關(guān)系的父子進(jìn)程間或者兄弟進(jìn)程之間的通信戈钢。
  2. 有名管道(Names Pipes) : 匿名管道由于沒(méi)有名字痹仙,只能用于親緣關(guān)系的進(jìn)程間通信是尔。為了克服這個(gè)缺點(diǎn)殉了,提出了有名管道。有名管道嚴(yán)格遵循先進(jìn)先出(first in first out)拟枚。有名管道以磁盤文件的方式存在薪铜,可以實(shí)現(xiàn)本機(jī)任意兩個(gè)進(jìn)程通信。
  3. 信號(hào)(Signal) :信號(hào)是一種比較復(fù)雜的通信方式恩溅,用于通知接收進(jìn)程某個(gè)事件已經(jīng)發(fā)生;
  4. 消息隊(duì)列(Message Queuing) :消息隊(duì)列是消息的鏈表,具有特定的格式,存放在內(nèi)存中并由消息隊(duì)列標(biāo)識(shí)符標(biāo)識(shí)隔箍。管道和消息隊(duì)列的通信數(shù)據(jù)都是先進(jìn)先出的原則。與管道(無(wú)名管道:只存在于內(nèi)存中的文件;命名管道:存在于實(shí)際的磁盤介質(zhì)或者文件系統(tǒng))不同的是消息隊(duì)列存放在內(nèi)核中脚乡,只有在內(nèi)核重啟(即蜒滩,操作系統(tǒng)重啟)或者顯示地刪除一個(gè)消息隊(duì)列 時(shí),該消息隊(duì)列才會(huì)被真正的刪除奶稠。消息隊(duì)列可以實(shí)現(xiàn)消息的隨機(jī)查詢,消息不一定要以先進(jìn) 先出的次序讀取,也可以按消息的類型讀取.比 FIFO 更有優(yōu)勢(shì)俯艰。消息隊(duì)列克服了信號(hào)承載信 息量少,管道只能承載無(wú)格式字 節(jié)流以及緩沖區(qū)大小受限等缺锌订。
  5. 信號(hào)量(Semaphores) :信號(hào)量是一個(gè)計(jì)數(shù)器竹握,用于多進(jìn)程對(duì)共享數(shù)據(jù)的訪問(wèn),信號(hào)量的意 圖在于進(jìn)程間同步辆飘。這種通信方式主要用于解決與同步相關(guān)的問(wèn)題并避免競(jìng)爭(zhēng)條件啦辐。
  6. 共享內(nèi)存(Shared memory) :使得多個(gè)進(jìn)程可以訪問(wèn)同一塊內(nèi)存空間谓传,不同進(jìn)程可以及時(shí)看到對(duì)方進(jìn)程中對(duì)共享內(nèi)存中數(shù)據(jù)的更新。這種方式需要依靠某種同步操作芹关,如互斥鎖和信 號(hào)量等续挟。可以說(shuō)這是最有用的進(jìn)程間通信方式侥衬。
  7. 套接字(Sockets) : 此方法主要用于在客戶端和服務(wù)器之間通過(guò)網(wǎng)絡(luò)進(jìn)行通信庸推。套接字是支持 TCP/IP 的網(wǎng)絡(luò)通信的基本操作單元,可以看做是不同主機(jī)之間的進(jìn)程進(jìn)行雙向通信的端點(diǎn)浇冰,簡(jiǎn)單的說(shuō)就是通信的兩方的一種約定贬媒,用套接字中的相關(guān)函數(shù)來(lái)完成通信過(guò)程。

2.4 線程間的同步的方式

線程同步是兩個(gè)或多個(gè)共享關(guān)鍵資源的線程的并發(fā)執(zhí)行肘习。應(yīng)用同步線程以避免關(guān)鍵的資源使用沖突际乘。操作系統(tǒng)一般有下面三種線程同步的方式:

  1. 互斥量(Mutex):采用互斥對(duì)象機(jī)制,只有擁有互斥對(duì)象的線程才有訪問(wèn)公共資源的權(quán)限漂佩。 因?yàn)榛コ鈱?duì)象只有一個(gè)脖含,所以可以保證公共資源不會(huì)被多個(gè)線程同時(shí)訪問(wèn)。比如 Java 中的 synchronized 關(guān)鍵詞和各種 Lock 都是這種機(jī)制投蝉。
  2. 信號(hào)量(Semphares) :它允許同一時(shí)刻多個(gè)線程訪問(wèn)同一資源养葵,但是需要控制同一時(shí)刻訪 問(wèn)此資源的最大線程數(shù)量
  3. 事件(Event) :Wait/Notify:通過(guò)通知操作的方式來(lái)保持多線程同步,還可以方便的實(shí)現(xiàn)多線程優(yōu)先級(jí)的比較操作

2.5 進(jìn)程的調(diào)度算法

為了確定首先執(zhí)行哪個(gè)進(jìn)程以及最后執(zhí)行哪個(gè)進(jìn)程以實(shí)現(xiàn)最大 CPU 利用率瘩缆,計(jì)算機(jī)科學(xué)家已經(jīng) 定義了一些算法关拒,它們是:

  1. 先到先服務(wù)(FCFS)調(diào)度算法 : 從就緒隊(duì)列中選擇一個(gè)最先進(jìn)入該隊(duì)列的進(jìn)程為之分配資源, 使它立即執(zhí)行并一直執(zhí)行到完成或發(fā)生某事件而被阻塞放棄占用 CPU 時(shí)再重新調(diào)度庸娱。
  2. 短作業(yè)優(yōu)先(SJF)的調(diào)度算法 : 從就緒隊(duì)列中選出一個(gè)估計(jì)運(yùn)行時(shí)間最短的進(jìn)程為之分配資 源着绊,使它立即執(zhí)行并一直執(zhí)行到完成或發(fā)生某事件而被阻塞放棄占用 CPU 時(shí)再重新調(diào)度。
  3. 時(shí)間片輪轉(zhuǎn)調(diào)度算法 : 時(shí)間片輪轉(zhuǎn)調(diào)度是一種最古老熟尉,最簡(jiǎn)單归露,最公平且使用最廣的算法, 又稱 RR(Round robin)調(diào)度斤儿。每個(gè)進(jìn)程被分配一個(gè)時(shí)間段剧包,稱作它的時(shí)間片,即該進(jìn)程允許運(yùn)行的時(shí)間往果。
  4. 多級(jí)反饋隊(duì)列調(diào)度算法 :前面介紹的幾種進(jìn)程調(diào)度的算法都有一定的局限性疆液。如短進(jìn)程優(yōu)先的調(diào)度算法,僅照顧了短進(jìn)程而忽略了?進(jìn)程 棚放。多級(jí)反饋隊(duì)列調(diào)度算法既能使高優(yōu)先級(jí)的作業(yè)得到響應(yīng)又能使短作業(yè)(進(jìn)程)迅速完成枚粘。因而它是目前被公認(rèn)的一種較好的進(jìn)程調(diào)度算法,UNIX 操作系統(tǒng)采取的便是這種調(diào)度算法飘蚯。
  5. 優(yōu)先級(jí)調(diào)度 : 為每個(gè)流程分配優(yōu)先級(jí)馍迄,首先執(zhí)行具有最高優(yōu)先級(jí)的進(jìn)程福也,依此類推。具有相同優(yōu)先級(jí)的進(jìn)程以 FCFS 方式執(zhí)行攀圈”┐眨可以根據(jù)內(nèi)存要求,時(shí)間要求或任何其他資源要求來(lái) 確定優(yōu)先級(jí)赘来。

3. 操作系統(tǒng)內(nèi)存管理基礎(chǔ)

3.2 操作系統(tǒng)的內(nèi)存管理主要是做什么?

操作系統(tǒng)的內(nèi)存管理主要負(fù)責(zé)內(nèi)存的分配與回收(malloc 函數(shù):申請(qǐng)內(nèi)存现喳,free 函數(shù): 釋放內(nèi)存),另外地址轉(zhuǎn)換也就是將邏輯地址轉(zhuǎn)換成相應(yīng)的物理地址等功能也是操作系統(tǒng)內(nèi)存管 理做的事情犬辰。

3.3 常?的幾種內(nèi)存管理機(jī)制

操作系統(tǒng)的內(nèi)存管理機(jī)制了解嗎?內(nèi)存管理有哪幾種方式?

簡(jiǎn)單分為連續(xù)分配管理方式和非連續(xù)分配管理方式這兩種嗦篱。連續(xù)分配管理方式是指為一個(gè)用戶程 序分配一個(gè)連續(xù)的內(nèi)存空間,常?的如 塊式管理 幌缝。同樣地灸促,非連續(xù)分配管理方式允許一個(gè)程序 使用的內(nèi)存分布在離散或者說(shuō)不相鄰的內(nèi)存中,常?的如?式管理 和 段式管理涵卵。

  1. 塊式管理 : 遠(yuǎn)古時(shí)代的計(jì)算機(jī)操系統(tǒng)的內(nèi)存管理方式浴栽。將內(nèi)存分為幾個(gè)固定大小的塊,每 個(gè)塊中只包含一個(gè)進(jìn)程轿偎。如果程序運(yùn)行需要內(nèi)存的話典鸡,操作系統(tǒng)就分配給它一塊,如果程序 運(yùn)行只需要很小的空間的話坏晦,分配的這塊內(nèi)存很大一部分幾乎被浪費(fèi)了萝玷。這些在每個(gè)塊中未 被利用的空間,我們稱之為碎片英遭。

  2. ?式管理 :把主存分為大小相等且固定的一?一?的形式间护,???小,相對(duì)相比于塊式管理的劃分力度更大挖诸,提高了內(nèi)存利用率,減少了碎片法精。?式管理通過(guò)?表對(duì)應(yīng)邏輯地址和物理地址多律。

  3. 段式管理 : ?式管理雖然提高了內(nèi)存利用率,但是?式管理其中的?實(shí)際并無(wú)任何實(shí)際意義搂蜓。 段式管理把主存分為一段段的狼荞,每一段的空間又要比一?的空間小很多 。但是帮碰,最重 要的是段是有實(shí)際意義的相味,每個(gè)段定義了一組邏輯信息,例如,有主程序段 MAIN殉挽、子程序段 X丰涉、數(shù)據(jù)段 D 及棧段 S 等拓巧。 段式管理通過(guò)段表對(duì)應(yīng)邏輯地址和物理地址。

  4. 段?式管理機(jī)制結(jié)合 了段式管理和?式管理的優(yōu)點(diǎn)一死。簡(jiǎn)單來(lái)說(shuō)段?式管理機(jī)制就是把主存先分成若干段肛度,每個(gè)段又分成若干?,也就是說(shuō) 段?式管理機(jī)制中段與段之間以及段的內(nèi)部的都是離散的投慈。

3.3 快表和多級(jí)?表

?表管理機(jī)制中有兩個(gè)很重要的概念:快表和多級(jí)?表承耿,這兩個(gè)東?分別解決了?
表管理中很重要的兩個(gè)問(wèn)題。簡(jiǎn)單介紹一下
在分?內(nèi)存管理中伪煤,很重要的兩點(diǎn)是:

  1. 虛擬地址到物理地址的轉(zhuǎn)換要快加袋。
  2. 解決虛擬地址空間大,?表也會(huì)很大的問(wèn)題抱既。

快表
為了解決虛擬地址到物理地址的轉(zhuǎn)換速度锁荔,操作系統(tǒng)在 ?表方案 基礎(chǔ)之上引入了 快表 來(lái)加速虛 擬地址到物理地址的轉(zhuǎn)換。我們可以把快表理解為一種特殊的高速緩沖存儲(chǔ)器(Cache)蝙砌,其中 的內(nèi)容是?表的一部分或者全部?jī)?nèi)容阳堕。作為?表的 Cache,它的作用與?表相似择克,但是提高了訪 問(wèn)速率恬总。由于采用?表做地址轉(zhuǎn)換,讀寫內(nèi)存數(shù)據(jù)時(shí) CPU 要訪問(wèn)兩次主存肚邢。有了快表壹堰,有時(shí)只 要訪問(wèn)一次高速緩沖存儲(chǔ)器,一次主存骡湖,這樣可加速查找并提高指令執(zhí)行速度贱纠。

使用快表之后的地址轉(zhuǎn)換流程是這樣的:

  1. 根據(jù)虛擬地址中的?號(hào)查快表;
  2. 如果該?在快表中,直接從快表中讀取相應(yīng)的物理地址;
  3. 如果該?不在快表中响蕴,就訪問(wèn)內(nèi)存中的?表谆焊,再?gòu)?表中得到物理地址,同時(shí)將?表中的該映射表項(xiàng)添加到快表中;
  4. 當(dāng)快表填滿后浦夷,又要登記新?時(shí)辖试,就按照一定的淘汰策略淘汰掉快表中的一個(gè)?。

看完了之后你會(huì)發(fā)現(xiàn)快表和我們平時(shí)經(jīng)常在我們開發(fā)的系統(tǒng)使用的緩存(比如 Redis)很像劈狐,的 確是這樣的罐孝,操作系統(tǒng)中的很多思想、很多經(jīng)典的算法肥缔,你都可以在我們?nèi)粘i_發(fā)使用的各種工 具或者框架中找到它們的影子莲兢。

多級(jí)?表
引入多級(jí)?表的主要目的是為了避免把全部?表一直放在內(nèi)存中占用過(guò)多空間,特別是那些根本 就不需要的?表就不需要保留在內(nèi)存中。多級(jí)?表屬于時(shí)間換空間的典型場(chǎng)景改艇,具體可以查看下 面這篇文章
多級(jí)?表如何節(jié)約內(nèi)存

總結(jié)
為了提高內(nèi)存的空間性能收班,提出了多級(jí)?表的概念;但是提到空間性能是以浪費(fèi)時(shí)間性能為基礎(chǔ) 的,因此為了補(bǔ)充損失的時(shí)間性能遣耍,提出了快表(即 TLB)的概念闺阱。 不論是快表還是多級(jí)?表實(shí) 際上都利用到了程序的局部性原理,局部性原理在后面的虛擬內(nèi)存這部分會(huì)介紹到舵变。

3.4 分?機(jī)制和分段機(jī)制的共同點(diǎn)和區(qū)別

  1. 共同點(diǎn):
  • 分?機(jī)制和分段機(jī)制都是為了提高內(nèi)存利用率酣溃,較少內(nèi)存碎片。
  • ?和段都是離散存儲(chǔ)的纪隙,所以兩者都是離散分配內(nèi)存的方式赊豌。但是,每個(gè)?和段中的內(nèi)存是連續(xù)的绵咱。
  1. 區(qū)別:
  • ?的大小是固定的碘饼,由操作系統(tǒng)決定;而段的大小不固定,取決于我們當(dāng)前運(yùn)行的程 序悲伶。
  • 分?僅僅是為了滿足操作系統(tǒng)內(nèi)存管理的需求艾恼,而段是邏輯信息的單位,在程序中可以 體現(xiàn)為代碼段麸锉,數(shù)據(jù)段钠绍,能夠更好滿足用戶的需要。

3.5 邏輯(虛擬)地址和物理地址

我們編程一般只有可能和邏輯地址打交道花沉,邏輯地址由操作系統(tǒng)決定柳爽。物理地址指的是真實(shí)物理內(nèi)存中地址,更具體一點(diǎn)來(lái)說(shuō)就是內(nèi)存地址寄存器中的地址碱屁。物理地址是內(nèi)存單元真正的地址磷脯。

3.6 CPU 尋址了解嗎?為什么需要虛擬地址空間?

現(xiàn)代處理器使用的是一種稱為 虛擬尋址(Virtual Addressing) 的尋址方式。使用虛擬尋址娩脾,CPU 需要將虛擬地址翻譯成物理地址赵誓,這樣才能訪問(wèn)到真實(shí)的物理內(nèi)存。 實(shí)際上完成虛擬地址轉(zhuǎn)換為 物理地址轉(zhuǎn)換的硬件是 CPU 中含有一個(gè)被稱為 內(nèi)存管理單元(Memory Management Unit, MMU) 的硬件晦雨。如下圖所示:

image.png

為什么要有虛擬地址空間呢?
先從沒(méi)有虛擬地址空間的時(shí)候說(shuō)起吧架曹!沒(méi)有虛擬地址空間的時(shí)候,程序都是直接訪問(wèn)和操作的都是物理內(nèi)存 闹瞧。但是這樣有什么問(wèn)題呢?

  1. 用戶程序可以訪問(wèn)任意內(nèi)存,尋址內(nèi)存的每個(gè)字節(jié)展辞,這樣就很容易(有意或者無(wú)意)破壞操作系統(tǒng)奥邮,造成操作系統(tǒng)崩潰。
  2. 想要同時(shí)運(yùn)行多個(gè)程序特別困難,比如你想同時(shí)運(yùn)行一個(gè)微信和一個(gè) QQ 音樂(lè)都不行洽腺。為什 么呢?舉個(gè)簡(jiǎn)單的例子:微信在運(yùn)行的時(shí)候給內(nèi)存地址 1xxx 賦值后脚粟,QQ 音樂(lè)也同樣給內(nèi)存地址 1xxx 賦值,那么 QQ 音樂(lè)對(duì)內(nèi)存的賦值就會(huì)覆蓋微信之前所賦的值蘸朋,這就造成了微信這個(gè)程序就會(huì)崩潰核无。

總結(jié)來(lái)說(shuō):如果直接把物理地址暴露出來(lái)的話會(huì)帶來(lái)嚴(yán)重問(wèn)題,比如可能對(duì)操作系統(tǒng)造成傷害以 及給同時(shí)運(yùn)行多個(gè)程序造成困難藕坯。

通過(guò)虛擬地址訪問(wèn)內(nèi)存有以下優(yōu)勢(shì):

  • 程序可以使用一系列相鄰的虛擬地址來(lái)訪問(wèn)物理內(nèi)存中不相鄰的大內(nèi)存緩沖區(qū)团南。
  • 程序可以使用一系列虛擬地址來(lái)訪問(wèn)大于可用物理內(nèi)存的內(nèi)存緩沖區(qū)。當(dāng)物理內(nèi)存的供應(yīng)量 變小時(shí)炼彪,內(nèi)存管理器會(huì)將物理內(nèi)存?(通常大小為 4 KB)保存到磁盤文件吐根。數(shù)據(jù)或代碼?會(huì)根據(jù)需要在物理內(nèi)存與磁盤之間移動(dòng)。
  • 不同進(jìn)程使用的虛擬地址彼此隔離辐马。一個(gè)進(jìn)程中的代碼無(wú)法更改正在由另一進(jìn)程或操作系統(tǒng) 使用的物理內(nèi)存拷橘。

4. 虛擬內(nèi)存

4.1 什么是虛擬內(nèi)存(Virtual Memory)?

這個(gè)在我們平時(shí)使用電腦特別是 Windows 系統(tǒng)的時(shí)候太常?了。很多時(shí)候我們使用點(diǎn) 開了很多占內(nèi)存的軟件喜爷,這些軟件占用的內(nèi)存可能已經(jīng)遠(yuǎn)遠(yuǎn)超出了我們電腦本身具有的物理內(nèi) 存冗疮。為什么可以這樣呢? 正是因?yàn)?虛擬內(nèi)存 的存在,通過(guò) 虛擬內(nèi)存 可以讓程序可以擁有超過(guò)系 統(tǒng)物理內(nèi)存大小的可用內(nèi)存空間檩帐。另外术幔,虛擬內(nèi)存為每個(gè)進(jìn)程提供了一個(gè)一致的、私有的地址空 間轿塔,它讓每個(gè)進(jìn)程產(chǎn)生了一種自己在獨(dú)享主存的錯(cuò)覺(jué)(每個(gè)進(jìn)程擁有一片連續(xù)完整的內(nèi)存空 間)特愿。這樣會(huì)更加有效地管理內(nèi)存并減少出錯(cuò)。

虛擬內(nèi)存是計(jì)算機(jī)系統(tǒng)內(nèi)存管理的一種技術(shù)勾缭,我們可以手動(dòng)設(shè)置自己電腦的虛擬內(nèi)存揍障。不要單純 認(rèn)為虛擬內(nèi)存只是“使用硬盤空間來(lái)擴(kuò)展內(nèi)存“的技術(shù)。虛擬內(nèi)存的重要意義是它定義了一個(gè)連續(xù) 的虛擬地址空間俩由,并且把內(nèi)存擴(kuò)展到硬盤空間毒嫡。

維基百科中有幾句話是這樣介紹虛擬內(nèi)存的。

虛擬內(nèi)存 使得應(yīng)用程序認(rèn)為它擁有連續(xù)的可用的內(nèi)存(一個(gè)連續(xù)完整的地址空間)幻梯,而實(shí) 際上兜畸,它通常是被分隔成多個(gè)物理內(nèi)存碎片,還有部分暫時(shí)存儲(chǔ)在外部磁盤存儲(chǔ)器上碘梢,在需 要時(shí)進(jìn)行數(shù)據(jù)交換咬摇。與沒(méi)有使用虛擬內(nèi)存技術(shù)的系統(tǒng)相比,使用這種技術(shù)的系統(tǒng)使得大型程 序的編寫變得更容易煞躬,對(duì)真正的物理內(nèi)存(例如 RAM)的使用也更有效率肛鹏。目前逸邦,大多數(shù) 操作系統(tǒng)都使用了虛擬內(nèi)存,如 Windows 家族的“虛擬內(nèi)存”;Linux 的“交換空間”等在扰。

4.2 局部性原理

要想更好地理解虛擬內(nèi)存技術(shù)缕减,必須要知道計(jì)算機(jī)中著名的局部性原理。另外芒珠,局
部性原理既適用于程序結(jié)構(gòu)桥狡,也適用于數(shù)據(jù)結(jié)構(gòu),是非常重要的一個(gè)概念皱卓。

局部性原理是虛擬內(nèi)存技術(shù)的基礎(chǔ)裹芝,正是因?yàn)槌绦蜻\(yùn)行具有局部性原理,才可以只裝入 部分程序到內(nèi)存就開始運(yùn)行好爬。

局部性原理表現(xiàn)在以下兩個(gè)方面:
時(shí)間局部性:如果程序中的某條指令一旦執(zhí)行局雄,不久以后該指令可能再次執(zhí)行;如果某數(shù)據(jù) 被訪問(wèn)過(guò),不久以后該數(shù)據(jù)可能再次被訪問(wèn)存炮。產(chǎn)生時(shí)間局部性的典型原因炬搭,是由于在程序中 存在著大量的循環(huán)操作。
空間局部性:一旦程序訪問(wèn)了某個(gè)存儲(chǔ)單元穆桂,在不久之后宫盔,其附近的存儲(chǔ)單元也將被訪問(wèn), 即程序在一段時(shí)間內(nèi)所訪問(wèn)的地址享完,可能集中在一定的范圍之內(nèi)灼芭,這是因?yàn)橹噶钔ǔJ琼樞?存放、順序執(zhí)行的般又,數(shù)據(jù)也一般是以向量彼绷、數(shù)組、表等形式簇聚存儲(chǔ)的茴迁。

時(shí)間局部性是通過(guò)將近來(lái)使用的指令和數(shù)據(jù)保存到高速緩存存儲(chǔ)器中寄悯,并使用高速緩存的層次結(jié) 構(gòu)實(shí)現(xiàn)《橐澹空間局部性通常是使用較大的高速緩存猜旬,并將預(yù)取機(jī)制集成到高速緩存控制邏輯中實(shí) 現(xiàn)。虛擬內(nèi)存技術(shù)實(shí)際上就是建立了 “內(nèi)存一外存”的兩級(jí)存儲(chǔ)器的結(jié)構(gòu)倦卖,利用局部性原理實(shí)現(xiàn)髙速緩存洒擦。

4.3 虛擬存儲(chǔ)器

虛擬存儲(chǔ)器又叫做虛擬內(nèi)存,都是 Virtual Memory 的翻譯怕膛,屬于同一個(gè)概念熟嫩。

基于局部性原理,在程序裝入時(shí)褐捻,可以將程序的一部分裝入內(nèi)存邦危,而將其他部分留在外存洋侨,就可 以啟動(dòng)程序執(zhí)行舍扰。由于外存往往比內(nèi)存大很多倦蚪,所以我們運(yùn)行的軟件的內(nèi)存大小實(shí)際上是可以比 計(jì)算機(jī)系統(tǒng)實(shí)際的內(nèi)存大小大的。在程序執(zhí)行過(guò)程中边苹,當(dāng)所訪問(wèn)的信息不在內(nèi)存時(shí)陵且,由操作系統(tǒng) 將所需要的部分調(diào)入內(nèi)存,然后繼續(xù)執(zhí)行程序个束。另一方面慕购,操作系統(tǒng)將內(nèi)存中暫時(shí)不使用的內(nèi)容 換到外存上,從而騰出空間存放將要調(diào)入內(nèi)存的信息茬底。這樣沪悲,計(jì)算機(jī)好像為用戶提供了一個(gè)比實(shí) 際內(nèi)存大的多的存儲(chǔ)器——虛擬存儲(chǔ)器。

實(shí)際上阱表,我覺(jué)得虛擬內(nèi)存同樣是一種時(shí)間換空間的策略殿如,你用 CPU 的計(jì)算時(shí)間,?的調(diào)入調(diào)出 花費(fèi)的時(shí)間最爬,換來(lái)了一個(gè)虛擬的更大的空間來(lái)支持程序的運(yùn)行涉馁。不得不感嘆,程序世界幾乎不是 時(shí)間換空間就是空間換時(shí)間爱致。

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

虛擬內(nèi)存的實(shí)現(xiàn)需要建立在離散分配的內(nèi)存管理方式的基礎(chǔ)上烤送。 虛擬內(nèi)存的實(shí)現(xiàn)有以下 三種方式:

請(qǐng)求分?存儲(chǔ)管理 :建立在分?管理之上,為了支持虛擬存儲(chǔ)器功能而增加了請(qǐng)求調(diào)?功能 和?面置換功能糠悯。請(qǐng)求分?是目前最常用的一種實(shí)現(xiàn)虛擬存儲(chǔ)器的方法帮坚。請(qǐng)求分?存儲(chǔ)管理 系統(tǒng)中,在作業(yè)開始運(yùn)行之前互艾,僅裝入當(dāng)前要執(zhí)行的部分段即可運(yùn)行试和。假如在作業(yè)運(yùn)行的過(guò) 程中發(fā)現(xiàn)要訪問(wèn)的?面不在內(nèi)存,則由處理器通知操作系統(tǒng)按照對(duì)應(yīng)的?面置換算法將相應(yīng) 的?面調(diào)入到主存忘朝,同時(shí)操作系統(tǒng)也可以將暫時(shí)不用的?面置換到外存中灰署。

  1. 請(qǐng)求分段存儲(chǔ)管理 :建立在分段存儲(chǔ)管理之上,增加了請(qǐng)求調(diào)段功能局嘁、分段置換功能溉箕。請(qǐng)求 分段儲(chǔ)存管理方式就如同請(qǐng)求分?儲(chǔ)存管理方式一樣,在作業(yè)開始運(yùn)行之前悦昵,僅裝入當(dāng)前要 執(zhí)行的部分段即可運(yùn)行;在執(zhí)行過(guò)程中肴茄,可使用請(qǐng)求調(diào)入中斷動(dòng)態(tài)裝入要訪問(wèn)但又不在內(nèi)存 的程序段;當(dāng)內(nèi)存空間已滿,而又需要裝入新的段時(shí)但指,根據(jù)置換功能適當(dāng)調(diào)出某個(gè)段寡痰,以便 騰出空間而裝入新的段抗楔。
  2. 請(qǐng)求段?式存儲(chǔ)管理

這里多說(shuō)一下?很多人容易搞混請(qǐng)求分?與分?存儲(chǔ)管理,兩者有何不同呢?
請(qǐng)求分?存儲(chǔ)管理建立在分?管理之上拦坠。他們的根本區(qū)別是是否將程序全部所需的全部地址空間 都裝入主存连躏,這也是請(qǐng)求分?存儲(chǔ)管理可以提供虛擬內(nèi)存的原因,我們?cè)谏厦嬉呀?jīng)分析過(guò)了贞滨。

它們之間的根本區(qū)別在于是否將一作業(yè)的全部地址空間同時(shí)裝入主存入热。請(qǐng)求分?存儲(chǔ)管理不要求 將作業(yè)全部地址空間同時(shí)裝入主存∠基于這一點(diǎn)勺良,請(qǐng)求分?存儲(chǔ)管理可以提供虛存,而分?存儲(chǔ) 管理卻不能提供虛存骄噪。

不管是上面那種實(shí)現(xiàn)方式尚困,我們一般都需要:

  1. 一定容量的內(nèi)存和外存:在載入程序的時(shí)候,只需要將程序的一部分裝入內(nèi)存链蕊,而將其他部 分留在外存事甜,然后程序就可以執(zhí)行了;
  2. 缺?中斷:如果需執(zhí)行的指令或訪問(wèn)的數(shù)據(jù)尚未在內(nèi)存(稱為缺?或缺段),則由處理器通 知操作系統(tǒng)將相應(yīng)的?面或段調(diào)入到內(nèi)存示弓,然后繼續(xù)執(zhí)行程序;
  3. 虛擬地址空間 :邏輯地址到物理地址的變換讳侨。

4.5 ?面置換算法

虛擬內(nèi)存管理很重要的一個(gè)概念就是?面置換算法。那你說(shuō)一下?面置換算法的作 用?常?的?面置換算法有哪些?
地址映射過(guò)程中奏属,若在?面中發(fā)現(xiàn)所要訪問(wèn)的?面不在內(nèi)存中跨跨,則發(fā)生缺?中斷 。

缺?中斷 就是要訪問(wèn)的?不在主存囱皿,需要操作系統(tǒng)將其調(diào)入主存后再進(jìn)行訪問(wèn)勇婴。 在這個(gè)時(shí) 候,被內(nèi)存映射的文件實(shí)際上成了一個(gè)分?交換文件嘱腥。

當(dāng)發(fā)生缺?中斷時(shí)耕渴,如果當(dāng)前內(nèi)存中并沒(méi)有空閑的?面,操作系統(tǒng)就必須在內(nèi)存選擇一個(gè)?面將 其移出內(nèi)存齿兔,以便為即將調(diào)入的?面讓出空間橱脸。用來(lái)選擇淘汰哪一?的規(guī)則叫做?面置換算法, 我們可以把?面置換算法看成是淘汰?面的規(guī)則分苇。

OPT ?面置換算法(最佳?面置換算法) :最佳(Optimal, OPT)置換算法所選擇的被淘汰 ?面將是以后永不使用的添诉,或者是在最?時(shí)間內(nèi)不再被訪問(wèn)的?面,這樣可以保證獲得最低的 缺?率。但由于人們目前無(wú)法預(yù)知進(jìn)程在內(nèi)存下的若千?面中哪個(gè)是未來(lái)最?時(shí)間內(nèi)不再被 訪問(wèn)的医寿,因而該算法無(wú)法實(shí)現(xiàn)栏赴。一般作為衡量其他置換算法的方法。
FIFO(First In First Out) ?面置換算法(先進(jìn)先出?面置換算法) : 總是淘汰最先進(jìn)入內(nèi) 存的?面靖秩,即選擇在內(nèi)存中駐留時(shí)間最久的?面進(jìn)行淘汰须眷。
LRU (Least Currently Used)?面置換算法(最近最久未使用?面置換算法) :LRU算 法賦予每個(gè)?面一個(gè)訪問(wèn)字段竖瘾,用來(lái)記錄一個(gè)?面自上次被訪問(wèn)以來(lái)所經(jīng)歷的時(shí)間 T,當(dāng)須 淘汰一個(gè)?面時(shí)花颗,選擇現(xiàn)有?面中其 T 值最大的捕传,即最近最久未使用的?面予以淘汰。
LFU (Least Frequently Used)?面置換算法(最少使用?面置換算法) :該置換算法選 擇在之前時(shí)期使用最少的?面作為淘汰?捎稚。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末乐横,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子今野,更是在濱河造成了極大的恐慌,老刑警劉巖罐农,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件条霜,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡涵亏,警方通過(guò)查閱死者的電腦和手機(jī)宰睡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)气筋,“玉大人拆内,你說(shuō)我怎么就攤上這事〕枘” “怎么了麸恍?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)搀矫。 經(jīng)常有香客問(wèn)我抹沪,道長(zhǎng),這世上最難降的妖魔是什么瓤球? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任融欧,我火速辦了婚禮,結(jié)果婚禮上卦羡,老公的妹妹穿的比我還像新娘噪馏。我一直安慰自己,他們只是感情好绿饵,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布欠肾。 她就那樣靜靜地躺著,像睡著了一般蝴罪。 火紅的嫁衣襯著肌膚如雪董济。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天要门,我揣著相機(jī)與錄音虏肾,去河邊找鬼廓啊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛封豪,可吹牛的內(nèi)容都是我干的谴轮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼吹埠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼第步!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起缘琅,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤粘都,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后刷袍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體翩隧,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年呻纹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堆生。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雷酪,死狀恐怖淑仆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哥力,我是刑警寧澤蔗怠,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站省骂,受9級(jí)特大地震影響蟀淮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钞澳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一怠惶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧轧粟,春花似錦策治、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至混蔼,卻和暖如春履腋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工遵湖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悔政,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓延旧,卻偏偏與公主長(zhǎng)得像谋国,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迁沫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容