DirectIO(O_DIRECT) 详解
什么是DirectIO
DirectIO也叫无缓冲IO,裸IO(rawIO),意思是使用无缓冲IO对文件进行读写,不会经过OS Cache。
通常,我们使用的文件流读取、内存映射都属于Cache IO,因为将数据写入文件,首先会写入cache,最终再落盘到IO device 或者称为 disk上。cache IO使得我们在写入、读取(预读取、顺序读取等特性)文件数据的时候,性能得以提升,能够从cache(内存)中读取数据。
直接IO,则是直接将数据写入文件、或者从文件中读取出来,绕过了cache,这使得看起来性能没那么好,但是,仔细分析,无论哪种IO方式,最终数据都必须落盘,而两种的区别在于有无OS cache。
OS cache提供的预读取、顺序读取等特性,这些特性并不适用于所有的场景,比如数据库,数据库通常都有自己的一套缓存机制,就像mysql的innodb存储引擎,它有自己的缓存页,有自己的落盘机制,如果不使用directIO,这明显就会存在双重的cache,一个是OS设计的,一个是DB设计的,而通常,DB需要更加符合自己使用的cache机制,而非OS提供的通用化的缓存机制。
如何使用DirectIO
使用直接IO进行数据的写入
//d io
#include <fcntl.h>
#include <malloc.h>
#include <iostream>
#define _GNU_SOURCE //测试宏
void rawIO() {
int fd;
size_t length;
char *buf;
length = getpagesize() * 1024*16;
cout << "page size:" << getpagesize() << endl;
fd = open("/home/out.log", O_RDWR |

本文详细介绍了DirectIO的概念及其实现原理,探讨了DirectIO与缓存IO之间的区别,尤其是在数据库应用中的优势。通过具体示例展示了如何在C++中使用DirectIO,并对其性能进行了对比测试。

1万+

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



