本节书摘来自异步社区《Linux系统编程(第2版)》一书中的第2章,第2.5节,作者:【美】Robert Love著,更多章节内容可以访问云栖社区“异步社区”公众号查看
2.5 直接I/O
和其他现代操作系统内核一样,Linux内核实现了复杂的缓存、缓冲以及设备和应用之间的I/O管理的层次结构(参见2.11节)。高性能的应用可能希望越过这个复杂的层次结构,进行独立的I/O管理。但是,创建一个自己的I/O系统往往会事倍功半,实际上,操作系统层的工具往往比应用层的工具有更好的性能。此外,数据库系统往往倾向于使用自己的缓存,以尽可能减少操作系统带来的开销。
在open()中指定O_DIRECT标志位会使得内核对I/O管理的影响最小化。如果提供O_DIRECT标志位,I/O操作会忽略页缓存机制,直接对用户空间缓冲区和设备进行初始化。所有的I/O操作都是同步的,操作在完成之前不会返回。
使用直接I/O时,请求长度、缓冲区对齐以及文件偏移都必须是底层设备扇区大小(通常是512字节)的整数倍。在Linux内核2.6以前,这项要求更加严格:在Linux内核2.4中,所有的操作都必须和文件系统的逻辑块大小对齐(一般是4KB)。为了保持兼容性,应用需要对齐到更大(而且操作更难)的逻辑块大小。