計算機一次取數過程分析
1 取址過程
CPU由運算器和控制器組成,其中控制器中的程序計數器(PC)保存的是下一條指令的虛擬地址,經過內存管理單元(MMU),將虛擬地址轉換為物理地址,之后交給主存地址寄存器(MAR),從主存中取出這條指令,通過主存數據寄存器(MDR)交給指令寄存器(IR),IR再將其轉化成控制信號。
2 間址過程
一條指令由 <操作碼,尋址方式,地址碼> 幾部分組成,尋址方式共有以下十種
- 隱含尋址
- 立即尋址
- 直接尋址
- 間接尋址
- 寄存器尋址
- 寄存器間接尋址
- 相對尋址
- 基址尋址
- 變址尋址
- 堆棧尋址
根據有效地址(EA)或立即數所處的位置,可以分為以下三類
在寄存器:隱含尋址、寄存器尋址
在立即數:立即尋址
在主存:直接尋址、間接尋址、寄存器間接尋址、相對尋址、基址尋址、變址尋址、堆棧尋址
而無論哪種方式得到的有效地址(EA)同樣也是虛擬地址
接下來要解決以下兩個問題
問題一:虛擬地址如何轉為物理地址?
問題二:如何訪問該物理地址?
3 虛擬地址轉為物理地址
3.1 單級頁表系統
在分頁管理的操作系統中,將主存分為一個個頁框,操作系統會建立頁表這種數據結構,負責虛擬頁號和主存頁框號的映射。
虛擬地址由 <頁號,頁內偏移量> 兩部分組成,根據頁號去查詢頁表,然后將頁表中的頁框號和頁內偏移量組成物理地址。
例如頁表部分內容如下,虛擬地址為00123366H,按字節編址,虛擬地址格式為<頁號12位,頁內偏移量20位>
根據虛擬地址中的001H,找到1號頁表項,其頁框號為521H,拼接上頁內偏移量后即可得到物理地址52123366H。
但是如果想要查詢頁表,也要知道頁表的起始地址,頁表的地址保存在進程控制塊(PCB)中,當CPU調度該進程時,會將PCB中的頁表起始地址放入頁表基址寄存器中,頁表起始地址為物理地址。
同時,為了解決頁表項過多導致一個頁框中放不下的問題,引入了多級頁表。為了減少訪存次數引入了快表(TLB)。
3.2 二級頁表系統
在使用多級頁表的32位操作系統中(以二級頁表為例),虛擬地址被分成了 <頁目錄號,頁號,頁內偏移量> 三部分,例如在下圖虛擬地址格式下虛擬地址為10801008H,頁目錄項和頁表項長度均為4字節,按字節編址。
10801008H,其頁目錄號是66,頁號是1,因此根據頁目錄號為66找到頁目錄項,其中的頁框號是00301H,找到對應的頁表所在頁框,然后拼接上頁號找到頁號頁表項對應的物理地址00301004H(這里因為一個頁目錄項是4B),頁表中的頁框號是98521H,拼接上頁內偏移量,最終的物理地址為98521008H。
3.3 二級頁表系統+快表
快表的實現基于相聯存儲器,是一種靜態隨機存取存儲器(SRAM),使用的存儲元是雙穩態觸發器,存取速度快。
在使用TLB的系統中,虛擬地址向物理地址的轉換一般先查詢快表(或者快表慢表一起查詢),如果快表命中,可以直接獲得頁框號,再和頁內偏移量組合,得到物理地址。
快表的映射方式有兩種,為全相聯映射和組相聯映射,至于為什么不使用直接映射,在討論完全相聯映射和組相聯映射后再討論。
全相聯映射
使用全相聯映射的TLB中
TLB的格式為 <標記位,有效位,頁框號>
此處的標記位即虛擬頁號,若虛擬地址格式為 <頁目錄號(10位),頁號(10位),頁內偏移量(12位)>
TLB的標記位是虛擬地址中的頁目錄號+頁號組成的虛擬頁號
因為TLB是使用硬件電路實現的,全部TLB標記可以并行對比。
例如虛擬地址為10801008H,TLB使用全相聯映射,虛擬地址格式為<頁目錄號(10位),頁號(10位),頁內偏移量(12位)>,TLB部分內容如下圖所示
查詢TLB表,10801H與虛擬頁號一致,且有效位為1,因此可以直接得到頁框號00001H,與頁內偏移量008H拼接得到物理地址為00001008H,若未命中則回到上文中的查詢二級頁表的過程,且更新快表。
組相聯映射
使用組相聯映射的TLB格式如為 <標記位,有效位,頁框號>,虛擬地址格式為 <標記位,組號,頁內偏移量>,標記位+組號就是虛擬頁號,同頁目錄號+頁表號
例如二路組相聯的TLB,其中共有32行,分成16組(用4位二進制表示),若虛擬地址為10801008H,虛擬地址格式為<標記位(16位),組號(4位),頁內偏移量(12位)>,則查找1號分組,標記位為1080H
第一組標記位為1080H命中,其有效位為1,直接得到頁框號為00002H,拼接上頁內偏移量得到物理地址為00002008H,若未命中則回到上文中的查詢二級頁表的過程,且更新快表。
直接映射
TLB一項的大小很小,而且直接映射沖突率高,為了實現高命中率和低沖突率,因此TLB不使用直接映射。
而cache按照塊大小,將主存一塊數據(主存的一塊和內存管理的一頁沒有關系,通常一頁的大小比一塊的大小要更大)讀入cache行中,沖突率相比TLB會小一些,在部分場景下可以接受這種沖突的成本。
4.訪問物理地址
得到物理地址后,會先訪問cache,如果cache未命中訪問主存,并將該物理地址所在塊調入cache中(或者同時訪問cache和主存)。
cache和TLB都是基于SRAM的相聯存儲器,不同的是cache的映射方式有三種,分別是直接映射,全相聯映射,組相聯映射。
直接映射
物理地址格式為 <Tag,行號,塊內地址>
cache行內格式為 <Tag,有效位,臟位等其他數據,塊數據>
全相聯映射
物理地址為 <Tag,塊內地址>
cache行內格式為 <Tag,有效位,臟位等其他數據,塊數據>
組相聯映射
物理地址格式為 <Tag,組號,塊內地址>
cache行內格式為 <Tag,有效位,臟位等其他數據,塊數據>
因為和TLB的過程沒有太大區別,此處不再詳細討論。
不過值得注意的是,當TLB和cache未命中要更新TLB和cache時候需要使用置換算法,置換算法此處也不再討論。