异步I/O与页面帧回收机制解析
1. 直接I/O操作流程
在进行直接I/O操作时,若以 mapping 为根的基数树非空( mapping->nrpages 大于零),系统会调用 filemap_fdatawrite() 和 filemap_fdatawait() 函数,将所有脏页刷新到磁盘,并等待I/O操作完成。这是为避免数据丢失,在开始直接I/O传输前同步磁盘映像与页面缓存。之后会调用映射地址空间的 direct_IO 方法,多数情况下,该方法是 __blockdev_direct_IO() 函数的封装。若操作类型为写入,还会调用 invalidate_inode_pages2() 扫描基数树中的所有页面并释放,同时清除引用这些页面的用户模式页表项。
__blockdev_direct_IO() 函数会将读写数据分割成合适的块,定位磁盘上的数据,并填充一个或多个 bio 描述符,描述要执行的I/O操作。这些数据会直接读写到 iov 数组中 iovec 描述符指定的用户模式缓冲区。最后通过 submit_bio() 函数将 bio 描述符提交到通用块层,通常该函数会在所有直接I/O传输完成后才返回。
2. POSIX标准的异步I/O库函数
POSIX 1003.1标
异步I/O与页面帧回收机制
超级会员免费看
订阅专栏 解锁全文
1892

被折叠的 条评论
为什么被折叠?



