【計(jì)算機(jī)系統(tǒng)】?jī)?nèi)存管理(memory management)

內(nèi)存管理的概念

內(nèi)存管理(Memory Management)是操作系統(tǒng)設(shè)計(jì)中最重要和最復(fù)雜的內(nèi)容之一。雖然計(jì)算機(jī)硬件一直在飛速發(fā)展,內(nèi)存容量也在不斷增長(zhǎng),但是仍然不可能將所有用戶進(jìn)程和系統(tǒng)所需要的全部程序和數(shù)據(jù)放入主存中,所以操作系統(tǒng)必須將內(nèi)存空間進(jìn)行合理地劃分和有效地動(dòng)態(tài)分配。操作系統(tǒng)對(duì)內(nèi)存的劃分和動(dòng)態(tài)分配,就是內(nèi)存管理的概念。

有效的內(nèi)存管理在多道程序設(shè)計(jì)中非常重要,不僅方便用戶使用存儲(chǔ)器、提高內(nèi)存利用率,還可以通過(guò)虛擬技術(shù)從邏輯上擴(kuò)充存儲(chǔ)器。

內(nèi)存管理的功能有:

內(nèi)存空間的分配與回收:由操作系統(tǒng)完成主存儲(chǔ)器空間的分配和管理,使程序員擺脫存儲(chǔ)分配的麻煩,提高編程效率。

地址轉(zhuǎn)換:在多道程序環(huán)境下,程序中的邏輯地址與內(nèi)存中的物理地址不可能一致,因此存儲(chǔ)管理必須提供地址變換功能,把邏輯地址轉(zhuǎn)換成相應(yīng)的物理地址。

內(nèi)存空間的擴(kuò)充:利用虛擬存儲(chǔ)技術(shù)或自動(dòng)覆蓋技術(shù),從邏輯上擴(kuò)充內(nèi)存。

存儲(chǔ)保護(hù):保證各道作業(yè)在各自的存儲(chǔ)空間內(nèi)運(yùn)行,.互不干擾。

在進(jìn)行具體的內(nèi)存管理之前,需要了解進(jìn)程運(yùn)行的基本原理和要求。

swap介紹

? 在詳細(xì)介紹swap之前,我們需要知道的是計(jì)算機(jī)對(duì)內(nèi)存分為物理內(nèi)存與虛擬內(nèi)存(注意虛擬內(nèi)存和虛擬地址空間的區(qū)別)。物理內(nèi)存就是計(jì)算機(jī)的實(shí)際內(nèi)存大小,由RAM芯片組成的。虛擬內(nèi)存則是虛擬出來(lái)的、使用磁盤代替內(nèi)存。虛擬內(nèi)存的出現(xiàn),讓機(jī)器內(nèi)存不夠的情況得到部分解決。當(dāng)程序運(yùn)行起來(lái)由操作系統(tǒng)做具體虛擬內(nèi)存到物理內(nèi)存的替換和加載(相應(yīng)的頁(yè)與段的虛擬內(nèi)存管理)。這里的虛擬內(nèi)存即所謂的swap。

? 當(dāng)用戶提交程序,然后產(chǎn)生進(jìn)程,在機(jī)器上運(yùn)行。機(jī)器會(huì)判斷當(dāng)前物理內(nèi)存是否還有空閑允許進(jìn)程調(diào)入內(nèi)存運(yùn)行,如果有那么則直接調(diào)入內(nèi)存進(jìn)行運(yùn)行;如果沒(méi)有,那么會(huì)根據(jù)優(yōu)先級(jí)選擇一個(gè)進(jìn)程掛起,把該進(jìn)程交換到swap中等待,然后把新的進(jìn)程調(diào)入到內(nèi)存中運(yùn)行。根據(jù)這種換入和換出,實(shí)現(xiàn)了內(nèi)存的循環(huán)利用,讓用戶感覺(jué)不到內(nèi)存的限制。從這也可以看出swap扮演了一個(gè)非常重要的角色,就是暫存被換出的進(jìn)程。

? 內(nèi)存與swap之間是按照內(nèi)存頁(yè)為單位來(lái)交換數(shù)據(jù)的,一般Linux中頁(yè)的大小設(shè)置為4kb。而內(nèi)存與磁盤則是按照塊來(lái)交換數(shù)據(jù)的。

虛擬內(nèi)存的背景(virtual memory)

內(nèi)存管理算法都是基于一個(gè)基本要求:執(zhí)行指令必須在物理內(nèi)存中,滿足這一要求的第一種方法是整個(gè)進(jìn)程放在內(nèi)存中。動(dòng)態(tài)載入能幫助減輕這一限制,但是它需要程序員特別小心地做一些額外的工作。

指令必須都在物理內(nèi)存內(nèi)的這一限制,似乎是必須和合理的,但也是不幸的,因?yàn)檫@使得程序的大小被限制在物理內(nèi)存的大小內(nèi)。事實(shí)上,研究實(shí)際程序會(huì)發(fā)現(xiàn),許多情況下并不需要將整個(gè)程序放到內(nèi)存中。即使在需要完整程序的時(shí)候,也并不是同時(shí)需要所有的程序。

因此運(yùn)行一個(gè)部分在內(nèi)存中的程序不僅有利于系統(tǒng),還有利于用戶。

虛擬內(nèi)存(virtual memory)將用戶邏輯內(nèi)存和物理內(nèi)存分開(kāi)。這在現(xiàn)有物理內(nèi)存有限的情況下,為程序員提供了巨大的虛擬內(nèi)存。

?


物理和虛擬尋址

計(jì)算機(jī)系統(tǒng)的主存被組織成一個(gè)有M個(gè)連續(xù)的字節(jié)大小的單元組成的數(shù)組。每字節(jié)都有一個(gè)唯一的物理地址(PA)。第一個(gè)字節(jié)的物理地址為0,接下來(lái)的字節(jié)地址為2,依次類推。給定這種簡(jiǎn)單的結(jié)構(gòu),CPU方位內(nèi)存的最自然的方式就是使用物理地址。我們把這種方式稱為物理尋址(physical addressing)。

早期的PC使用的是物理地址,而且諸如數(shù)字信號(hào)處理器、嵌入式微控制器以及Cray超級(jí)計(jì)算機(jī)這樣的系統(tǒng)仍然還是繼續(xù)使用這種尋址方式。然而現(xiàn)代的處理器使用的是一種稱為虛擬尋址(virtual address)的尋址方式。

使用虛擬地址,CPU通過(guò)生成一個(gè)虛擬地址(Virtual Address,VA)來(lái)訪問(wèn)主存,這個(gè)虛擬地址在被送到內(nèi)存之前先轉(zhuǎn)換成適當(dāng)?shù)奈锢淼刂?。將這個(gè)虛擬地址轉(zhuǎn)換成物理地址的任務(wù)叫做地址翻譯(address translation)。就像異常處理一樣,地址翻譯需要CPU硬件和操作系統(tǒng)的緊密合作。CPU芯片上叫做內(nèi)存管理單元(MMU)的專有硬件,利用存放主存中的查詢表來(lái)動(dòng)態(tài)的翻譯虛擬地址,該表的內(nèi)容由操作系統(tǒng)來(lái)管理。



地址空間Address spaces

地址空間是一個(gè)非負(fù)整數(shù)的有序集合{0,1,2,.......}。如果地址空間中的整數(shù)是連續(xù)的,那么我們說(shuō)它是一個(gè)線性的連續(xù)地址空間。在一個(gè)帶有虛擬內(nèi)存的系統(tǒng)中,CPU從一個(gè)由N個(gè)地址的地址空間中生成虛擬地址,這個(gè)地址空間稱為虛擬地址空間(virtual address space)。一個(gè)地址空間的大小是由表示最大地址所需要的位數(shù)來(lái)描敘的。現(xiàn)代系統(tǒng)通常支持32位或者64位虛擬地址空間。

一個(gè)系統(tǒng)還有一個(gè)物理地址空間(physical address space),對(duì)應(yīng)于系統(tǒng)中物理內(nèi)存的M個(gè)字節(jié)。地址空間的概念是十分重要的,因?yàn)樗宄貐^(qū)分了數(shù)據(jù)對(duì)象(字節(jié))和它們地屬性(地址)。一旦認(rèn)識(shí)到了這種區(qū)別,那么我們就可以將其推廣了,允許每個(gè)數(shù)據(jù)對(duì)象有多個(gè)獨(dú)立地地址空間,其中每個(gè)地址都選自一個(gè)不同的地址空間。這就是虛擬內(nèi)存的基本思想。主存中的每字節(jié)都有一個(gè)選自虛擬空間的虛擬地址和一個(gè)選自物理空間的物理地址。

虛擬內(nèi)存作為緩存的工具

概念上而言,虛擬內(nèi)存被組織為一個(gè)由存放在磁盤上的N個(gè)連續(xù)的字節(jié)大小的單元組成的數(shù)組。每字節(jié)都有一個(gè)唯一的虛擬地址,作為到數(shù)組的索引。磁盤上數(shù)組的內(nèi)容被緩存到主存中。和存儲(chǔ)器層次結(jié)構(gòu)中其他緩存一樣,磁盤(較低層)上的數(shù)據(jù)被分割為塊,這些塊作為磁盤和主存之間的傳輸單元。VM系統(tǒng)通過(guò)將虛擬內(nèi)存分割為稱為虛擬頁(yè)(Vitrual Page)的大小固定的塊來(lái)處理這個(gè)問(wèn)題。每個(gè)頁(yè)面大小為P字節(jié)。類似的,物理內(nèi)存頁(yè)被分割為物理頁(yè)(Physical page,PP),大小也為P字節(jié)(物理頁(yè)面也被稱為頁(yè)幀 Page frame)。

在任何時(shí)刻,虛擬頁(yè)面的集合都分為三個(gè)不相交的子集:

未分配:VM系統(tǒng)還未分配(或者創(chuàng)建)的頁(yè)。未分配的塊沒(méi)有任何數(shù)據(jù)和它們相關(guān)聯(lián),因此也就不占用任何磁盤空間。

緩存的:當(dāng)前已緩存在物理內(nèi)存中的已分配頁(yè)。

未緩存的:未緩存在物理內(nèi)存中的已分配頁(yè)。

Page fault 缺頁(yè)

當(dāng)換入進(jìn)程時(shí),調(diào)頁(yè)程序推測(cè)在該進(jìn)程再次換出之前使用到的哪些頁(yè),僅僅把需要的頁(yè)調(diào)入內(nèi)存。從而減少交換時(shí)間和所需的物理內(nèi)存空間。

這種方案需要硬件支持區(qū)分哪些頁(yè)在內(nèi)存,哪些在磁盤。采用有效/無(wú)效位來(lái)表示。當(dāng)頁(yè)表中,一個(gè)條目的該位為有效時(shí),表示該頁(yè)合法且在內(nèi)存中;反之,可能非法,也可能合法但不在內(nèi)存中。


如果進(jìn)程從不試圖訪問(wèn)標(biāo)記為無(wú)效的頁(yè),那么并沒(méi)有什么影響,因此,如果推測(cè)正確且只調(diào)入所有真正需要的頁(yè),那么進(jìn)程就可如同所有頁(yè)都調(diào)入內(nèi)存一樣正常運(yùn)行。

當(dāng)進(jìn)程試圖訪問(wèn)這些尚未調(diào)入內(nèi)存的頁(yè)時(shí),會(huì)引起頁(yè)錯(cuò)誤陷阱(page-fault trap)。這種情況的處理方式如下:

1)檢查進(jìn)程的內(nèi)部頁(yè)表(通常與PCB一起保存)。以確定該引用是的合法還是非法的地址訪問(wèn)。

2)如果非法,則終止進(jìn)程;如果引用有效但是尚未調(diào)入頁(yè)面,則現(xiàn)在進(jìn)行調(diào)入。

3)找到一個(gè)空閑幀(如,從空閑幀表中選取一個(gè))。

4)調(diào)度一個(gè)磁盤操作,以便將所需頁(yè)調(diào)入剛分配的幀

5)磁盤讀操作完成后,修改進(jìn)程的內(nèi)部表和頁(yè)表,表示該頁(yè)已在內(nèi)存中。

6)重新開(kāi)始因陷阱而中斷的指令。



計(jì)算機(jī)存儲(chǔ)體系簡(jiǎn)介

存儲(chǔ)器是分層次的,離CPU越近的存儲(chǔ)器,速度越快,每字節(jié)的成本越高,同時(shí)容量也因此越小。寄存器速度最快,離CPU最近,成本最高,所以個(gè)數(shù)容量有限,其次是高速緩存(緩存也是分級(jí),有L1,L2等緩存),再次是主存(普通內(nèi)存),再次是本地磁盤。

寄存器的速度最快,可以在一個(gè)時(shí)鐘周期內(nèi)訪問(wèn),其次是高速緩存,可以在幾個(gè)時(shí)鐘周期內(nèi)訪問(wèn),普通內(nèi)存可以在幾十個(gè)或幾百個(gè)時(shí)鐘周期內(nèi)訪問(wèn)。

存儲(chǔ)器分級(jí),利用的是局部性原理。我們可以以經(jīng)典的閱讀書(shū)籍為例。我在讀的書(shū),捧在手里(寄存器),我最近頻繁閱讀的書(shū),放在書(shū)桌上(緩存),隨時(shí)取來(lái)讀。當(dāng)然書(shū)桌上只能放有限幾本書(shū)。我更多的書(shū)在書(shū)架上(內(nèi)存)。如果書(shū)架上沒(méi)有的書(shū),就去圖書(shū)館(磁盤)。我要讀的書(shū)如果手里沒(méi)有,那么去書(shū)桌上找,如果書(shū)桌上沒(méi)有,去書(shū)架上找,如果書(shū)架上沒(méi)有去圖書(shū)館去找??梢詫?duì)應(yīng)寄存器沒(méi)有,則從緩存中取,緩存中沒(méi)有,則從內(nèi)存中取到緩存,如果內(nèi)存中沒(méi)有,則先從磁盤讀入內(nèi)存,再讀入緩存,再讀入寄存器。

2.計(jì)算機(jī)緩存 Cache

本系列的文章重點(diǎn)介紹緩存cache。了解如何獲取cache的參數(shù),了解緩存的組織結(jié)構(gòu)。

2.1 Cache 概述

cache,中譯名高速緩沖存儲(chǔ)器,其作用是為了更好的利用局部性原理,減少CPU訪問(wèn)主存的次數(shù)。簡(jiǎn)單地說(shuō),CPU正在訪問(wèn)的指令和數(shù)據(jù),其可能會(huì)被以后多次訪問(wèn)到,或者是該指令和數(shù)據(jù)附近的內(nèi)存區(qū)域,也可能會(huì)被多次訪問(wèn)。因此,第一次訪問(wèn)這一塊區(qū)域時(shí),將其復(fù)制到cache中,以后訪問(wèn)該區(qū)域的指令或者數(shù)據(jù)時(shí),就不用再?gòu)闹鞔嬷腥〕觥?/p>


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文轉(zhuǎn)載自 https://juejin.im/post/59f8691b51882534af254317 參考:...
    xingdong閱讀 2,890評(píng)論 0 3
  • 我們應(yīng)該知道物理內(nèi)存(Physical Memory)指的是硬件上的內(nèi)存,即 RAM。它通常指的是插在主板上的內(nèi)存...
    安佳瑋閱讀 2,024評(píng)論 0 0
  • 1 內(nèi)存尋址 1.1 物理地址、虛擬地址以及線性地址 物理地址: 物理內(nèi)存的內(nèi)存單元地址 虛擬地址: 程序員看到的...
    瘋狂小王子閱讀 3,123評(píng)論 3 21
  • 1.內(nèi)存的頁(yè)面置換算法 (1)最佳置換算法(OPT)(理想置換算法):從主存中移出永遠(yuǎn)不再需要的頁(yè)面;如無(wú)這樣的...
    杰倫哎呦哎呦閱讀 3,594評(píng)論 1 9
  • 概述 現(xiàn)代操作系統(tǒng)了提供了一種對(duì)主存的抽象概念,叫做虛擬內(nèi)存。它為每個(gè)進(jìn)程提供了一個(gè)非常大的,一致的和私有的地址空...
    要上班的斌哥閱讀 16,609評(píng)論 2 55

友情鏈接更多精彩內(nèi)容