4
我對磁盤文件的內核I/O緩存有個疑問。 正如我所知,在調用write()或read()時,內核空間中有一個用於磁盤文件I/O操作的緩衝區緩存。 我的問題是,這個I/O緩衝只適用於磁盤文件,還是它也適用於終端,FIFO,管道和套接字?Linux內核中磁盤文件的I/O緩衝區緩存
謝謝
我對磁盤文件的內核I/O緩存有個疑問。 正如我所知,在調用write()或read()時,內核空間中有一個用於磁盤文件I/O操作的緩衝區緩存。 我的問題是,這個I/O緩衝只適用於磁盤文件,還是它也適用於終端,FIFO,管道和套接字?Linux內核中磁盤文件的I/O緩衝區緩存
謝謝
它被稱爲「頁面緩存」。它由由文件支持的頁面和由swap支持的「匿名頁面」組成。這是Linux虛擬內存(VM)子系統的一部分。
它不用於TTY,FIFO,管道或套接字。每個人都會根據自己的性質提供自己的緩衝;例如,寫入管道的數據在再次讀回之前必須駐留在某處。但是這種緩衝與虛擬機子系統無關。
[更新]
注意,該緩衝是完全獨立於由(例如)提供fwrite()
用戶空間的緩衝。 (我之前看到你問過類似的問題,目前還不清楚你是否理解這個區別。)
感謝你的回答,Nemo。 據我所知,由於這個頁面緩存,「正常」read()/ write()到磁盤文件不會被阻塞。 那麼是因爲不同的緩衝機制,使讀/寫管道,FIFO,套接字,TTY可能會阻止? – kai
是的,我知道它們的區別~~ – kai
如果數據不可用,'read'總是可以被阻塞;包括讀取其內容尚未存在於頁面緩存中的文件。如果有太多髒頁面(由'vm.dirty_ratio'確定),則將'write'寫入文件_may_塊。寫入管道不會阻塞,除非管道緩衝區已滿。同樣,寫入套接字不會阻塞,除非套接字緩衝區已滿。也許你應該問一個問題,說明你實際上想要做什麼? – Nemo