我尝试通过 htop 测量内存和 CPU 使用率来比较这两种运行多个 shell/进程的方法。
有人可以解释一下每种方法的功能有何不同,或者是否存在任何不同?
编辑:
据我目前了解,tmux/screen 和其他多路复用器是虚拟会话,即原始会话内的多个虚拟会话。这与在终端中打开新选项卡实际上是在创建新会话形成对比。
我仍然不确定一种方法是否比另一种方法具有性能优势;也不确定所涉及的底层机制。
同时,请随意贡献有关该主题的更多详细知识!
以下链接帮助我理解了基本区别:
答案1
最大的区别在于,您可以从其他终端(无论是终端仿真器、VT、SSH 会话,甚至是真正的串行终端)重新连接到您的 screen 或 tmux 会话,但无法使用终端仿真器中的选项卡执行此操作。这听起来可能很简单,但它带来了使用 screen 或 tmux 的最大优势之一,尤其是在您处理远程系统时:它可以在您当前登录会话的持续时间之外继续存在,这在很多方面都非常有用。
不过,还存在其他一些差异:
- 使用 screen 或 tmux 意味着每个 screen 或 tmux 会话(但不是每个窗口/选项卡)始终只有一个额外进程。根据您使用的终端仿真器,您可能没有额外进程,或者您可能有多个额外进程。
- 使用屏幕或 tmux 可以为您提供大多数终端仿真器所没有的一些额外功能,例如拆分窗口和在选项卡中的应用程序上发送 BREAK 的功能。
- 用于切换窗口/选项卡的热键有所不同(尽管两者通常都可以很容易地重新配置)。
- 您可以从任何终端会话中使用屏幕和 tmux,但只能在使用终端仿真器时使用选项卡。
- Screen(可能还有 tmux)提供了终端锁定功能。本质上,它相当于您在大多数桌面上看到的屏幕锁。
在这两种情况下,每个窗口/选项卡最终都有一个关联的伪终端(通常缩写为 PTY)。这里真正的区别在于实际控制输入到哪个伪终端以及从哪个伪终端显示输出的是什么。伪终端的确切工作机制有点复杂,但在网上的多个地方都有很好的记录。基本思想是它为进程提供了一种假装成实际硬件终端的方法,以便它可以运行另一个需要与终端通信的进程。
从系统资源角度来看,这两个选项实际上并没有那么高效,而从用户体验角度来看哪个更高效,很大程度上取决于用户自己(例如,屏幕对我来说更高效,因为我习惯了所有默认的键绑定)。
答案2
这两种软件实际上都使用相同类型的伪tty,并且都以相同的方式初始化环境。
主要区别在于多路复用器就像一个“代理”——它们充当内部程序的终端仿真器,但充当主终端仿真器的常规程序(客户端)。
这意味着每个字符或控制代码在经过各个层时都会被解释两次。tmux 和 gnome-terminal 都保持自己的状态;它们对于屏幕缓冲区应该是什么样子有自己的想法(有时可能会不同步)。
这也意味着主缓冲区和备用缓冲区的 RAM 需求大约是原来的两倍。回滚也可能重复,尽管这种情况很少见(外部终端不会更新回滚,因为 tmux 已将其切换到“备用缓冲区”)。