Linux:“主要頁面錯誤分頁”和“手動啟用交換”之間的區別
在 Linux 機器上,我們可以通過如下命令啟用交換
sudo fallocate -l 500M /data/swapfile sudo chmod 600 /data/swapfile sudo mkswap /data/swapfile sudo swapon /data/swapfile
但即使未啟用此功能,當頁面不在記憶體中時,核心仍會進行分頁。
我們可以通過
sar -B 1 30
在不設置任何交換文件的機器上執行命令來驗證這一點。03:08:40 AM pgpgin/s pgpgout/s fault/s majflt/s pgfree/s pgscank/s pgscand/s pgsteal/s %vmeff 03:08:41 AM 0.00 0.00 3.00 0.00 44.00 0.00 0.00 0.00 0.00 03:08:42 AM 0.00 0.00 19.00 0.00 30.00 0.00 0.00 0.00 0.00 03:08:43 AM 0.00 0.00 0.00 0.00 3.00 0.00 0.00 0.00 0.00 03:08:44 AM 24.00 0.00 2.00 1.00 7.00 0.00 0.00 0.00 0.00 03:08:45 AM 364.00 60.00 18.00 3.00 4.00 0.00 0.00 0.00 0.00 03:08:46 AM 140.00 0.00 392.00 2.00 243.00 0.00 0.00 0.00 0.00
仍然有majflt會觸發將數據分頁到磁碟分頁從磁碟中的數據。
我的問題是:
- 我們可以說作業系統上有兩種類型的交換嗎?
- 這兩種機制的工作方式有何不同?
- 如果總有分頁機制在工作,為什麼還需要手動啟用交換?
我知道有人說:
交換是指將整個程序地址空間,或者無論如何,不可共享的文本數據段,一次復製到交換設備,或者複製回來(通常是磁碟)。
而分頁是指複製入/出地址空間的一頁或多頁。特別是,這是一個更精細的粒度。例如,在 1 GB RAM 地址空間中有約 250,000 個 4 KB 頁。
但是,在《Understanding the Linux Virtual Memory Manager 》一書中,Linux中似乎並非如此。
嚴格來說,Linux 不交換,因為“交換”是指將整個程序地址空間複製到磁碟,而“分頁”是指複製出單個頁面。Linux 實際上實現了分頁,因為現代硬體支持它,但傳統上在討論和文件中將其稱為交換。為了與該詞的 Linux 用法保持一致,我們也將其稱為交換。
有人可以對此有所了解嗎?謝謝!
仍然有majflt會觸發將數據分頁到磁碟。
反過來說:主要錯誤是頁面錯誤,只能通過從磁碟中調入數據來解決。
我們可以說作業系統上有兩種類型的交換嗎?
不完全的; 這裡的區別是分頁(將記憶體內容複製到“其他地方”以便可以丟棄頁面)可以使用不同的備份儲存。記憶體中的頁面有不同的分頁目標:映射文件通常是它們自己的備份儲存,大多數其他頁面需要交換文件或分區作為備份儲存。交換指的是後者。當核心需要釋放記憶體頁面時,如果它想從文件中釋放未修改的頁面,它可以簡單地丟棄它,因為知道該頁面可以在需要時從文件中恢復。當它需要從文件中丟棄修改過的頁面時,如果該文件被映射為讀/寫且不共享,則該頁面將在被丟棄之前寫入文件;再一次,核心知道它可以從文件中恢復頁面。其他任何東西都需要其他形式的儲存,否則無法丟棄。
這兩種機制的工作方式有何不同?
往上看。
如果總有分頁機制在工作,為什麼還需要手動啟用交換?
大部分見上文。交換的目的是為還沒有自己的備份儲存的頁面提供備份儲存。