2010-08-20 27 views
1

我这个代码打在Linux 2.6.16.46:使用aio_write(),但仍然看到数据通过缓存?

io.aio_fildes = open(name, O_CREAT | O_TRUNC | O_WRONLY | O_SYNC, 00300); 

io.aio_buf = buffer; 
io.aio_nbytes = size; 
io.aio_sigevent = sigev; 
io.aio_lio_opcode = LIO_WRITE; 

aio_write(&io); 

这应该使用缓冲区IO操作所指向的内存。尽管如此,我仍然看到脏页面的数量上升,好像我正在写入缓存。这是为什么?

在构建机器上,open()中没有O_DIRECT支持。但是由于我不使用write(),应该仍然是个问题吗?

我很确定目标上有直接的IO支持。

+0

因为aio的实现不如应有的好? 我不会发布这个答案,因为我对aio的了解很老,我没有检查过去几年是否改进了。五年前它只是一个API兼容性包装,但没有功能改进。 – Lothar 2010-08-20 16:47:46

+0

好。在2.6.27.19的目标机器上,至少内核支持直接IO。但它没有编译器。在构建机器上,open()不接受O_DIRECT。这是否意味着我有一个旧图书馆? – 2010-08-20 16:58:13

回答

1

想通了。直接/缓冲IO是一回事,同步/异步是另一回事。要使异步写入避免缓存,即使未使用write(),仍需要将O_DIRECT赋予open()调用。

起初可能会有编译器错误 - 仔细阅读man 2。

相关问题