什么是 Cache Miss
程序運行的本質是 CPU 讀取修改數據,而原始的數據都在磁盤上,你也可以直接在磁盤上執行程序,但是因為硬件原因,速度很慢。
所以有物理內存這一中介,物理內存的讀寫速度比磁盤快很多,系統會把當前程序需要的數據載入物理內存中,讓 CPU 能更快讀取。
但是依然不夠快,於是有 L1/L2/L3 Cache 這類多級緩存,他們的讀寫速度更快,但是容量也更小。Cache Miss 就是指的從這里的緩存拿不到需要的數據,導致需要向下一級緩存拿數據,這一來一回必然就有了時間消耗,最差的情況就是需要從磁盤拿數據,所以用固態硬盤的機子會比機械硬盤運行程序來的快。
為什么會 Cache Miss
因為硬件成本的原因,緩存的容量越大,讀寫的速度也越慢。CPU Cache 的速度是最快的,容量也最小,因此也沒法容納程序需要的所有數據,一次只會緩存程序的部分數據,那就難免會有某些數據沒有緩存到,這就造成了 Cache Miss。
怎樣盡量避免 Cache Miss,提高 Cache Hit
- 設計內存連續的數據結構。 因為 Cache 是一串一串(Cache Line)的讀取的,就是讀取某個數據時,會把周圍的數據也讀取進來,湊成固定的大小(Cache Line)。如果數據存儲是連續的,則很有可能剛好把下次要讀取的數據也一起讀取進來了。比如數組的遍歷。ECS 的內存友好也是因為數據結構是多個連續的數組組成,而不是面向對象那種一個 class 包裹各種數據。
延展
什么是缺頁中斷,內存換頁
缺頁中斷就是 CPU 訪問內存中還未加載的數據,內存需要從磁盤加載數據。
訪問內存-頁面不存在-觸發缺頁中斷-進入中斷處理程序-os 檢查頁面分配情況-從磁盤讀取交換文件/交換分區-修改頁表並刷新頁面緩存-恢復線程運行。
操作系統虛擬內存換頁的過程是什么?
什么是虛擬內存
虛擬內存是內存管理的一項技術,使得每個應用程序擁有一樣大小的連續完整的內存空間地址(邏輯地址/虛擬地址),並且映射到具體的物理地址。相當於一個中間層,使得應用程序不關心內存怎么分配。虛擬(邏輯)內存地址可能指向物理內存,也可能指向磁盤空間。(對於32位進程,其邏輯內存空間位4G)
虛擬內存
什么是多級頁表
多級頁表是用於虛擬地址映射到物理地址的數據結構。如果一個應用程序有4G的數據,那么虛擬內存也有4G,但通常不會全用上。假如只用一級頁表,那么所有的地址映射都要在主存中,這就很浪費。於是采用了多級頁表,就跟文檔的目錄拆分一樣,一級頁表是大綱,覆蓋了所有的內存段。二級頁表就是以及頁表定義的內存段的繼續細分。也因此二級頁表不需要一開始就在主存中,只需要當對應的一級頁表被使用到是,再動態從磁盤中載入對應的二級頁表。(即二級頁表可以不存在主存中,甚至不存在)
操作系統中的多級頁表到底是為了解決什么問題?
什么是內存碎片
空閑卻使用不了的內存。
外部內存碎片:產生多個不連續的小物理內存,導致新的程序無法裝載。
內部內存碎片:程序所有內存都裝載到了物理內存,但有部分不使用。
20 張圖揭開「內存管理」的迷霧,瞬間豁然開朗