带缓冲区的 iostream 的机制是什么?
What's the mechanism of iostreams with buffer?
首先,在 cplusplus.com 中,它说每个流对象都有关联的std :: streambuf
在C 底漆中,它说:
每个输出流管理一个缓冲区,它用来保存程序阅读和写入的数据。例如,执行以下代码
os << "please enter a value: ";
可以立即打印字符串,,或者操作系统可能会将数据存储在缓冲区中,以后要打印有几种条件导致缓冲区被冲洗掉 - 即将写入,即写入实际的输出设备或文件:该程序正常完成,使用操纵器(例如(endl等
在我的理解中,句子"操作系统可以将数据存储在缓冲区中(不在中上面的上下文意味着流对象和OS都使用自己的缓冲区,即过程地址空间中的一个,另一个在OS管理的内核空间中。
这是我的问题,
-
为什么每个进程/对象(例如
cout
(管理自己的缓冲区?为什么不出现系统调用并将数据直接提供给OS缓冲区?
此外OS立即将数据放入OS缓冲区中。
- 为什么每个过程/对象(例如COUT(管理自己的缓冲区?为什么不引起系统调用并将数据直接提供给OS缓冲区?
作为一个预先解答的一点,您始终可以重写流缓冲区以始终冲洗到系统OS调用以进行输出(或输入(。实际上,您的系统可能已经这样做 - 这仅取决于实现。该系统只允许在iostreams库的级别进行缓冲,但就我记得而言,不一定需要它。
对于缓冲,它并不总是由字节发送或读取数据的最有效的效率。在许多系统中的cout
和cin
这样的情况下,OS可以更好地处理,但是您可以调整iostreams来处理正在读取插座的输入和输出流(Internet Connections的I/O(。在插座中,您可以通过Internet将每个字符在单个软件包中写入单个软件包,但根据链接类型以及链接的繁忙程度,这可能会变得非常慢。当您读取插座时,可以将消息分配在数据包上,以便您需要缓冲输入,直到达到"临界质量"为止。有可能在操作系统级别进行缓冲的方法可以进行缓冲,但是如果我自己处理大部分缓冲(由于通常在整个运行时的标准偏差(,我至少可以获得更好的性能。因此,iostreams中的缓冲是管理输入和输出以优化性能的有用方法,当您尝试同时尝试从多个连接中兼顾I/O时,这尤其有所帮助。
但是您不能总是假设操作系统会做正确的事情。我记得一旦我们使用了此保险丝模块,该模块允许我们在多个计算机节点上具有分布式文件系统。在编写和阅读单个字符时,它有一个非常奇怪的问题。尽管读取或编写一长串单个字符的序列最多需要使用EXT4系统在普通硬盘上,但同一操作将花费数天在保险丝系统上(暂时忽略了为什么我们首先这样做(。通过调试,我们发现悬挂在I/O级别,并且阅读和写作单个角色加剧了此运行时问题。我们必须重写代码以缓冲我们的阅读和写入。我们能弄清的最好的是,Ext4上的操作系统进行了自己的缓冲,但是在阅读和写入硬盘时,该保险丝文件系统并没有进行类似的缓冲。
在任何情况下,OS都可以自行缓冲,但是在许多情况下,此缓冲不存在或最小。iostream端缓冲可以帮助您的性能。
- 此外,"冲洗"一词是在对象缓冲区或操作系统缓冲区上作用吗?我猜我猜潮红的动作实际上引起了系统调用,并告诉OS立即将数据放入OS缓冲区中。
我相信,大多数文本都会从C 中的标准I/O流来谈论"冲洗"。您的程序可能无法直接控制OS如何处理其I/O。但是总的来说,我认为OS的I/O和您的程序对于大多数系统都将同步。
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 使用共享指针时,从共享指针本身释放内存的机制是什么
- C++20 中协程的机制是什么
- 使用C 17处理Unicode的有效,符合标准的机制是什么
- 带缓冲区的 iostream 的机制是什么?
- C++中"机械臂"的机制是什么?
- 与Java的InputMismatchException和IOException Handling等效的C++异常处理机制是什么
- QTimer对象是否在单独的线程中运行?它的机制是什么
- QNetworkAccessManager中的并行机制是什么
- 当我从赋值操作符返回值时,首先,调用复制构造函数的机制和基础是什么?