簡體   English   中英

磁盤I / O的內核緩沖區緩存何時為空?

[英]When is the kernel buffer cache empty for Disk I/O?

內核緩沖區緩存何時為空? 這似乎不是LINE緩沖。 如果我寫一個沒有換行符的字符串,它會立即輸出到該文件。

另外,套接字文件的輸入和輸出緩沖區是否也像磁盤I / O一樣使用內核緩沖區緩存? 此外,每個打開文件(fd)是否存在用於read()和write()的內核空間的輸入和輸出緩沖區?

#include <stdio.h>
#include <string.h>
#include <sys/fcntl.h>
#include <unistd.h>

int main()
{
    int fd = open("text", O_RDWR | O_CREAT);

    write(fd, "message", strlen("message"));

    // I can check the string in the file without fsync(fd).
    sleep(30);

    close(fd);
    return 0;
}

何時繞過頁面緩存?

如果使用直接I / O,則應繞過頁面緩存

  • 用O_DIRECT標志打開
  • 滿足某些偏移/地址對齊約束
  • 沒有執行擴展寫入

有關更多信息,請參閱此鏈接

(我假設Linux的答案如下)

內核緩沖區緩存何時為空?

你需要更多的上下文來解決這個問題。 另外,當您在文件系統中創建文件時,我將引用用作頁面緩存的內核緩存,請參閱“緩沖區緩存與頁面緩存之間的主要區別是什么?” quora對差異的質疑。 例如,一個寫入可以在內核頁面緩存中,但沒有成為執行磁盤的方式(即臟),或者它可以在頁面緩存和磁盤上(即它已寫出但內核正在選擇保留)在RAM中)。 你的意思是“干凈”或者你的意思是“完全從頁面緩存中丟棄”? 或者您的意思是“何時對同一文件上的其他程序可以看到I / O”?

這似乎不是LINE緩沖

C庫級別在流上完成的I / O (可以是行緩沖)和在文件描述符上完成的低級I / O之間存在差異。 您的示例是使用文件描述符,因此永遠不會有行緩沖 此外,C庫緩沖與內核緩沖正交。

套接字文件的輸入和輸出緩沖區是否也像磁盤I / O一樣使用內核緩沖區緩存?

套接字不使用頁面緩存,因為它們不是塊或文件支持的。 但是, 在內核中使用sk_buff緩沖套接字I / O.

此外,每個打開文件(fd)是否存在用於read()和write()的內核空間的輸入和輸出緩沖區?

對不起,我不明白這個問題。 頁面緩存是為文件/塊設備共享的,因此同一文件的多個文件描述符將由頁面緩存中的相同條目提供服務(假設它們請求相同的偏移)。

ETOOMANYQUESTIONS !@andoryu請你能為每個帖子限制一個問題嗎?對於那些試圖回答的人來說很難。謝謝!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM