Linux 控制台输出限制和长期稳定性

Linux 控制台输出限制和长期稳定性

一个困扰我一段时间的问题:

假设我们有一个在控制台中执行的无泄漏且制作精良的程序,并且该程序定期输出一些信息。

控制台是否能够无限期地接收和显示新输出?这意味着如果我将这样的设置保留几天、几周甚至几年,控制台进程不会慢慢消耗所有内存,或者在 2^32 行之后出现行数溢出之类的情况?

答案1

控制台“只是”另一个程序。该程序将使用缓冲区来接收其他程序的输出并将其推送到显示器或其他地方。

这些缓冲区很少是无限的(在使用机器地址空间中所有可用内存的意义上),但通常大小适合显示器,或者可以配置为增长到用户想要的大小。

对于运行在纯文本机器上的控制台,没有鼠标或其他上下滚动的方法,您可能不关心缓冲的字符多于屏幕上显示的字符。当新行数据进入时,您只需丢弃旧行。因此,缓冲区的大小是固定的,可能为千字节而不是千兆字节的数量级。

对于具有图形显示、窗口系统和使用鼠标或其他合理方式滚动的方法的系统,您可以轻松地开始回顾数据。保留控制台的整个过去的历史记录是没有意义的,特别是对于长时间正常运行的情况,因为正如您所说,它需要一些不可知数量的 RAM。它可能需要几个字节,也可能需要无限数量的字节。那么限制它是有意义的。通常,每个控制台都会这样做。它们会选择一个合理的限制作为默认值,并且每当即将达到限制时,它们就会删除最旧的行以释放空间。

通过设置这样的限制,它们还可以减少控制台开销。要使缓冲区正常工作,您要么在删除内容时不断将缓冲区中的内容向下移动,每次都使用内存带宽来创建新副本,要么使用滚动缓冲区和指向下一个字符写入位置的指针,到达末尾时重置回 0。

他们可以可以写成具有无限大的缓冲区,但没有理由这样做,而且有很多理由不这样做。最好选择一个对大多数用户来说“足够大”的默认限制,让其他用户在需要时更改它。

不存在稳定性问题,因为一个控制台不可能使用所有的地址空间。

答案2

该过程的输出将发送到标准输入 (stdin)安慰。请注意这些词的用法:stdin 和控制台是两个不同的东西。控制台是一个具有 stdin 的进程。输入到这里的所有内容都会被放入由控制台管理的缓冲区中并显示在屏幕上。如果缓冲区已满,则前几行将被丢弃(环形缓冲区)。

相关内容