<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          學(xué)妹你要的計(jì)算機(jī)內(nèi)存管理基礎(chǔ)知識(shí)

          共 4493字,需瀏覽 9分鐘

           ·

          2021-10-19 21:14

          一、前言

          學(xué)妹剛上大學(xué),問我計(jì)算機(jī)內(nèi)存知識(shí)需要了解么?我當(dāng)場(chǎng)就是傻瓜警告,于是就有了這篇文章。

          為什么要去了解內(nèi)存知識(shí)?因?yàn)樗怯?jì)算機(jī)操作系統(tǒng)中的核心功能之一,各高級(jí)語言在進(jìn)行內(nèi)存的使用和管理上,無一不依托于此底層實(shí)現(xiàn),比如我們熟悉的Java內(nèi)存模型。

          最近幾篇文章學(xué)習(xí)操作系統(tǒng)的內(nèi)存管理后,喜歡底層的同學(xué)可以去學(xué)習(xí) CPU 結(jié)構(gòu)、機(jī)器語言指令和程序執(zhí)行相關(guān)的知識(shí),而看重實(shí)用性的同學(xué)后續(xù)學(xué)習(xí)多進(jìn)程多線程和數(shù)據(jù)一致性時(shí),可以有更深刻的理解。

          二、馮·諾伊曼結(jié)構(gòu)

          1、早期計(jì)算機(jī)結(jié)構(gòu)

          在馮·諾依曼結(jié)構(gòu)提出之前的計(jì)算機(jī),是一種計(jì)算機(jī)只能完成一種功能,編輯好的程序是直接集成在計(jì)算機(jī)電路中,例如一個(gè)計(jì)算器僅有固定的數(shù)學(xué)計(jì)算程序,它不能拿來當(dāng)作文字處理軟件,更不能拿來玩游戲。若想要改變此機(jī)器的程序,你必須更改線路、更改結(jié)構(gòu)甚至重新設(shè)計(jì)此計(jì)算機(jī)。

          簡(jiǎn)單來說,早期的計(jì)算機(jī)是來執(zhí)行一個(gè)事先集成在電路板上的某一特定的程序,一旦需要修改程序功能,就要重新組裝電路板,所以早期的計(jì)算機(jī)程序是硬件化的。

          2、理論提出

          1945年,馮·諾依曼由于在曼哈頓工程中需要大量的運(yùn)算,從而使用了當(dāng)時(shí)最先進(jìn)的兩臺(tái)計(jì)算機(jī) Mark I 和 ENIAC,在使用 Mark I 和 ENIAC 的過程中,他意識(shí)到了存儲(chǔ)程序的重要性,從而提出了“存儲(chǔ)程序”的計(jì)算機(jī)設(shè)計(jì)理念,即將計(jì)算機(jī)指令進(jìn)行編碼后存儲(chǔ)在計(jì)算機(jī)的存儲(chǔ)器中,需要的時(shí)候可以順序地執(zhí)行程序代碼,從而控制計(jì)算機(jī)運(yùn)行,這就是馮.諾依曼計(jì)算機(jī)體系的開端。

          這是對(duì)計(jì)算機(jī)發(fā)展有深刻意義的重要理論,從此我們開始將程序和數(shù)據(jù)一樣看待,程序也在存儲(chǔ)器中讀取,這樣計(jì)算機(jī)就可以不單單只能運(yùn)行事先編輯集成在電路板上的程序了,程序由此脫離硬件變?yōu)榭删幊痰牧耍笳Q生程序員這個(gè)職業(yè)。

          關(guān)于馮·諾依曼這位大神,值得單獨(dú)開一篇文章來聊聊。

          3、五大部件

          馮諾依曼計(jì)算機(jī)體系結(jié)構(gòu)如下:

          img

          馮·諾依曼結(jié)構(gòu)用極高的抽象描述了計(jì)算器的五大部件,以及程序執(zhí)行時(shí)數(shù)據(jù)和指令的流轉(zhuǎn)過程。現(xiàn)在快速的將現(xiàn)代計(jì)算機(jī)的設(shè)計(jì)概念結(jié)構(gòu)了解后,我們把目光聚焦在本文的主角——存儲(chǔ)器上。

          三、存儲(chǔ)器

          1、存儲(chǔ)器的種類

          我們編寫的程序、下載的電影,自然需要有個(gè)地方存放這些數(shù)據(jù),存儲(chǔ)器現(xiàn)在主要有易失性存儲(chǔ)器和非易失性存儲(chǔ)器兩種。存取速度上來看,前者要快很多。數(shù)據(jù)持久化上來看,當(dāng)電源供應(yīng)中斷后,易失性存儲(chǔ)器所存儲(chǔ)的數(shù)據(jù)便會(huì)消失,而非易失性存儲(chǔ)器所存儲(chǔ)的數(shù)據(jù)并不會(huì)消失,重新供電后,就能夠讀取存儲(chǔ)器中的數(shù)據(jù)。

          易失性存儲(chǔ)器也叫隨機(jī)存儲(chǔ)存儲(chǔ)器,分為動(dòng)態(tài)隨機(jī)存儲(chǔ)存儲(chǔ)器和靜態(tài)隨機(jī)存儲(chǔ)存儲(chǔ)器,表現(xiàn)出來的區(qū)別在速度上。

          動(dòng)態(tài)隨機(jī)存儲(chǔ)存儲(chǔ)器,英文縮寫寫作DRAM,一般每個(gè)單元由一個(gè)晶體管和一個(gè)電容組成。

          特點(diǎn)是單元占用資源和空間小,速度比SRAM慢,需要刷新。一般計(jì)算機(jī)內(nèi)存即由DRAM組成。在PC上,DRAM以內(nèi)存條的方式出現(xiàn)。

          靜態(tài)隨機(jī)存儲(chǔ)存儲(chǔ)器,英文縮寫寫作SRAM,一般每個(gè)單元由6個(gè)晶體管組成,但近來也出現(xiàn)由8個(gè)晶體管構(gòu)成的SRAM單元。

          特點(diǎn)是速度快價(jià)格貴,單元占用資源比DRAM多,在PC上,一般CPU和GPU的緩存即由SRAM構(gòu)成。

          2、摩爾定律

          摩爾定律(英語:Moore's law)是由英特爾(Intel)創(chuàng)始人之一戈登·摩爾提出的。

          其內(nèi)容為:集成電路上可容納的晶體管數(shù)目,約每隔兩年便會(huì)增加一倍;經(jīng)常被引用的“18個(gè)月”,是由英特爾首席執(zhí)行官大衛(wèi)·豪斯(David House)提出:預(yù)計(jì)18個(gè)月會(huì)將芯片的性能提高一倍(即更多的晶體管使其更快),是一種以倍數(shù)增長(zhǎng)的觀測(cè)。

          上世紀(jì)末開始,隨著CPU的性能極速發(fā)展,矛盾出現(xiàn)了。CPU運(yùn)行的太快了,而磁盤的數(shù)據(jù)讀取又太慢了。

          經(jīng)過上一節(jié)的介紹,我們發(fā)現(xiàn)并沒有一種可以同時(shí)滿足穩(wěn)定可用、支持持久化保存、存取速度要非常快、成本便宜并且容量大體積小的存儲(chǔ)器,那就各取其長(zhǎng),將各類存儲(chǔ)器,根據(jù)其各自的特點(diǎn),按一定規(guī)律組合起來使用。

          后來,CPU的性能達(dá)到物理極限而引出的計(jì)算機(jī)多核多級(jí)緩存架構(gòu),本文暫不展開。

          3、存儲(chǔ)層次

          百科如是說明:存儲(chǔ)層次是在計(jì)算機(jī)體系結(jié)構(gòu)下存儲(chǔ)系統(tǒng)層次結(jié)構(gòu)的排列順序。每一層于下一層相比都擁有較高的速度和較低延遲性,以及較小的容量。大部分現(xiàn)今的中央處理器的速度都非常的快。

          大部分程序工作量需要存儲(chǔ)器訪問。由于高速緩存的效率和存儲(chǔ)器傳輸位于層次結(jié)構(gòu)中的不同等級(jí),所以實(shí)際上會(huì)限制處理的速度,導(dǎo)致中央處理器花費(fèi)大量的時(shí)間等待存儲(chǔ)器I/O完成工作。

          簡(jiǎn)單來說,如果單一存儲(chǔ)器無法滿足全部的需求,那就通過各類存儲(chǔ)器的組合使用,在一定程度上滿足了各方面需求都達(dá)標(biāo)的一種存儲(chǔ)結(jié)構(gòu),即存儲(chǔ)層次,或稱內(nèi)存的層次結(jié)構(gòu)。

          在網(wǎng)上找了這張經(jīng)典的內(nèi)存層次結(jié)構(gòu)圖

          img

          大部分電腦中的存儲(chǔ)層次如下四層:

          • 寄存器:(應(yīng)該是)最快的訪問。
          • 高速緩存(L1-L3:SRAM):高速緩存中的訪問速度為納秒級(jí)別,非常快。

          第一級(jí)高速緩存(L1),通常訪問只需要幾個(gè)周期,通常是幾十個(gè)KB。

          第二級(jí)高速緩存(L2),比L1約有2到10倍較高延遲性,通常是幾百個(gè)KB或更多。

          第三級(jí)高速緩存(L3)不一定有,比L2更高的延遲性,通常有數(shù)MB之大。

          第四級(jí)高速緩存(L4)不普遍,CPU外部的DRAM,但速度較主存高。

          • 主存(DRAM):訪問需要幾百個(gè)周期,可以大到數(shù)幾十GB。
          • 磁盤存儲(chǔ):需要成千上百個(gè)周期,容量非常大,持久化保存數(shù)據(jù)。

          這一節(jié)中介紹的幾種存儲(chǔ)器,其各自工作所在的層次一目了然,需要注意的是其中高速緩存不受操作系統(tǒng)管理,我們重點(diǎn)看操作系統(tǒng)可管理的主存,后文為了方便敘述,不做特殊說明時(shí),內(nèi)存單指上圖中的主存。

          如今,市面上個(gè)人計(jì)算機(jī)的常規(guī)配置是三級(jí)高速緩存下配上16G內(nèi)存和512G的固態(tài)硬盤,各層存儲(chǔ)器在操作系統(tǒng)的內(nèi)存管理下協(xié)調(diào)工作,讓我們“同一時(shí)間”可以流暢使用多個(gè)軟件。

          4、關(guān)于內(nèi)存分層的思考

          計(jì)算機(jī)為了提高訪問速度而采用的內(nèi)存分層結(jié)構(gòu),似乎像是互聯(lián)網(wǎng)公司高性能架構(gòu)中的常用手段——緩存,其一我們把數(shù)據(jù)盡可能的放在靠近使用者(CPU)的地方,其二我們使用速度更快但不會(huì)持久化數(shù)據(jù)的中間件來做數(shù)據(jù)庫(磁盤)的緩存(內(nèi)存)。

          這就是要去學(xué)習(xí)基礎(chǔ)知識(shí)和閱讀經(jīng)典論文的原因,我們會(huì)發(fā)現(xiàn)思路都是相通的,落地方案的差異也不過是考慮到了特定領(lǐng)域與業(yè)務(wù)。

          四、內(nèi)存管理的需求和實(shí)現(xiàn)

          1、需求確認(rèn)

          現(xiàn)在,基于以上內(nèi)存的硬件結(jié)構(gòu),我們操作系統(tǒng)要完成對(duì)內(nèi)存管理的能力,它主要應(yīng)該具備如下的能力:

          • 抽象:邏輯地址空間,屏蔽掉真實(shí)的內(nèi)存地址,在多道程序環(huán)境下,程序中的邏輯地址與內(nèi)存中的物理地址不可能一致,因此存儲(chǔ)管理必須提供地址變換功能,把邏輯地址轉(zhuǎn)換成相應(yīng)的物理地址。
          • 分配與回收:即內(nèi)存空間的高效率分配和及時(shí)回收。
          • 安全與隔離:獨(dú)立地址空間,保護(hù)各自進(jìn)程的保護(hù),惡意去破壞其他進(jìn)程的數(shù)據(jù),隔離性,保證各道作業(yè)在各自的存儲(chǔ)空間內(nèi)運(yùn)行,互不干擾。
          • 共享:訪問相同內(nèi)存,各進(jìn)程間的數(shù)據(jù)傳遞機(jī)制允許多個(gè)進(jìn)程訪問同一塊公共的內(nèi)存空間,這是效率最高的進(jìn)程間通信形式。
            原本每個(gè)進(jìn)程的內(nèi)存地址空間都是相互隔離的,但操作系統(tǒng)提供了讓進(jìn)程主動(dòng)創(chuàng)建、映射、分離、控制某一塊內(nèi)存的程序接口。
            當(dāng)一塊內(nèi)存被多進(jìn)程共享時(shí),各個(gè)進(jìn)程往往會(huì)與其它通信機(jī)制,譬如信號(hào)量結(jié)合使用,來達(dá)到進(jìn)程間同步及互斥的協(xié)調(diào)操作。
          • 虛擬化:在無需擴(kuò)大內(nèi)存硬件容量的情況下,為了滿足同時(shí)運(yùn)行多個(gè)程序,我們需要更大的地址空間,也就是虛擬內(nèi)存。

          2、實(shí)現(xiàn)方式

          操作系統(tǒng)主要是通過下面五種方法實(shí)現(xiàn)的:

          • 程序重定位
          • 分段
          • 分頁
          • 虛擬內(nèi)存
          • 按需分頁虛擬內(nèi)存

          這里涉及到的實(shí)現(xiàn)方式我們后面會(huì)逐一學(xué)習(xí),現(xiàn)在先來看程序重定位。

          五、程序重定位

          1、地址空間

          首先,需要了解兩種地址空間,物理地址空間和邏輯地址空間,前者是硬件支持的地址空間,也叫絕對(duì)地址。

          后者是程序看到的,一個(gè)運(yùn)行的程序所擁有的內(nèi)存范圍,也叫相對(duì)地址。

          操作系統(tǒng)負(fù)責(zé)建立并維護(hù)這個(gè)對(duì)應(yīng)關(guān)系,我們知道程序的運(yùn)行,依次需要經(jīng)過編譯、鏈接、載入(程序重定位)后,才能執(zhí)行。

          其中編譯階段,簡(jiǎn)單來說就是由“高級(jí)語言”轉(zhuǎn)成“機(jī)器語言”的過程,該階段和地址空間關(guān)系不大,這里暫時(shí)不展開,我們重點(diǎn)看后兩個(gè)階段。

          2、鏈接階段

          經(jīng)過鏈接階段后,程序就是擁有完整的邏輯地址空間的可以執(zhí)行的程序了,比如Windows下的.exe 文件。

          三種鏈接方式:

          • 靜態(tài)鏈接:在程序運(yùn)行之前,先將各目標(biāo)模塊及它們所需的庫函數(shù)連接成一個(gè)完整的可執(zhí)行文件(裝入模塊) ,之后不再拆開。
          • 裝入時(shí)動(dòng)態(tài)鏈接:將各目標(biāo)模塊裝入內(nèi)存時(shí),邊裝入邊鏈接的鏈接方式。
          • 運(yùn)行時(shí)動(dòng)態(tài)鏈接:在程序執(zhí)行中需要該目標(biāo)模塊時(shí),才對(duì)它進(jìn)行鏈接。

          3、載入階段

          載入階段,或稱之為裝入階段,由操作系統(tǒng)進(jìn)行內(nèi)存地址分配,并將程序的邏輯地址轉(zhuǎn)換為物理地址。

          這塊同樣有三種方式進(jìn)行載入:

          • 絕對(duì)裝入:在之前的編譯階段,編譯程序直接產(chǎn)生絕對(duì)地址的目標(biāo)代碼。而后載入程序按照載入模塊中的地址,將程序和數(shù)據(jù)裝入內(nèi)存。
            那哪種程序環(huán)境,可以在編譯階段就能確認(rèn)物理地址呢?沒錯(cuò),絕對(duì)裝入只適用于單道程序環(huán)境。
          • 靜態(tài)重定位:編譯和鏈接后的指令中使用的地址、數(shù)據(jù)存放的地址都是相對(duì)于起始地址而言的邏輯地址,在載入階段可根據(jù)內(nèi)存的當(dāng)前情況,裝入到內(nèi)存的適當(dāng)位置。
            裝入時(shí)對(duì)地址根據(jù)初始位置和偏移量進(jìn)行重定位,將邏輯地址變換為物理地址,地址變換是在裝入時(shí)一次完成的。也就是說,必須分配其要求的全部?jī)?nèi)存空間,如果沒有足夠的內(nèi)存,就不能裝入該作業(yè)。
          • 動(dòng)態(tài)重定位:現(xiàn)在又稱動(dòng)態(tài)運(yùn)行時(shí)裝入。編譯、鏈接后的裝入模塊的地址都是從0開始的。
            裝入程序把裝入模塊裝入內(nèi)存后,并不會(huì)立即把邏輯地址轉(zhuǎn)換為物理地址,而是把地址轉(zhuǎn)換推遲到程序真正要執(zhí)行時(shí)才進(jìn)行。因此裝入內(nèi)存后所有的地址依然是邏輯地址。
            這種方式需要一個(gè)重定位寄存器的支持。這種方式雖然帶來了復(fù)雜性,但是卻將內(nèi)存空間,極大極大的擴(kuò)大了(虛擬內(nèi)存的作用之一),現(xiàn)在的載入程序一般都是這種方式進(jìn)行載入。

          4、地址空間的讀取過程

          由前文的了解,我們可以想到 CPU 對(duì)某一地址的內(nèi)容讀取,是經(jīng)過如下幾步完成的:

          1. CPU需要在邏輯地址的內(nèi)存內(nèi)容;
          2. 內(nèi)存管理單元尋找在邏輯地址和物理地址之間的映射(這里可以做地址安全的檢查,確保程序不相互干擾);
          3. 控制器從總線發(fā)送在物理地址的內(nèi)存內(nèi)容的請(qǐng)求;
          4. 內(nèi)存發(fā)送物理地址內(nèi)存內(nèi)容給CPU;

          六、總結(jié)

          本文自馮·諾依曼結(jié)構(gòu)起,引出各類型存儲(chǔ)器組成了內(nèi)存層次結(jié)構(gòu),并交代了操作系統(tǒng)的內(nèi)存管理需要實(shí)現(xiàn)的目標(biāo)和方案,并對(duì)方案其一的程序重定位進(jìn)行了詳細(xì)說明。

          其中對(duì)為了加速CPU對(duì)數(shù)據(jù)的讀取速度,所引入的內(nèi)存層次結(jié)構(gòu),其處理方式對(duì)我們互聯(lián)網(wǎng)高性能架構(gòu)有極大的借鑒意義。

          后續(xù)會(huì)有關(guān)于計(jì)算機(jī)相關(guān)的文章,另外金九銀十要結(jié)束了,我覺得面試視頻必須來一手了,這次一定!

          我是敖丙,你知道的越多,你不知道的越多,我們下期見。

          瀏覽 42
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  韩国不卡无码 | 靠逼视频网站精品 | 91色噜噜狠狠色婷婷 | www.夜夜嗨 | 91日韩在线手机在线视频 |