内核版本 3.0 和 3.4.35 (不同内核版本的回写机制不同哦~)
Linux内核里负责回写脏页的线程称为flusher线程,它们以“flush-”+“设备名”来命名,例如”[flush-8:64]”(这里设备名是指用设备号拼接的字符串)。
在BDI(即backing device info)模块初始化(default_bdi_init())时会创建”[sync_supers]”和”[bdi_default]”两个线程。其中,“[sync_supers]”线程用来周期性(间隔同flusher线程)地同步系统中所有的superblocks(遍历全局super_blocks链表)。“[bdi_default]”线程则用来在必要时创建、启动和停止flusher线程。
系统中每新增一个bdi设备(例如硬盘)就会通过bdi_register()注册到全局的bdi_list链表中,每个bdi设备都会有自己的flusher线程,在某个设备需要回写脏页时,bdi_default线程就会为其创建”[flush-devname]”线程(bdi_forker_thread())并运行,如”[flush-8:64]”。flusher线程的处理函数为bdi_writeback_thread(),负责周期性地回写脏页,实际回写操作由wb_do_writeback()函数完成(其第二个参数为1会等IO完成才返回,为0则立即返回)。
flusher线程的回写的周期间