打印到终端会导致OOM(内存不足)吗?

6
  1. 打印到终端会如何影响内存使用?它是否会一直占用内存,直到内存耗尽?
  2. 在docker容器中呢?
  3. 操作系统如何处理终端输出的内存?
  4. 操作系统是否在特定时间点刷新终端?

如果您在不换行的情况下打印,并且控制台配置为仅在一个后显示某些内容,则最终会填充内部缓冲区,直到出现某种“问题”。 - Lothar
这取决于终端(内存不足是一个错误,但有些程序存在错误)。 - Thomas Dickey
这个(https://stackoverflow.com/questions/67560357/can-writing-to-tensorboard-cause-memory-ram-oom-issues-especially-in-pytorch)并不完全相关,但我对导致操作系统终止我的任务的OMM内存问题的不同来源很感兴趣。 - Charlie Parker
1个回答

3
当你调用printf来打印到终端时,标准库将使用行缓冲并等待换行符才写入输出。大小取决于实现(可能为8K)。参见:In C, what's the size of stdout buffer? 但是这种内存使用不会随时间增长。
当通过write系统调用写入时,缓冲区将通过pipepty进行复制,最终进入终端仿真器,然后在屏幕上显示。除了终端仿真器的scrollback缓冲区之外,它不会在此路径上积累任何内容。
大多数终端仿真器都会有滚动缓冲区的限制,默认为几千行。超过此限制后,旧行将被释放。一些终端仿真器提供了去除限制的选项,这意味着它可能会增长直到OOM(我相信在macOS上,Terminal应用程序实际上处理此事件以清除滚动缓冲区),并且终端仿真器可能会被OOM杀手杀死。从操作系统的角度来看,它与任何其他进程间通信没有区别。
容器只能影响管道的创建。仍然是进程调用printf,将结果缓冲区发送到终端仿真器进程,通过内核进行通信。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接