diff -u:内核开发中的新内容
David Herrmann 想要禁用虚拟终端子系统,以便在不需要 VT 的内核上节省空间。但是,他仍然希望看到内核 oops 输出以进行调试。问题在于只有 VT 子系统会显示 oops 输出——而他刚刚禁用了它。
没问题。David 发布了一个补丁来实现 DRM-log,这是一个单独的控制台设备,它使用直接渲染管理器,并且可以接收内核 oops 输出。
在关于该补丁的讨论过程中,Alan Cox 提到 David 的代码中似乎没有任何特别针对 DRM 的东西。它很容易存在于内核的更通用层。尽管 David 同意这一点,但他表示 DRM 团队更愿意接受他的补丁,并且“我已经花了很多时间试图让核心维护者关注简单的修复,我真的不想浪费时间每 5 天 ping 一次功能补丁以获得任何关注。如果 DRM 之外的其他人想使用它,我很乐意讨论任何代码共享。在此之前,我想把它放在这里,因为人们愿意通过他们的树来接受它。”
这是一个相当令人惊讶的声明——有点像对现有内核补丁提交流程的指责。关于这个特定点没有进一步的讨论,但我认为这会让一些人思考。
当前线程的其余部分集中在关于 oops 输出的一些技术细节上,尤其是字体大小。David 的代码逐像素显示 oops 输出,实际上是定义了自己的字体。但是对于极高分辨率的显示器,例如 Apple 的 Retina 显示屏,正如 Bruno Prémont 指出的那样,这可能会导致 oops 输出太小以至于用户看不到。
David 对此的回答是实现整数缩放。他的字体可以是默认字体的任意整数倍大小。Bruno 似乎觉得这样可以。
Eugene Shatokhin 发布了一些代码,以使用 Google 的 ThreadSanitizer。ThreadSanitizer 检测到一种特定的竞争条件,当一个线程尝试写入一个变量时,而另一个线程尝试读取或写入同一个变量时,就会发生这种情况。
Eugene 将他自己的代码称为 Kernel Strider。它收集关于内存访问、函数调用和其他事物的统计信息,并将它们发送给 Thread Sanitizer 进行分析。Eugene 还发布了一个链接,指向一个页面,描述了 Kernel Strider 在 3.10.x 内核系列中发现的几个竞争条件。
Waiman Long 发布了一些代码,实现了 qspinlock,这是一种新型的自旋锁,似乎可以提高在非常大的多处理器系统上的速度。速度提高背后的想法是,CPU 在自旋等待锁时会禁用抢占,因此它可以节省原本可能用于将循环线程迁移到其他 CPU 的时间。
这种改进的最大问题在于它非常依赖上下文。对于一个用户来说更快的速度,对于另一个用户来说可能会更慢,这取决于用户特定的常用负载。传统上,一直没有干净的方法来解决这个问题,因为实际上没有任何“标准”负载可以用来测试内核。开发人员只能凭经验行事。
但是,他们凭经验做得还不错,最终像新的自旋锁实现这样的东西确实会得到充分的测试,以确定它们是否会带来真正的改进。正如 Waiman 在邮件列表中所说,Waiman 情况的问题在于,qspinlock 实现在只有少量 CPU 的系统上实际上比现有的替代方案更慢——换句话说,对于任何在家中使用 Linux 的人来说。
然而,正如 George Spelvin 指出的那样,最常见的情况是自旋锁甚至一次都不自旋,而只是请求并接收所讨论的资源。在这种情况下,qspinlock 似乎与替代方案一样快。
是否使用 qspinlock——Rik van Riel 知道他的答案,并为 Waiman 的补丁发出了他的“Signed-Off-By”。它的优点无疑将继续被测试和争论。但是内核中有很多很多的锁定实现。我相信这个实现会在某个地方被使用,即使它不会在所有地方都被使用。
Yuyang Du 最近建议将 Linux 调度器 分成两个独立的子系统:一个执行 CPU 之间的负载均衡,另一个实际上在每个 CPU 上调度进程。
目标是远大的。由于调度器执行这两项任务,它变得非常复杂。通过将其分成这两部分,可能会有可能为其中一半编写替代系统,而不会搞乱另一半。
但实际上,并没有。这个想法几乎遭到了普遍拒绝。Peter Zijlstra 说,“这永远不会发生。”Morten Rasmussen 说,这两部分无法按照 Yuyang 想要的方式分开——它们是密不可分的。
不过,你永远不知道。曾几何时,有人说 Linux 永远不会支持 i386 以外的任何架构。现在它可以在任何包含硅的设备上运行,并且无疑正在努力将其移植到人脑。也许调度也可以分成两个独立的半部分。