iOS 內(nèi)存監(jiān)控與治理(一)-- 認識計算機中的內(nèi)存

概述

內(nèi)存(又稱主存,內(nèi)部存儲器)和外部存儲器構(gòu)成計算機存儲器。內(nèi)存是CPU能直接尋址的儲存空間,由半導(dǎo)體器件制成。內(nèi)存的特點是訪問速度快。舉例來講,我們平常使用的應(yīng)用程序一般是安裝在硬盤等外部存儲器上,真正使用的時候需要把他們調(diào)入內(nèi)存中運行。通常我們把要永久保存的、大量的數(shù)據(jù)存儲在外部存儲器上,而把臨時的或少量的數(shù)據(jù)和程序放到內(nèi)存上。

此外,我們常說的RAM(隨機存取存儲器 - Random Access Memory)就是內(nèi)存存儲器,RAM 存儲器可以進一步分為靜態(tài)隨機存取存儲器(SRAM)和動態(tài)隨機存取存儲器(DRAM)兩大類。SRAM 具有快速訪問的優(yōu)點,但生產(chǎn)成本較為昂貴,一個典型的應(yīng)用是緩存。而DRAM 由于具有較低的單位容量價格,所以被大量的采用作為系統(tǒng)的內(nèi)存。

存儲層次

我們已經(jīng)對內(nèi)存有了清晰的概念,下面我們來看計算機存儲系統(tǒng)的存儲層次,這樣就可以對內(nèi)存有一個更加清晰的認識。

現(xiàn)代計算機的結(jié)構(gòu)模型大多基于馮·諾伊曼結(jié)構(gòu),該結(jié)構(gòu)是一種將程序指令存儲器和數(shù)據(jù)存儲器合并在一起的電腦設(shè)計概念結(jié)構(gòu),依照該結(jié)構(gòu)設(shè)計出的計算機又稱為存儲程序計算機。存儲程序計算機主要為了區(qū)別于早期計算器僅內(nèi)含固定用途的程序問題,通過創(chuàng)造一組指令集結(jié)構(gòu),并將所謂的運算轉(zhuǎn)化成一串程序指令的運行細節(jié),讓機器更能有彈性。但是,該結(jié)構(gòu)將CPU與存儲器分開的設(shè)計,會導(dǎo)致所謂的的馮·諾伊曼瓶頸:在CPU與存儲器之間的流量(資料傳輸率)與存儲器的容量相比起來相當(dāng)小,在現(xiàn)代電腦中,流量與CPU的工作效率相比之下非常小,在某些情況下(當(dāng)CPU需要在巨大的資料上運行一些簡單指令時),資料流量就成了整體效率非常嚴重的限制。CPU將會在資料輸入或輸出存儲器時閑置。由于CPU速度遠大于存儲器讀寫速率,因此瓶頸問題越來越嚴重。

為了舒緩馮·諾伊曼瓶頸帶來的問題,計算機存儲系統(tǒng),在CPU與存儲器間的加入了緩存存儲器。存儲層次是指在計算機體系結(jié)構(gòu)下存儲系統(tǒng)層次結(jié)構(gòu)的排列順序。每一層于下一層相比都擁有較高的速度和較低延遲性,以及較小的容量。

一個典型的存儲器層次結(jié)構(gòu):


存儲層次.png

CPU內(nèi)存尋址以及虛擬內(nèi)存

我們已經(jīng)知道內(nèi)存本質(zhì)是儲存空間,那么CPU是如何訪問內(nèi)存的呢?下面我們就來探討下CPU內(nèi)存尋址以及虛擬內(nèi)存。

CPU中是有專門用于內(nèi)存訪問請求的計算機硬件叫做MMU(內(nèi)存管理單元),MMU有時也稱為分頁內(nèi)存管理單元,它的功能包括虛擬地址和物理地址的轉(zhuǎn)換、內(nèi)存保護、CPU高速緩存的控制,在較為簡單的計算題體系結(jié)構(gòu)中,負責(zé)總線的仲裁以及存儲體切換。

這里引入了新的概念,虛擬地址物理地址。物理地址是指內(nèi)存的某個可以讓數(shù)據(jù)總線訪問的特定存儲單元的內(nèi)存地址。簡單的理解可以把存儲空間看作一個數(shù)組,數(shù)組元素是一個字節(jié)大小的空間,數(shù)組索引就可以理解為物理地址。CPU 訪問內(nèi)存直接通過物理地址訪問對應(yīng)的內(nèi)存,這種方式就是物理尋址。虛擬地址區(qū)分于物理地址,在使用MMU轉(zhuǎn)換內(nèi)存地址的計算機中,虛擬和物理地址分別指在經(jīng)MMU轉(zhuǎn)換之前和之后的地址。

之所以引入虛擬地址也比較好理解,如果直接把物理地址暴露給程序,那么任意程序都有可能對其他程序造成不可預(yù)估的影響。此外,現(xiàn)代的MMU是以頁的方式,分割虛擬地址空間(處理器使用的地址范圍),頁的大小是2的n次方。操作系統(tǒng)會為每個程序分配虛擬內(nèi)存。這樣的處理方式不僅有助于減少程序的內(nèi)存碎片化現(xiàn)象,而且程序自身出現(xiàn)頁錯誤時,MMU可以檢測到頁錯誤,通知操作系統(tǒng)終止出錯的程序。

虛擬內(nèi)存是計算機系統(tǒng)內(nèi)存管理的一種技術(shù)。它使得應(yīng)用程序認為它擁有連續(xù)可用的內(nèi)存(一個連續(xù)完整的地址空間),實際上物理內(nèi)存通常被分隔為多個內(nèi)存碎片,還有部分暫時存儲在外部磁盤存儲器上,在需要時進行交換(iOS 不同于Mac OS,iOS不采用數(shù)據(jù)交換)。

VirtualMemory.png
那么MMU是如何進行虛擬地址和物理地址的轉(zhuǎn)換呢?

這里引入新的名詞頁表(page table),頁表是一種數(shù)據(jù)結(jié)構(gòu),存儲了虛擬地址到物理地址的映射。每個映射被稱為PTE(page table entry)。此外,MMU會存儲最近使用過的頁表映射緩存,這個索引緩存被稱為TLB(translation lookaside buffer)。虛擬地址和物理地址的轉(zhuǎn)換流程就是MMU先去TLB中查詢是否有緩存,如果未找到則去頁表中查看是否存在映射(頁面遍歷),如果存在映射,則將其寫回TLB中,重新再從TLB讀取。如果頁表中也未能查找到,則有兩種情況,一種是傳入的虛擬地址是無效的,一般是程序錯誤導(dǎo)致。還有一種情況則是由于請求的頁面被調(diào)出物理內(nèi)存,此時就需要先把這些頁面換回到物理內(nèi)存,再執(zhí)行查詢流程。

完整的查詢流程如下:


queryVirtualAddr.png

本章內(nèi)容對計算機系統(tǒng)中的內(nèi)存相關(guān)知識進行了梳理,相關(guān)詞條來源于wiki,下一章我們梳理下iOS中的內(nèi)存知識

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

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