高端網(wǎng)站鑒賞哈爾濱百度搜索排名優(yōu)化
目錄
- 計算機(jī)的基本組成
- CPU
- 內(nèi)存
- 虛擬內(nèi)存
- 內(nèi)存分段
- 內(nèi)存分頁
- CPU與內(nèi)存的交互過程
- 高速緩存cache
所有圖片均來自:小林coding
計算機(jī)的基本組成
計算機(jī)由軟件和硬件組成
硬件由CPU(中央處理器)存儲器(內(nèi)存+外存)外部設(shè)備組成。
軟件由應(yīng)用軟件和系統(tǒng)軟件組成(操作系統(tǒng),編譯器).
CPU
CPU也叫中央處理器
分為運(yùn)算器 ,控制器 ,寄存器組三部分
其中運(yùn)算器和控制器又分別有好多小的單元組成
運(yùn)算器,主要處理所有的算術(shù)運(yùn)算和邏輯運(yùn)算
算數(shù)邏輯單元ALU
累加寄存器AC
數(shù)據(jù)緩沖寄存器DR
狀態(tài)條件寄存器PSW
控制器,控制整個CPU的工作,決定計算機(jī)運(yùn)行過程的自動化
程序計數(shù)器PC
指令寄存器IR
指令編碼器ID
地址寄存器AR
寄存器組
寄存器組可以分為兩類,一類是專用寄存器,另外一類是通用寄存器。運(yùn)算器和控制器里面的寄存器都是專用寄存器組,而通用寄存器的用途廣泛可以由程序員規(guī)定其用途
內(nèi)存
內(nèi)存是用來直接跟CPU進(jìn)行交互的
虛擬內(nèi)存
為什么要引入虛擬內(nèi)存?
:如果所有的程序都是直接操作物理內(nèi)存,那么當(dāng)多個程序同時運(yùn)行時,就可能會對同一個物理地址進(jìn)行操作,這樣就可能會出現(xiàn)錯誤,所以為了避免這種情況,引入了虛擬內(nèi)存的概念,程序直接訪問的是虛擬內(nèi)存,虛擬內(nèi)存經(jīng)過CPU中的內(nèi)存管理單元(MMU) 可以轉(zhuǎn)化成對應(yīng)且不同的物理地址,這樣就規(guī)避掉了多個程序運(yùn)行訪問同一個物理地址的情況.
CPU將虛擬地址交給MMU,經(jīng)由MMU轉(zhuǎn)化成物理地址.
虛擬地址和物理地址主要有兩種轉(zhuǎn)化關(guān)系,分別是內(nèi)存分段和內(nèi)存分頁.
內(nèi)存分段
內(nèi)存分段的情況下,虛擬內(nèi)存分成兩部分,分別是段選擇因子和段內(nèi)偏移量
段選擇因子里邊最重要的是段號,段號是段表的索引,如下圖:
段表由基地址,段界限,特權(quán)等級組成
段的基地址+段內(nèi)偏移量 = 物理地址
內(nèi)存分段的缺點(diǎn):
1.會產(chǎn)生大量的外部內(nèi)存碎片,雖然空閑的內(nèi)存很多,但都是不連續(xù)的,這樣就會導(dǎo)致即使空閑內(nèi)存大小 > 所需要占用的內(nèi)存大小,但是因?yàn)閮?nèi)存不連續(xù)就無法使用.
2.內(nèi)存交換效率低,當(dāng)交換一大段連續(xù)的內(nèi)存時(將內(nèi)存數(shù)據(jù)寫入外存),會非常占用時間.
內(nèi)存分頁
內(nèi)存分頁主要解決了內(nèi)存分段情況下產(chǎn)生的外部內(nèi)存碎片以及內(nèi)存交換效率低兩個問題.
內(nèi)存分頁情況下,虛擬內(nèi)存和物理內(nèi)存之前是通過頁表來映射的,而頁表也是存放在內(nèi)存管理單元(MMU)里的. 如果想要訪問的虛擬內(nèi)存在頁表中查不到,那么便會返回一個缺頁異常,進(jìn)入系統(tǒng)內(nèi)核空間分配物理內(nèi)存、更新進(jìn)程頁表,最后再返回用戶空間,恢復(fù)進(jìn)程的運(yùn)行。
如何解決產(chǎn)生的外部內(nèi)存碎片:
頁和頁之間是緊密排列的,只會產(chǎn)生內(nèi)部內(nèi)存碎片(即使程序大小不足一頁,也至少需要分配一頁內(nèi)存),而不會產(chǎn)生外部內(nèi)存碎片
如何解決內(nèi)存交換速度慢:
當(dāng)內(nèi)存不夠時或者說是缺頁中斷時(所需要的頁面不在物理內(nèi)存中),會觸發(fā)內(nèi)存交換,把不常用的內(nèi)存頁面釋放掉(換出,寫入磁盤)然后把需要的內(nèi)存頁面從磁盤寫入內(nèi)存(換入),所以內(nèi)存分頁下的內(nèi)存交換只需要交換一個或少數(shù)幾個頁就行了,內(nèi)存交換的效率就比較高.
這里涉及到5中內(nèi)存頁面置換算法,分別是:
1.最佳頁面置換算法
2.先進(jìn)先出頁面置換算法
3.最近最久未使用頁面置換算法
4.時鐘頁面置換算法
5.最不常用頁面置換算法
這里就不多講解了,但是這部分也是比較重點(diǎn)的內(nèi)容,
虛擬內(nèi)存是怎么通過頁表跟物理內(nèi)存映射的?
虛擬內(nèi)存分為頁號和頁內(nèi)偏移量兩部分
頁號是頁表的索引,通過查找頁表可以獲得物理頁號,物理頁號+頁內(nèi)偏移量就可以得到物理地址了!
多級頁表:
為什么要出現(xiàn)多級頁表(摘自小林)
在 32 位的環(huán)境下,虛擬地址空間共有 4GB,假設(shè)一個頁的大小是 4KB(2^12),那么就需要大約 100 萬 (2^20) 個頁,每個「頁表項(xiàng)」需要 4 個字節(jié)大小來存儲,那么整個 4GB 空間的映射就需要有 4MB 的內(nèi)存來存儲頁表。
這 4MB 大小的頁表,看起來也不是很大。但是要知道每個進(jìn)程都是有自己的虛擬地址空間的,也就說都有自己的頁表。
那么,100 個進(jìn)程的話,就需要 400MB 的內(nèi)存來存儲頁表,這是非常大的內(nèi)存了,更別說 64 位的環(huán)境了。
所以說引入了多級頁表,如圖:
如圖,一級頁表有1024個頁表項(xiàng),每一個頁表項(xiàng)對應(yīng)著一個二級頁表,每一個二級頁表又有1024個頁表項(xiàng),一級頁表和二級做乘法10241024(2的10次方2的10次方)所以剛好可以覆蓋掉4G的虛擬內(nèi)存
疑問點(diǎn):
如果一個頁表項(xiàng)占用4個字節(jié),那么一級頁表此時占(1024*4)=4K
二級頁表占用 (1024 * 1024 * 4)=4M
4K + 4M > 4M
所以說如果所有的頁表項(xiàng)都被使用的話,二級頁表比一級頁表還要耗內(nèi)存
但是計算機(jī)存在局部性原理,如果一級頁表沒有被用到的話,就不會創(chuàng)建對應(yīng)的二級頁表,這也是二級頁表省內(nèi)存的原因.
TLB
把最常訪問的幾個頁表項(xiàng)存放入CPU中的Cache高速緩存里,這個Cache就叫TLB
下文會詳細(xì)說一下CPU中的Cache.
CPU與內(nèi)存的交互過程
CPU無論是跟內(nèi)存交換數(shù)據(jù),還是跟外設(shè)交換數(shù)據(jù),都是依賴總線
分別是,控制總線,數(shù)據(jù)總線,地址總線
地址總線,用于指定 CPU 將要操作的內(nèi)存地址;
數(shù)據(jù)總線,用于讀寫內(nèi)存的數(shù)據(jù);
控制總線,用于發(fā)送和接收信號,比如中斷、設(shè)備復(fù)位等信號,CPU 收到信號后自然進(jìn)行響應(yīng),這時也需要控制總線;
執(zhí)行程序的過程就是執(zhí)行一條一條指令的過程
-
首先CPU會訪問自己的【程序計數(shù)器(PC)】,程序計數(shù)器里存放的是指令的地址,然后它會通過【控制器】操作【地址總線】來訪問內(nèi)存地址,通知內(nèi)存要訪問的地址,并等待內(nèi)存把數(shù)據(jù)準(zhǔn)備好,然后接受內(nèi)存的數(shù)據(jù),然后將指令數(shù)據(jù)存放入【指令寄存器(IR)里】
-
程序計數(shù)器(PC)自增,自增的程度取決于CPU的位寬,如果是32位CPU,代表一次能處理4個字節(jié)的數(shù)據(jù),所以PC自增4
-
檢查【指令寄存器(IR)】中指令的類型,如果是運(yùn)算類型,則交給算術(shù)邏輯單元(ALU)如果是存儲類型則交給控制單元
高速緩存cache
Cache是位于CPU和內(nèi)存之間的臨時存儲器,它的容量比內(nèi)存小但數(shù)據(jù)交換速率卻快很多。
CPU Cache 用的是一種叫 SRAM(Static Random-Access Memory,靜態(tài)隨機(jī)存儲器) 的芯片。
內(nèi)存用的芯片和 CPU Cache 有所不同,它使用的是一種叫作 DRAM (Dynamic Random Access Memory,動態(tài)隨機(jī)存取存儲器) 的芯片。
在 SRAM 里面,一個 bit 的數(shù)據(jù),通常需要 6 個晶體管,所以 SRAM 的存儲密度不高,同樣的物理空間下,能存儲的數(shù)據(jù)是有限的,不過也因?yàn)?SRAM 的電路簡單,所以訪問速度非???。DRAM 的數(shù)據(jù)訪問電路和刷新電路都比 SRAM 更復(fù)雜,所以訪問的速度會更慢,內(nèi)存速度大概在 200~300 個 時鐘周期之間。
當(dāng)CPU需要讀取數(shù)據(jù)時,它會首先從Cache中查找。如果數(shù)據(jù)已經(jīng)在Cache中(即高速緩存命中),CPU可以直接從Cache中讀取數(shù)據(jù)并處理。這大大減少了從內(nèi)存中讀取數(shù)據(jù)的延遲,提高了CPU的執(zhí)行效率。
如果數(shù)據(jù)不在Cache中(即高速緩存未命中),CPU會從內(nèi)存中讀取數(shù)據(jù),并同時把這個數(shù)據(jù)所在的數(shù)據(jù)塊調(diào)入Cache中。這樣,如果CPU后續(xù)還要讀取這個數(shù)據(jù)塊中的其他數(shù)據(jù),就可以直接從Cache中獲取,而不需要再次訪問內(nèi)存。這種方式有效地減少了CPU訪問內(nèi)存的次數(shù),提高了程序的執(zhí)行效率。
此外,除了讀取本次要訪問的數(shù)據(jù),CPU還會預(yù)取本次數(shù)據(jù)的周邊數(shù)據(jù)到Cache中。這是基于程序運(yùn)行的局部性和時間局部性原理,即當(dāng)一條指令正在被執(zhí)行時,在很短的時間內(nèi),這條指令周圍的指令也會有很大的概率被執(zhí)行。因此,預(yù)取周邊數(shù)據(jù)到Cache中可以使得以后對整塊數(shù)據(jù)的讀取都從Cache中進(jìn)行,不必再調(diào)用內(nèi)存。
總之,Cache的出現(xiàn)是為了解決CPU處理速率和主存訪問速率差異過大的問題。通過把數(shù)據(jù)暫時存放在Cache中,CPU可以更快地獲取需要的數(shù)據(jù),減少了訪問內(nèi)存的延遲,提高了程序的執(zhí)行效率。