1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        學妹你要的計算機內(nèi)存管理基礎知識

        共 4493字,需瀏覽 9分鐘

         ·

        2021-10-19 21:14

        一、前言

        學妹剛上大學,問我計算機內(nèi)存知識需要了解么?我當場就是傻瓜警告,于是就有了這篇文章。

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

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

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

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

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

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

        2、理論提出

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

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

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

        3、五大部件

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

        img

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

        三、存儲器

        1、存儲器的種類

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

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

        動態(tài)隨機存儲存儲器,英文縮寫寫作DRAM,一般每個單元由一個晶體管和一個電容組成。

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

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

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

        2、摩爾定律

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

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

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

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

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

        3、存儲層次

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

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

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

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

        img

        大部分電腦中的存儲層次如下四層:

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

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

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

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

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

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

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

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

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

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

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

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

        1、需求確認

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

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

        2、實現(xiàn)方式

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

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

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

        五、程序重定位

        1、地址空間

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

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

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

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

        2、鏈接階段

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

        三種鏈接方式:

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

        3、載入階段

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

        這塊同樣有三種方式進行載入:

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

        4、地址空間的讀取過程

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

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

        六、總結(jié)

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

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

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

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

        瀏覽 42
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            欧美一级视频 | 成年网站在线 | 男女无遮挡120动态图有限公司 | 成人AV小说 | 美女被操视频免费看 | 夜夜骚av.一区二区三区 | 男人舔女人高潮视频 | 黄色工厂网站 | 国产精品久久久久丝瓜 | 古典武侠久久 |