可以直接在应用层和磁盘之间建立通道,减少上下文切换次数。
使用
在 Linux 中使用 DirectIO 很简单,在通过 open(2)
打开文件时,在 flags
参数中添加上 O_DIRECT
即可,以告诉内核想对该文件进行直接 IO 操作。
当然,上述的 O_DIRECT
宏依赖于 _GNU_SOURCE
的宏定义。
注意事项
因为涉及到直接操作磁盘,那么需要保证 存放数据缓存区的起始位置 以及每次 读写数据长度 必须是 磁盘逻辑块大小的整数倍,如果不满足就会报 EINVAL
的错误。
磁盘逻辑块的大小可以通过 statfs()
函数获取,对应了 f_bsize
字段,一般是 512 字节,如果是 SSD 可能是 4096 大小,也可以通过如下命令获取。
----- 硬盘的最小存储单位,一般是扇区,本身并没有Block概念
# fdisk -l
----- 文件系统Block大小,首先查看类型,然后再选择对应的工具
# df -T
/dev/sda2 ext4 51474912 16553932 32283156 34% /home
# tune2fs -l /dev/sda2 | grep "Block size"
Block size: 4096