代码之家  ›  专栏  ›  技术社区  ›  SF.

如果写入的值不变,mmap()是否执行写操作?

  •  1
  • SF.  · 技术社区  · 6 年前

    如果我重复对与文件系统中某个文件对应的mmapped内存执行同一值的多次写入,是否会导致多次物理写入(并导致中等磨损)?


    我正在将设备在NVRAM中保存的一段持久数据迁移到flash,因此介质磨损的问题开始变得重要-NVRAM有无限的写入周期,而flash没有。但已经停产的老NVRAM芯片中的电池开始出现故障,这迫使我们采取行动。

    在flash上访问文件时的两个关键行是:

    fd = open(filename, O_RDWR|O_CREAT|O_SYNC);
    
    file = (unsigned char*) mmap(0, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
    

    特别值得注意的是,O_SYNC和MAP_SHARED—文件系统是防损坏的,最新的数据应该能在意外断电后保存下来,因此我不会延迟写入(例如,我们接到通知,电源在PSU电容器断开之前约0.3秒就消失了,设备在没有任何轻微关机的情况下关机。应该在日志中记录这一事实,下一次启动时将根据在关闭系统电源之前存储的数据创建日志)。

    现在,代码中充斥着各种各样的小数据的写入,固件希望通过意外重启来保留这些数据,但不必担心flash上的文件。有了无限的写周期和相同的读写速度,写任何我想要的值都比读要容易得多,而且只在需要更改时才写。现在,处理过程已迁移到写入flash(通过mmap),我想知道是否应该先读取,然后仅在不同的情况下写入,以防止不必要的写入,还是只是浪费时间和资源,操作系统调用在内部处理?(不能真的放弃O_SYNC;如果我有一段数据要写,我现在就需要写它,而不是坐在可能在半秒钟内消失的缓冲区中,同时为整个系统供电。)

    0 回复  |  直到 6 年前
    推荐文章