首先要說一個虛擬內存的概念。很多人以為「用磁碟空間來擴展物理內存」就是虛擬內存。實際上你的所有物理內存都是虛擬內存的一部分。CPU 執行的指令中的主存地址對應的都是虛擬地址,會通過 MMU(內存管理單元)來進行轉換,而如果訪問的地址並不在物理內存上,就會產生所謂的缺頁中斷,然後藉助 IO 系統調用去外存拿頁面文件。如果 CPU 沒有 MMU,那麼就是所謂的 MCU,比如很多 stm32(基於 A7 的除外),8051 單片機。虛擬內存對於操作系統和應用程序有很多好處,一個典型的好處就是fork這個系統調用,將運行著的程序分成2個(幾乎)完全一樣的進程,這樣就可以實現 CoW(寫時複製),減少不必要的內存複製。應用的多線程相當依賴 fork。
而顯卡通常都是掛在 PCIe 上的外部設備,其顯存並不屬於虛擬內存空間,雖然顯卡因為有 DMA 能力,所以會佔用一段虛擬內存空間,但是目前來看沒有顯卡實現讓自己的顯存進入操作系統的主存空間。
其中這裡還有一個原因,操作系統的字長通常都是 32bit/64bit。而顯卡為了實現更大的吞吐量,通常都是 128bit 起步,HBM 能夠到 1024bit 的位寬,並且也沒有延遲上的優化,這對於 CPU 這樣的結構去訪問是不利的。所以使用 GDDR 的遊戲機都會配置 eDRAM/eSRAM 增加命中率,降低平均訪存延遲。但是這種情況還是 CPU/GPU/內存控制器都在同一個 Die 上的情況。如果是普通的 PC 架構,PCIe 延遲還是非常可觀的,而且吞吐也有限制。所以並不是完全不能用,而是用了收益也不大。
如果內存真的不夠用,也就只能依賴內存壓縮(比如 ZRAM)或者SWAP這樣的頁面文件機制。現在很多 SSD 基於 NVMe,特別是 Intel 的 3D xpoint 有著低延遲特性,甚至被做成 DIMM 插槽,對於提升內存空間還是有幫助的。
這位大哥把 Video RAM 變成了標準塊設備(差不多就是存儲設備),然後格式化為 SWAP 文件系統,結果發現比普通存儲設備慢了三倍(也沒說 SSD/HDD)。