對(duì)于C/C++程序員來說,內(nèi)存分配再正常不過,C語言中的malloc:
int* a = (int*)malloc(sizeof(int));
C++中的new:
int* a = new int(10);
接下來的問題是變量a占用的內(nèi)存是誰給我們分配的呢?
答案是運(yùn)行在用戶態(tài)的內(nèi)存分配器,如果你愿意,也可以繞過內(nèi)存分配器自己來管理內(nèi)存。
接下來的問題是a占用的內(nèi)存在哪里呢?
答案是進(jìn)程地址空間中的堆區(qū),堆區(qū)在這里:
內(nèi)存中真的有像圖中這樣的布局嗎?
答案是: 沒有 。
這就是所謂的虛擬內(nèi)存。
既然是虛擬內(nèi)存那么這里的堆區(qū)又是從哪里來的呢?
答案是操作系統(tǒng)。
當(dāng)我們?cè)贑/C++中分配內(nèi)存時(shí),內(nèi)存分配器從堆區(qū)中找到可用內(nèi)存,但如果沒有找到則向操作系統(tǒng)申請(qǐng)。
那么操作系統(tǒng)又是從哪里找到的內(nèi)存呢?
答案是:操作系統(tǒng)從物理內(nèi)存中找到一塊可用內(nèi)存分配出去。
問題來了,既然操作系統(tǒng)管理的是物理內(nèi)存,而操作系統(tǒng)分配給進(jìn)程的又是虛擬內(nèi)存,精神分裂啊有沒有,這是怎么一回事呢?
原來這并不沖突,操作系統(tǒng)會(huì)為每個(gè)進(jìn)程分配一張表,記錄了從虛擬內(nèi)存到物理內(nèi)存的映射,這張表就叫頁表。
因此,盡管操作系統(tǒng)管理的是物理內(nèi)存,但進(jìn)程或者說程序員是看不到物理內(nèi)存的,我們只能看到虛擬內(nèi)存,程序運(yùn)行時(shí)在發(fā)送內(nèi)存讀寫指令時(shí)MMU會(huì)將虛擬內(nèi)存轉(zhuǎn)換為物理內(nèi)存。
接下來的問題是頁表在哪里?
答案是: 在內(nèi)存中 。
你可以將頁表放在內(nèi)存中的任何位置上,只要能告訴CPU在哪里即可。
誰來負(fù)責(zé)構(gòu)造頁表呢?答案是操作系統(tǒng),操作系統(tǒng)負(fù)責(zé)創(chuàng)建頁表,頁表本質(zhì)上就是一個(gè)數(shù)組,處理器規(guī)定頁表的格式,操作系統(tǒng)按照這種格式構(gòu)建好頁表,創(chuàng)建好后即可告訴CPU。
該怎樣告訴CPU呢?
答案是:通過寫特定的寄存器。
CPU中有特定的寄存器,以x86處理器為例,其中的控制寄存器cr3就用來保存頁表的地址,假設(shè)指針pagetable指向頁表,那么可以這樣設(shè)置:
mov $(pagetable), %eax
mov %eax, %cr3
pagetable必須是物理地址,頁表本身就用來將虛擬地址轉(zhuǎn)為物理地址,因此向cr3中寫入虛擬地址是沒有道理的。
接下來的問題是什么時(shí)候?qū)㈨摫韺懭隿r3寄存器呢?
答案是:很多時(shí)候,操作系統(tǒng)初始化階段、進(jìn)程切換時(shí)等。
現(xiàn)在你應(yīng)該知道了吧,其實(shí)內(nèi)存管理(段式管理、頁式管理)是處理器提供的一種機(jī)制,操作系統(tǒng)只是這種機(jī)制的使用者,我們常說的虛擬內(nèi)存是處理器本身的一種能力, 如果處理器本身不提供這種能力,那么操作系統(tǒng)自己是很難高效實(shí)現(xiàn)虛擬內(nèi)存的 。
CPU才是管理內(nèi)存真正的大boss。
實(shí)際上如果你去看類似x86這樣的處理器編程手冊(cè)時(shí)就會(huì)發(fā)現(xiàn),我們?cè)诓僮飨到y(tǒng)課中熟悉的很多概念其實(shí)是處理器這種硬件提供的,操作系統(tǒng)僅僅是利用這些硬件的一層軟件。
因此,從這個(gè)角度看,操作系統(tǒng)僅僅是CPU的一個(gè)“驅(qū)動(dòng)程序”而已。
-
cpu
+關(guān)注
關(guān)注
68文章
10905瀏覽量
213030 -
內(nèi)存
+關(guān)注
關(guān)注
8文章
3055瀏覽量
74335 -
分配器
+關(guān)注
關(guān)注
0文章
195瀏覽量
25832
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
Linux的內(nèi)存管理是什么,Linux的內(nèi)存管理詳解
![Linux的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>是什么,Linux的<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>詳解](https://file.elecfans.com//web2/M00/43/01/pYYBAGJ7h8qAfJe-AAA3U8e_SDc509.jpg)
電子發(fā)燒友到底誰是大俠?誰才是真正的高手?
工業(yè)以太網(wǎng)與現(xiàn)場總線誰才是主流?
內(nèi)存管理概述及原理
如何分辨誰才是真正的工程師?
揭秘手機(jī)為什么卡?誰才是決定手機(jī)卡頓的關(guān)鍵
iPhone7、iPhone8、iPhone7plus誰才是最值得買
充電樁還是換電站誰才是市場的未來
到底誰才是頂級(jí)旗艦?
什么是內(nèi)存管理?如何進(jìn)行內(nèi)存管理?及內(nèi)存管理的方案與分析
![什么是<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>?如何進(jìn)行<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>?及<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>的方案與分析](https://file.elecfans.com/web1/M00/E6/E7/o4YBAGBddXKAELNDAAAhPKdAGR4411.png)
STM32內(nèi)存管理
![STM32<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
智慧家庭系列文章 | 控制權(quán)大作戰(zhàn):誰才是智能家居系統(tǒng)的控制中心?
![智慧家庭系列文章 | 控制權(quán)大作戰(zhàn):<b class='flag-5'>誰</b><b class='flag-5'>才是</b>智能家居系統(tǒng)的控制中心?](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
評(píng)論