带缓冲区的 iostream 的机制是什么?

What's the mechanism of iostreams with buffer?

本文关键字:是什么 机制 iostream 缓冲区      更新时间:2023-10-16

首先,在 cplusplus.com 中,它说每个流对象都有关联的std :: streambuf
在C 底漆中,它说:

  1. 每个输出流管理一个缓冲区,它用来保存程序阅读和写入的数据。例如,执行以下代码
    os << "please enter a value: ";
    可以立即打印字符串,,或者操作系统可能会将数据存储在缓冲区中,以后要打印

  2. 有几种条件导致缓冲区被冲洗掉 - 即将写入,即写入实际的输出设备或文件:该程序正常完成,使用操纵器(例如(endl等

在我的理解中,句子"操作系统可以将数据存储在缓冲区中(不在中上面的上下文意味着流对象和OS都使用自己的缓冲区,即过程地址空间中的一个,另一个在OS管理的内核空间中。

这是我的问题,

  1. 为什么每个进程/对象(例如cout(管理自己的缓冲区?为什么不出现系统调用并将数据直接提供给OS缓冲区?

  2. 此外OS立即将数据放入OS缓冲区中。
  1. 为什么每个过程/对象(例如COUT(管理自己的缓冲区?为什么不引起系统调用并将数据直接提供给OS缓冲区?

作为一个预先解答的一点,您始终可以重写流缓冲区以始终冲洗到系统OS调用以进行输出(或输入(。实际上,您的系统可能已经这样做 - 这仅取决于实现。该系统只允许在iostreams库的级别进行缓冲,但就我记得而言,不一定需要它。

对于缓冲,它并不总是由字节发送或读取数据的最有效的效率。在许多系统中的coutcin这样的情况下,OS可以更好地处理,但是您可以调整iostreams来处理正在读取插座的输入和输出流(Internet Connections的I/O(。在插座中,您可以通过Internet将每个字符在单个软件包中写入单个软件包,但根据链接类型以及链接的繁忙程度,这可能会变得非常慢。当您读取插座时,可以将消息分配在数据包上,以便您需要缓冲输入,直到达到"临界质量"为止。有可能在操作系统级别进行缓冲的方法可以进行缓冲,但是如果我自己处理大部分缓冲(由于通常在整个运行时的标准偏差(,我至少可以获得更好的性能。因此,iostreams中的缓冲是管理输入和输出以优化性能的有用方法,当您尝试同时尝试从多个连接中兼顾I/O时,这尤其有所帮助。

但是您不能总是假设操作系统会做正确的事情。我记得一旦我们使用了此保险丝模块,该模块允许我们在多个计算机节点上具有分布式文件系统。在编写和阅读单个字符时,它有一个非常奇怪的问题。尽管读取或编写一长串单个字符的序列最多需要使用EXT4系统在普通硬盘上,但同一操作将花费数天在保险丝系统上(暂时忽略了为什么我们首先这样做(。通过调试,我们发现悬挂在I/O级别,并且阅读和写作单个角色加剧了此运行时问题。我们必须重写代码以缓冲我们的阅读和写入。我们能弄清的最好的是,Ext4上的操作系统进行了自己的缓冲,但是在阅读和写入硬盘时,该保险丝文件系统并没有进行类似的缓冲。

在任何情况下,OS都可以自行缓冲,但是在许多情况下,此缓冲不存在或最小。iostream端缓冲可以帮助您的性能。

  1. 此外,"冲洗"一词是在对象缓冲区或操作系统缓冲区上作用吗?我猜我猜潮红的动作实际上引起了系统调用,并告诉OS立即将数据放入OS缓冲区中。

我相信,大多数文本都会从C 中的标准I/O流来谈论"冲洗"。您的程序可能无法直接控制OS如何处理其I/O。但是总的来说,我认为OS的I/O和您的程序对于大多数系统都将同步。