我一直认为在 Linux 上所有非 root 用户都会得到相同的待遇并且总是并行运行,内核并不关心谁的 X 会话当前处于活动状态。但现在 Linux 内核、Ubuntu 或 KDE 中似乎有某种新的“功能”,如果程序不在活动的 X 会话中,则可以暂停程序。
例子
登录
- 我以 Alice 身份登录,并决定切换到用户 Bob 并使用此菜单启动新的 KDE 会话
- Ctrl鲍勃的启动屏幕出现,我立即使用+ Alt+切换回爱丽丝F7。
- 我做了一些工作,几分钟后我用Ctrl+ Alt+切换回 Bob 的新会话F8。
- 我发现启动画面没有继续,会话也没有加载。现在它继续加载并在大约 10 秒内完成。
登出
与上面几乎相同:我启动注销并立即切换到另一个帐户,当我几分钟后回来时,注销尚未完成。
音乐
我开始以 Alice 的身份用 mpv 播放音乐。我切换到鲍勃的帐户。音乐玩得很好一开始,但大约 40 秒后它就停止了。我切换回 Alice 一秒钟,音乐继续播放,当我切换到 Bob 时,我又花了约 40 秒。 YouTube 似乎更早停止,大约 15 秒后。
问题
这一切都让我相信正在发生的事情会挂起不在活动 X 会话中的进程。
- 谁对此负责?
- 我怎样才能关闭它?
- 我可以将不应该暂停的程序列入白名单吗?
我正在使用基于 Ubuntu 16.04 LTS (Xenial Xerus) 的 KDE Neon 5 和 KDE 5.36.0。
答案1
谁对此负责?
不是Linux。不是Ubuntu。不是 X.Org。计划并未暂停。
程序本身就是罪魁祸首。自古以来,程序就能够知道它们当前是否正在显示某些内容,因为它们知道窗口系统何时要求它们重绘窗口。如果 X 会话未激活,则无需重绘。
随着时间的推移,程序(或 GUI 库,例如 KDE 库)在检测何时不需要其输出方面变得越来越聪明,以节省 CPU 周期(在电池供电的设备上,这意味着电池寿命)。
有时程序无法继续,因为它使用显卡作为处理器进行一些复杂的渲染。如果显卡正忙于显示另一个会话,则程序无法使用它。您会注意到这一点,因为如果另一个程序的窗口处于活动状态,此类程序也无法运行。
我怎样才能关闭它?
我可以将不应该暂停的程序列入白名单吗?
不幸的是,我不知道。