Linux

Linux:“主要頁面錯誤分頁”和“手動啟用交換”之間的區別

  • March 27, 2020

在 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會觸發將數據分頁到磁碟。

反過來說:主要錯誤是頁面錯誤,只能通過從磁碟中調入數據來解決。

我們可以說作業系統上有兩種類型的交換嗎?

不完全的; 這裡的區別是分頁(將記憶體內容複製到“其他地方”以便可以丟棄頁面)可以使用不同的備份儲存。記憶體中的頁面有不同的分頁目標:映射文件通常是它們自己的備份儲存,大多數其他頁面需要交換文件或分區作為備份儲存。交換指的是後者。當核心需要釋放記憶體頁面時,如果它想從文件中釋放未修改的頁面,它可以簡單地丟棄它,因為知道該頁面可以在需要時從文件中恢復。當它需要從文件中丟棄修改過的頁面時,如果該文件被映射為讀/寫且不共享,則該頁面將在被丟棄之前寫入文件;再一次,核心知道它可以從文件中恢復頁面。其他任何東西都需要其他形式的儲存,否則無法丟棄。

這兩種機制的工作方式有何不同?

往上看。

如果總有分頁機制在工作,為什麼還需要手動啟用交換?

大部分見上文。交換的目的是為還沒有自己的備份儲存的頁面提供備份儲存。

另請參閱為什麼 Linux 需要 VM 中的交換空間?

引用自:https://unix.stackexchange.com/questions/575251