美文网首页
浅尝辄止71-后备设备

浅尝辄止71-后备设备

作者: 阿棍儿_Leon | 来源:发表于2019-01-26 22:21 被阅读0次

    后备设备

    中文的叫法可能大家不太一样,英文是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,实现了定时写回磁盘的事务。

    相关文章

      网友评论

          本文标题:浅尝辄止71-后备设备

          本文链接:https://www.haomeiwen.com/subject/odjwjqtx.html