后备设备
中文的叫法可能大家不太一样,英文是backing device,我们可以按字面理解为备用设备,更准确地说是备用存储设备。“备”是为什么而准备的,主要是断电,也就是说,切断电源后,依旧能存储,因此它们都是非易失性存储设备。
对于后备设备,有一套管理信息,即bdi(backing device information),主要代码在kernel/mm/backing-dev.c,关于文件系统我们先关注一个问题,即我们一般调用write时,只是写到了内存里,真正写到磁盘里是谁干的?这件事就与bdi的相关代码有关。
写回函数
写回,即写回去。“回”怎么理解呢?有来才有回,“来”是什么?
来
write的过程中,操作系统首先要分配一些内存,这些内存与要写入的磁盘区域对应,即这些内存就代表了磁盘,对应磁盘区域的内容会读取到内存中,这个读就是“来”。
回
当我们写入内存后,内存的内容就与磁盘上不一样了。那就得找个机会,把内存中被改变的部分写到磁盘里,这就是“回”。
所谓“回”,就是从内存视角来看的,数据从磁盘到内存就是“来”,从内存到磁盘就是“回”了。
揭晓答案
在挂载时,系统中就会维护一个对应这个块设备的bdi,它的初始化会调用到bdi_wb_init,它里面有这么一句
INIT_DELAYED_WORK(&wb->dwork, bdi_writeback_workfn);
意思是,初始化一个工作队列,可以简单理解为建立一个进程或线程,它执行的是bdi_writeback_workfn这个函数,这就是我说的写回函数了。这个函数结尾处有这么一段
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);
作用就是,隔一段固定时间后,再次调用这个函数。
这个函数前部分就是真正写回磁盘的动作,也就是说,系统通过bdi,实现了定时写回磁盘的事务。