后備設(shè)備
中文的叫法可能大家不太一樣,英文是backing device,我們可以按字面理解為備用設(shè)備,更準(zhǔn)確地說是備用存儲(chǔ)設(shè)備。“備”是為什么而準(zhǔn)備的,主要是斷電,也就是說,切斷電源后,依舊能存儲(chǔ),因此它們都是非易失性存儲(chǔ)設(shè)備。
對(duì)于后備設(shè)備,有一套管理信息,即bdi(backing device information),主要代碼在kernel/mm/backing-dev.c,關(guān)于文件系統(tǒng)我們先關(guān)注一個(gè)問題,即我們一般調(diào)用write時(shí),只是寫到了內(nèi)存里,真正寫到磁盤里是誰干的?這件事就與bdi的相關(guān)代碼有關(guān)。
寫回函數(shù)
寫回,即寫回去?!盎亍痹趺蠢斫饽??有來才有回,“來”是什么?
來
write的過程中,操作系統(tǒng)首先要分配一些內(nèi)存,這些內(nèi)存與要寫入的磁盤區(qū)域?qū)?yīng),即這些內(nèi)存就代表了磁盤,對(duì)應(yīng)磁盤區(qū)域的內(nèi)容會(huì)讀取到內(nèi)存中,這個(gè)讀就是“來”。
回
當(dāng)我們寫入內(nèi)存后,內(nèi)存的內(nèi)容就與磁盤上不一樣了。那就得找個(gè)機(jī)會(huì),把內(nèi)存中被改變的部分寫到磁盤里,這就是“回”。
所謂“回”,就是從內(nèi)存視角來看的,數(shù)據(jù)從磁盤到內(nèi)存就是“來”,從內(nèi)存到磁盤就是“回”了。
揭曉答案
在掛載時(shí),系統(tǒng)中就會(huì)維護(hù)一個(gè)對(duì)應(yīng)這個(gè)塊設(shè)備的bdi,它的初始化會(huì)調(diào)用到bdi_wb_init,它里面有這么一句
INIT_DELAYED_WORK(&wb->dwork, bdi_writeback_workfn);
意思是,初始化一個(gè)工作隊(duì)列,可以簡單理解為建立一個(gè)進(jìn)程或線程,它執(zhí)行的是bdi_writeback_workfn這個(gè)函數(shù),這就是我說的寫回函數(shù)了。這個(gè)函數(shù)結(jié)尾處有這么一段
if (!list_empty(&bdi->work_list))
mod_delayed_work(bdi_wq, &wb->dwork, 0);
else if (wb_has_dirty_io(wb) && dirty_writeback_interval)
bdi_wakeup_thread_delayed(bdi);
作用就是,隔一段固定時(shí)間后,再次調(diào)用這個(gè)函數(shù)。
這個(gè)函數(shù)前部分就是真正寫回磁盤的動(dòng)作,也就是說,系統(tǒng)通過bdi,實(shí)現(xiàn)了定時(shí)寫回磁盤的事務(wù)。