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

时间:2018-02-15 21:33:49

标签: terminal printf

  1. 打印到终端如何影响内存使用?它会不会在OOM之前一直吃掉记忆?
  2. 在docker容器中怎么样?
  3. 操作系统如何处理打印到终端的内存?
  4. 操作系统是否在某一点冲洗终端?

1 个答案:

答案 0 :(得分:2)

当您调用 printf 打印到终端时,标准库将使用行缓冲并等待换行符写入输出。大小将取决于实现(可能是 8K)。请参阅:In C, what's the size of stdout buffer? 。但是这种内存使用不会随着时间的推移而增长。

写入时(通过 write 系统调用),缓冲区将通过 pipes 和 ptys 复制到终端模拟器中,然后将其显示在屏幕上.除了终端模拟器的 scrollback 缓冲区外,它不会沿着这条路径在任何地方累积。

大多数终端模拟器都会有回滚缓冲区的限制,默认为几千行。在此限制之后,旧行可能会被解除分配。一些终端模拟器提供了删除限制的选项,这意味着它可能会增长到 OOM(我相信在 macOS 上,终端应用程序实际上会处理此事件以清除回滚缓冲区)并且终端模拟器可能会被 OOM 杀手杀死。从操作系统的角度来看,它与任何其他进程间通信没有什么不同。

容器可能只影响管道的创建。它仍然是调用 printf 的进程,通过内核将结果缓冲区发送到终端模拟器进程。