【问题标题】:Why do unbuffered read()/write() operations use buffer cache?为什么无缓冲的 read()/write() 操作使用缓冲区缓存?
【发布时间】:2016-07-10 23:08:48
【问题描述】:

基本上在 UNIX 上,read()write() 函数是无缓冲 I/O,

还有Standard I/O,也就是缓冲I/O。

但是,read()write() 函数使用 buffer cache,它在进行真正的 I/O(I/O 到真实设备)之前位于内核中,而真正的 I/O 使用 em>缓冲缓存。它正在使用缓冲区。

我听说无缓冲 I/O 意味着 I/O 逐个字符地发生在真实设备上。

那么,为什么read()write() 函数是无缓冲I/O,即使它使用缓冲缓存

【问题讨论】:

  • SUSv4 没有指定 readwrite 必须是无缓冲的:read, write
  • 您从哪里得知read()write() 是无缓冲的?
  • 另外,sync 调用 (sync) 的存在是有原因的。
  • 这本书unix环境中的高级编程显示标题为'unbuffered i/o'
  • @A.Cho 这只意味着read()write() 没有必要缓冲。至少在 Linux 中,除非指定了 O_DIRECT,否则默认情况下它们会被缓冲;我无法与 BSD 或其他 Unices 交谈。

标签: c unix io


【解决方案1】:

基本上,这里的“缓冲”一词的意思是“进出内核时存储数据的地方”,即为了避免对每个 I/O 调用进行一次系统调用,缓冲函数在两者之间使用一个缓冲区。

内核对数据的处理不是标准库可以做的。

可以在标准库级别(即fread() 和朋友)对底层文件描述符上的read()/write() 调用进行读/写调用的 1:1 映射;缓冲这个词告诉你这不是你可以期待的。

【讨论】:

    【解决方案2】:

    手册中的“(Un)buffered”是指用户空间缓冲。内核空间缓冲取决于实现,通常大多数设备都是缓冲的(磁盘、套接字、USB 等),但硬件端口 (GPIO) 除外。

    【讨论】:

      猜你喜欢
      • 2021-05-02
      • 1970-01-01
      • 2018-10-03
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多