几天前,一名使用C++的游戏开发者Malte Skarupke发表博客称在为Google的云游戏服务平台Google Stadia提供Linux游戏时遇到了问题,并表示问题显然来自Linux内核的调度程序,尤其是Linux内核的自旋锁(Spinlock)。
Malte在这篇批评Linux内核调度程序糟糕的文章中指出:“我发现大多数互斥锁的实现都非常好,而大多数自旋锁的实现都非常差,虽然Linux的调度程序还算可以,但远未达到理想状态。最受欢迎的替代方案MuQSS调度程序也还存在其他问题。另外,Windows调度程序的表现也非常好。”
对于Malte的这篇文章,Linus Torvalds也发表了自己的评论。在交流的过程中,变得慈祥的Linus虽然不同意文章的观点,但他的言语也不再那么激烈。通篇看下来,"Pure Garbage"应该是唯一一个比较符合Linus以前“暴躁”风格的词。
Linus Torvalds写道:“整篇文章似乎都是错误的,并且作者所测量的内容与他认为并声称的完全不同。首先,自旋锁只能是如果你实际上知道自己在使用它们时未安排时间才使用...基本上是在释放锁之前读取时间,然后在再次获取锁之后读取时间,并声称时间差是没有锁之后的时间。这简直是愚蠢和毫无意义且完全是错误的,纯属胡扯!”
Linus继续补充说:“那么,解决此问题的方法是什么?告诉系统你正在等待锁的地方使用锁,并在锁线程完成时告知你解锁线程,以便调度程序合理运行,而不是(随机)运行……再重复一次:除非你真正知道自己在做什么,否则不要在用户空间中使用自旋锁,并且要认识到能搞清楚自己在做什么的可能性基本上为零。”
有关更多有趣的技术细节,请参阅Linus的文章全文。
在另一篇文章中,Linus继续指出游戏开发者的锁从根本上是错误的。换句话说,从他的角度来看,Linux内核至少不应该背全部责任。但是,如在其他实例中所示,Linux内核的调度程序代码仍有改进的空间。更重要的是,Linus的回应不再像以前那样充满“对抗性”,他不同意开发者的观点,于是指出并一直在耐心解释那篇博文错误的地方
关键词: Linux