何时磁盘I / O的内核缓冲区高速缓存为空?

时间:2019-06-12 04:48:37

标签: c linux io

何时内核缓冲区高速缓存为空?这似乎不是LINE Buffering。如果我写()没有换行符的字符串,它将立即输出到文件中。

此外,套接字文件的输入和输出缓冲区还使用磁盘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;
}

2 个答案:

答案 0 :(得分:0)

  

何时何时跳过页面缓存?

页面缓存应使用直接I / O绕过,前提是

  • 以O_DIRECT标志打开
  • 满足某些偏移量/地址对齐约束
  • 不执行扩展写入

有关更多信息,请参见this link

答案 1 :(得分:0)

(我以Linux为以下答案)

  

何时内核缓冲区高速缓存为空?

您需要更多背景信息才能对此负责。另外,由于您似乎在文件系统中创建文件,因此我将内核高速缓存用作页面高速缓存,有关差异,请参见"What is the major difference between the buffer cache and the page cache?" quora问题。例如,写操作可以位于内核页面缓存中,但尚未完成磁盘处理(即脏),也可以同时存在于页面缓存和磁盘中(即,已写出但内核选择保留)在RAM上)。您的意思是“干净”还是“完全从页面缓存中丢弃”?还是您的意思是“什么时候对同一文件上的其他程序可见的I / O”?

  

这似乎不是LINE缓冲

C库级别中,I/O done on streams(可以行缓冲)和low-level I/O done on file descriptors之间是有区别的。您的示例使用文件描述符,因此将never be line buffering。此外,C库缓冲与内核缓冲正交。

  

套接字文件的输入和输出缓冲区是否也使用内核缓冲区高速缓存(如磁盘I / O)?

套接字不使用页面缓存,因为它们不受阻止或不支持文件。但是,socket I/O IS buffered using sk_buff in the kernel

  

此外,每个打开的文件(fd)都存在用于read()和write()的内核空间的输入和输出缓冲区吗?

对不起,我不明白这个问题。页面缓存是为文件/块设备共享的,因此同一文件的多个文件描述符将由页面缓存中的相同条目提供服务(假设它们要求相同的偏移量)。

({ETOOMANYQUESTIONS!@andoryu,请问每个帖子可以限制一个问题吗?对于试图回答否则的人来说很难。谢谢!)