【问题标题】:Difference between buffered io and unbuffered io缓冲io和无缓冲io的区别
【发布时间】:2014-09-12 20:38:45
【问题描述】:

我有一个关于 C 语言 I/O 编程中的缓冲区的问题。
例如,总是说 fwrite 是缓冲 i/o,而 write 是非缓冲 i/o。我的理解是这里的“缓冲”在应用层,我认为在内核级别,它们都有一个缓冲区。从APUE,我看到:

UNIX 系统的传统实现具有缓冲区缓存或 大多数磁盘 I/O 通过的内核中的页面缓存。什么时候我们 将数据写入文件,数据通常由内核复制到 它的一个缓冲区并排队等待稍后写入磁盘。 这称为延迟写入。

我说的对吗?所以我做了一个实验:

 int main() {
    char *fname = "helloworld";
    char content[] = "abcdefg";
    int fd = open(fname, O_WRONLY | O_CREAT);
    int flag = fcntl(fd, F_GETFL);
    flag &= ~O_SYNC;
    fcntl(fd, F_SETFL, flag);
    write(fd, content, 3);
    sleep(100);
    return 0;
   }

我以为睡眠时应该没有输出,但事实恰恰相反。
是不是我误解了什么?

【问题讨论】:

    标签: c linux io buffer


    【解决方案1】:

    有多层缓冲。如果调用write,则不会发生应用层缓冲。如果您从另一个进程查看文件,您将看到数据,但这并不意味着它们已提交到磁盘,因为内核中发生了一层缓冲。由于内核正在处理来自其他进程的访问,因此它会将缓冲区中的数据报告给该其他进程。换句话说,从所有用户空间应用程序的角度来看,数据已经写入文件,但实际上并没有写入磁盘。

    【讨论】:

    • 非常感谢!我可以问另一个问题吗?我认为您是对的,我尝试在虚拟机上再次进行实验。代码是相同的,我在进程处于睡眠状态时关闭虚拟机。我认为内核缓冲区中的数据在断电时应该消失。但是当我再次开机时,数据仍会写入文件。在这种情况下,是否还有其他一些技术会对 I/O 产生影响? DMA 或其他东西可能在这里发挥作用吗?
    • sleep(100) 完全不相关。内核可能最多只会缓冲几毫秒的数据。当您关闭虚拟机时,它会刷新其缓冲区并同步到磁盘。
    猜你喜欢
    • 1970-01-01
    • 2010-11-29
    • 2011-07-11
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    相关资源
    最近更新 更多