前言
當我們修改了某個文件時,被修改的內容不會直接寫入磁盤中,而是會寫入由內核提供的一個buffer里,那么,內核會在一個特定的時間或者機制,再將buffer中的內容寫進磁盤中去,為什么要這么做?原因就是減少開銷,降低磁盤的讀寫次數。
緩存的三種機制
一般緩存有三種機制:
1.不緩存(nowrite):這種機制是跳過緩存,直接寫入磁盤中。如果進行讀操作時,還需要從磁盤中讀取存入緩沖中。個人覺得在讀操作時,使用的時間長。
2.寫透緩存(write-through cache):當進行寫操作時,會寫入緩存中,並且馬上再寫入磁盤中。這種機制相對於上一種,寫操作使用的時間長,但讀操作使用的時間短。
3.回寫:這種機制在寫操作時,會先寫入緩存中,但不會立即寫入磁盤中,而是在一些特定條件或操作,才會把緩存中的數據寫入磁盤。回寫機制可以說是非常靈活,這是本筆記探討的內容。
回寫機制的Dirty標志
buffer在特定的時間里(查看/proc/sys/vm/dirty_writeback_centisecs 再除以 100 就是多少秒),會被標記為dirty page,被標記的dirty page會被加入到一個鏈表中,但並不會馬上寫入磁盤中。
回寫機制的寫入磁盤時機
有兩種情況dirty page才會被寫入磁盤中:
1. 當空閑的內存低於某一個值時(查看/proc/sys/vm/dirty_background_ration),會把1024個dirty page寫回磁盤中,直到內存回到空閑狀態。
2. 當dirty page超過一定的比例時(查看/proc/sys/vm/dirty_ratio),內核會啟動pdflush線程把超過的那一部分啟寫入磁盤中。
3. 當dirty page超過了一定的時間(查看/proc/sys/vm/dirty_expire_centisecs),才會被寫入磁盤中。
4. 當用戶程序調用了sync() 和 fsync()系統調用。