虛擬記憶體與記憶體映射
次要與主要分頁錯誤
不是所有分頁錯誤代價都相同。便宜的那種——次要(軟)錯誤(minor/soft fault)——不碰磁碟就能修好;昂貴的那種——主要(硬)錯誤(major/hard fault)——必須先從磁碟讀取,程式才能繼續。兩者的差別大致就像「書已經在你桌上」對上「等它從遙遠倉庫運來」——同樣的請求,等待天差地遠。
次要錯誤發生在所需資料已在 RAM 裡、或不需讀磁碟時——作業系統只要修一下分頁表項。例子:該頁是作業系統能立刻交出的全新零頁;該頁已經常駐,因為另一個行程載入過它,你只需要一個指向它的對映;或它是一個只需在記憶體中複製一次的寫入時複製頁。成本是微秒等級。主要錯誤發生在該頁的資料確實必須從磁碟取得時——第一次從可執行檔或記憶體映射檔案讀入,或從置換空間分頁回來。成本由磁碟主導,可以慢上數十萬倍,是毫秒而非微秒。
這個區別是看效能最有用的單一視角。回報行程次要與主要錯誤次數的工具(例如「min flt」與「maj flt」欄位,或 /usr/bin/time -v)會告訴你一支慢程式究竟只是便宜地在對映記憶體(次要),還是被磁碟流量勒住(主要)。一個主要錯誤率持續攀升的工作負載正走在輾轉的路上;一個只有次要錯誤的,付的是需求分頁那小小的、正常的代價。
第一次碰觸剛 malloc 的記憶體通常是次要錯誤——作業系統給你一個已在 RAM 裡的零頁。第一次碰觸一個被置換出去的頁則是主要錯誤——作業系統必須先從置換裝置把它讀回來,你的指令才能完成。
不必讀磁碟:次要。必須讀磁碟:主要。
兩者都是真正的分頁錯誤;這個區分只關乎是否需要磁碟 I/O。會痛的是主要錯誤,而攀升的主要錯誤率是記憶體吃緊與輾轉將至的早期警訊;至於大量的次要錯誤則是正常且便宜的。
又稱
另見