为什么驱逐内存中的脏页时必须先将其写回磁盘?
你混淆了两种内存页的处理逻辑,OSTEP这里的描述特指**文件映射页(file-backed page)**的驱逐规则:
- 内存中的页主要分两类:
- 匿名页:没有对应的磁盘文件,比如进程的堆、栈、动态申请的私有内存,这类页的修改没有原生的持久化存储位置,驱逐时才会写入swap交换空间
- 文件映射页:有明确对应的磁盘文件,比如程序的代码段、进程打开读取的文件内容、mmap映射的文件内容,这类页如果被修改为脏页,修改的是文件在内存中的临时副本,驱逐时必须把修改写回对应的原磁盘文件,否则修改就会永久丢失
- swap的设计定位就是给匿名页做临时持久化的,不会用来存储文件映射页的修改:文件映射页本身就有固定的持久化位置(原文件),把修改写回原文件既符合文件系统的读写语义,也不会额外占用swap空间,是更合理的设计。
关于两次I/O的疑问:不存在驱逐脏页时产生两次I/O的情况。驱逐操作本身只会产生一次写I/O:匿名页写swap,文件映射脏页写原文件。后续需要再次访问该页时产生的读I/O是按需触发的,不属于驱逐操作本身的开销。
内容的提问来源于stack exchange,提问作者dazhu
相关产品推荐
相关产品推荐

