0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

誰才是管理內(nèi)存的大BOSS

jf_78858299 ? 來源:碼農(nóng)的荒島求生 ? 作者:碼農(nóng)的荒島求生 ? 2023-02-17 14:26 ? 次閱讀

對于C/C++程序員來說,內(nèi)存分配再正常不過,C語言中的malloc:

int* a = (int*)malloc(sizeof(int));

C++中的new:

int* a = new int(10);

接下來的問題是變量a占用的內(nèi)存是誰給我們分配的呢?

答案是運行在用戶態(tài)的內(nèi)存分配器,如果你愿意,也可以繞過內(nèi)存分配器自己來管理內(nèi)存。

接下來的問題是a占用的內(nèi)存在哪里呢?

答案是進程地址空間中的堆區(qū),堆區(qū)在這里:

圖片

內(nèi)存中真的有像圖中這樣的布局嗎?

答案是: 沒有 。

這就是所謂的虛擬內(nèi)存。

既然是虛擬內(nèi)存那么這里的堆區(qū)又是從哪里來的呢?

答案是操作系統(tǒng)

當我們在C/C++中分配內(nèi)存時,內(nèi)存分配器從堆區(qū)中找到可用內(nèi)存,但如果沒有找到則向操作系統(tǒng)申請。

那么操作系統(tǒng)又是從哪里找到的內(nèi)存呢?

答案是:操作系統(tǒng)從物理內(nèi)存中找到一塊可用內(nèi)存分配出去。

問題來了,既然操作系統(tǒng)管理的是物理內(nèi)存,而操作系統(tǒng)分配給進程的又是虛擬內(nèi)存,精神分裂啊有沒有,這是怎么一回事呢?

原來這并不沖突,操作系統(tǒng)會為每個進程分配一張表,記錄了從虛擬內(nèi)存到物理內(nèi)存的映射,這張表就叫頁表。

圖片

因此,盡管操作系統(tǒng)管理的是物理內(nèi)存,但進程或者說程序員是看不到物理內(nèi)存的,我們只能看到虛擬內(nèi)存,程序運行時在發(fā)送內(nèi)存讀寫指令時MMU會將虛擬內(nèi)存轉(zhuǎn)換為物理內(nèi)存。

接下來的問題是頁表在哪里?

答案是: 在內(nèi)存中 。

你可以將頁表放在內(nèi)存中的任何位置上,只要能告訴CPU在哪里即可。

誰來負責構(gòu)造頁表呢?答案是操作系統(tǒng),操作系統(tǒng)負責創(chuàng)建頁表,頁表本質(zhì)上就是一個數(shù)組,處理器規(guī)定頁表的格式,操作系統(tǒng)按照這種格式構(gòu)建好頁表,創(chuàng)建好后即可告訴CPU。

該怎樣告訴CPU呢?

答案是:通過寫特定的寄存器。

CPU中有特定的寄存器,以x86處理器為例,其中的控制寄存器cr3就用來保存頁表的地址,假設(shè)指針pagetable指向頁表,那么可以這樣設(shè)置:

mov   $(pagetable), %eaxmov   %eax, %cr3

pagetable必須是物理地址,頁表本身就用來將虛擬地址轉(zhuǎn)為物理地址,因此向cr3中寫入虛擬地址是沒有道理的。

接下來的問題是什么時候?qū)㈨摫韺懭隿r3寄存器呢?

答案是:很多時候,操作系統(tǒng)初始化階段、進程切換時等。

現(xiàn)在你應(yīng)該知道了吧,其實內(nèi)存管理(段式管理、頁式管理)是處理器提供的一種機制,操作系統(tǒng)只是這種機制的使用者,我們常說的虛擬內(nèi)存是處理器本身的一種能力, 如果處理器本身不提供這種能力,那么操作系統(tǒng)自己是很難高效實現(xiàn)虛擬內(nèi)存的 。

CPU才是管理內(nèi)存真正的大boss。

實際上如果你去看類似x86這樣的處理器編程手冊時就會發(fā)現(xiàn),我們在操作系統(tǒng)課中熟悉的很多概念其實是處理器這種硬件提供的,操作系統(tǒng)僅僅是利用這些硬件的一層軟件。

因此,從這個角度看,操作系統(tǒng)僅僅是CPU的一個“驅(qū)動程序”而已。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10769

    瀏覽量

    210428
  • 內(nèi)存
    +關(guān)注

    關(guān)注

    8

    文章

    2942

    瀏覽量

    73728
  • 分配器
    +關(guān)注

    關(guān)注

    0

    文章

    193

    瀏覽量

    25664
收藏 人收藏

    評論

    相關(guān)推薦

    Linux的內(nèi)存管理是什么,Linux的內(nèi)存管理詳解

    Linux的內(nèi)存管理 Linux的內(nèi)存管理是一個非常復雜的過程,主要分成兩個大的部分:內(nèi)核的內(nèi)存管理
    的頭像 發(fā)表于 05-11 17:54 ?5900次閱讀
    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>詳解

    電子發(fā)燒友到底誰是大俠?才是真正的高手?

    本帖最后由 會飛的鴨子 于 2014-4-2 16:59 編輯 選出才是真正的高手,才是大牛!吳鑒鷹單片機項目詳細解析系列(連載)之基于單片機的實戰(zhàn)項目社區(qū)之星-單片機達人-
    發(fā)表于 04-01 13:29

    工業(yè)以太網(wǎng)與現(xiàn)場總線才是主流?

    現(xiàn)場總線、以太網(wǎng)、無線技術(shù)各有優(yōu)劣,那么才會是未來的主流呢?顯然對所有生產(chǎn)商或機器并非只有一種技術(shù)才是“正確的”方案?生產(chǎn)商必須權(quán)衡各類方案帶來的價值。有沒有比采用普通方案帶來的利益更有
    發(fā)表于 09-29 09:49

    華為、蘋果、三星、高通才是SOC的無冕之王?

    四大旗艦處理器相繼曝光,華為、蘋果、三星、高通才是SOC的無冕之王?
    發(fā)表于 06-03 14:41

    內(nèi)存管理概述及原理

    記錄一下,方便以后翻閱~主要內(nèi)容:1) 內(nèi)存管理概述及原理;2)相關(guān)實驗代碼解讀。官方資料:《STM32中文參考手冊_V10》-第19章 靈活的靜態(tài)存儲器控制器(FSMC)。實驗要求:系統(tǒng)啟動后
    發(fā)表于 02-23 06:15

    BOSS SD-1 Super Overdrive吉他踏板

    描述BOSS SD-1 超級過載BOSS SD-1 Super Overdrive 吉他踏板
    發(fā)表于 09-05 07:18

    如何分辨才是真正的工程師?

    有時候你會想弄清楚某位工程師的基本技術(shù)能力與背景,到底才是擁有“真才實料”的真正工程師,誰又只會在那里自我吹噓。
    發(fā)表于 02-07 10:27 ?1477次閱讀

    揭秘手機為什么卡?才是決定手機卡頓的關(guān)鍵

    處理器、內(nèi)存、GPU才是決定手機卡頓的關(guān)鍵安卓手機使用一段時間后會出現(xiàn)卡頓,相信不少用戶都遇到過。
    發(fā)表于 04-01 10:43 ?1.4w次閱讀

    iPhone7、iPhone8、iPhone7plus才是最值得買

    蘋果手機價格相差很大,特別是新款,更是被炒得火熱,iPhone7、iPhone8、iPhone7plus才是最值得買?那款才是最值得買的iPhone?蘋果手機憑借著出色的系統(tǒng)體驗,以及強大的品牌
    發(fā)表于 03-13 14:45 ?8.6w次閱讀

    到底才是頂級旗艦?

    到底才是頂級旗艦?自從驍龍888手機上市之后,這個問題就很難有答案。因為不少人強調(diào),驍龍888真的翻車了,驍龍865依然能打。那真是這樣嗎?其實看看跑分就有答案,安兔兔公布了今年1月的旗艦手機跑分,從跑分情況來看,驍龍888穩(wěn)坐第一還是沒懸念的,只不過最大的問題,也許是
    的頭像 發(fā)表于 02-04 17:08 ?1642次閱讀

    什么是內(nèi)存管理?如何進行內(nèi)存管理?及內(nèi)存管理的方案與分析

    前面已經(jīng)將所有的硬件驅(qū)動實現(xiàn),驗證了硬件功能。但是每一個硬件都是單獨測試的,而且并不完善。下一步,我們需要對各個驅(qū)動進行整合完善。在整合之前,需要做一些基礎(chǔ)工作。其中之一就是實現(xiàn)內(nèi)存管理。什么叫內(nèi)存
    的頭像 發(fā)表于 03-26 13:38 ?7050次閱讀
    什么是<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>?如何進行<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>?及<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>的方案與分析

    STM32內(nèi)存管理

    內(nèi)存管理詳解1、介紹內(nèi)存管理,是指軟件運行時對計算機內(nèi)存資源的分配和使用的技術(shù)。其最主要的目的是如何高效,快速的分配,并且在適當?shù)臅r候釋放和
    發(fā)表于 12-24 19:37 ?13次下載
    STM32<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>

    智慧家庭系列文章 | 控制權(quán)大作戰(zhàn):才是智能家居系統(tǒng)的控制中心?

    智慧家庭系列文章 | 控制權(quán)大作戰(zhàn):才是智能家居系統(tǒng)的控制中心?
    發(fā)表于 10-31 08:23 ?0次下載
    智慧家庭系列文章 | 控制權(quán)大作戰(zhàn):<b class='flag-5'>誰</b><b class='flag-5'>才是</b>智能家居系統(tǒng)的控制中心?

    Linux內(nèi)存管理的詳細介紹分享

    內(nèi)存管理是計算機系統(tǒng)中負責管理系統(tǒng)內(nèi)存資源的一種機制,主要包括內(nèi)存分配、內(nèi)存釋放、
    的頭像 發(fā)表于 05-29 14:09 ?1646次閱讀
    Linux<b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>的詳細介紹分享

    Linux 內(nèi)存管理總結(jié)

    一、Linux內(nèi)存管理概述 Linux內(nèi)存管理是指對系統(tǒng)內(nèi)存的分配、釋放、映射、管理、交換、壓縮
    的頭像 發(fā)表于 11-10 14:58 ?463次閱讀
    Linux <b class='flag-5'>內(nèi)存</b><b class='flag-5'>管理</b>總結(jié)