2010-08-20 23 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。

相關問題