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

gun*_*nit 6 terminal printf

  1. 打印到终端如何影响内存使用?它会一直消耗内存直到 OOM 吗?
  2. 那么在 docker 容器中呢?
  3. 操作系统如何处理打印到终端的内存?
  4. 操作系统是否会在某个时刻刷新终端?

mka*_*alp 3

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

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

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

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