【问题标题】:UNIX buffered vs unbuffered I/OUNIX 缓冲与非缓冲 I/O
【发布时间】:2012-01-14 14:16:03
【问题描述】:

无缓冲 I/O 和标准 I/O 有什么区别?我知道使用 read()、write()、close() 是无缓冲的 IO。 Printf 和 gets 是缓冲的 IO。我也知道最好将缓冲 IO 用于大事务。我只是不知道为什么。在这种情况下,“缓冲”一词是什么意思?

【问题讨论】:

  • 您的问题与此类似:stackoverflow.com/questions/1450551/…
  • 严格来说,在 Linux 上,除非启用了 O_DIRECT,否则 read 等都是 kernel 缓冲的。对于您的上下文,缓冲意味着 C 库维护一个内部数组,该数组在每次 I/O 函数调用后都不会刷新。相反,必须调用 fflush。同样,读取缓冲区可能会减少读取期间的每次调用挂起。
  • @moshbear:你能澄清一下 fflush 是做什么的吗?它是刷新 c 内部数组还是缓冲缓存?
  • 来自手册:对于输出流, fflush() 通过流的底层写入函数强制写入给定输出或更新流的所有用户空间缓冲数据。对于输入流,fflush() 会丢弃任何已从底层文件获取但尚未被应用程序使用的缓冲数据。

标签: unix io buffered


【解决方案1】:

无缓冲 I/O 只是意味着在读取或写入时不使用任何缓冲区。通常,当我们使用 read() 和 write() 等系统调用时,它们会逐个字符地读取和写入字符,并可能导致性能大幅下降。因此,对于大数据,通常首选高级读/写或简单的缓冲 I/O。缓冲只是意味着我们处理的不是单个字符而是一个字符块,这就是为什么有时它也称为块 I/O。通常在 Unix 中,当我们使用高级读/写函数时,它们会获取/存储给定块大小的数据并将它们放置在缓冲区缓存中,然后这些 I/O 函数从该缓冲区缓存中获取所需的数据量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2016-06-04
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多