操作系统中的复杂性

2020-10-31 06:24:51

在过去的几年里,我一直在研究非常不同的操作系统。操作系统通常是极其复杂的野兽。我认为这种复杂性主要有三个驱动因素。令人惊讶的是,这两个都不需要与硬件打交道。

第一个是资源发现,即弄清楚操作系统实际运行的计算机是什么样子。在x86上,这涉及到解析无数的位域、表、执行固件提供的字节代码、探测各个功能等等。到目前为止,我所见过的最痛苦的例子是找出特定的PCI中断行路由到哪个中断。这是值得一试的帖子,但在此之前,请随时查看这一描述。(如果它关闭了,它也会被谷歌缓存。)。

第二个问题是资源管理。本质上,你如何分发并最终回收你发现的所有资源。对于某些工作负载来说,这里的性能很重要,因此在编写此代码时通常会考虑速度。

第三个原因是在编译时工作负载不明确。所以内核必须做最坏的打算。它必须准备好在转眼间启动几百个虚拟机或创建一千个TCP套接字,因为无法知道将要发生什么或实际需求是什么。

一个有趣的练习是签出用于创建VM的KVM代码。尝试按照代码在硬件中创建实际VM的位置。剧透:没有。这一切都是弄清楚平台可以做什么,然后设置一系列自旋锁、互斥锁、列表、数组、结构、…。

我不想特别针对KVM。我认为就Linux内核代码而言,这是相当不错的。操作系统内核代码主要是这样的:许多真正令人头晕目眩的平台发现和资源管理代码是为速度而编写的,假设最坏的情况下使用的是一种不能很好地进行解析、资源管理或并发的语言(以及其他方面)。

人们认为这一切都是理所当然的。但当我环顾四周时,我看到许多系统不需要这种复杂性,它只是一个安全和安保负担。以大多数家用电器类型的产品为例,例如AWI-Fi路由器。或者在云VM上运行一项服务的系统。你事先就知道一切了!

如果你读到这一点,你可能会问自己,我要说的是什么。如果你认为分离核心,那你是对的。我的粗略计划是再写几篇文章,充实在编译时完成所有复杂操作系统部分的想法,以及这如何在运行时产生一个令人难以置信的简单、安全和高效的系统。将有RISC-V、Haskell、DHall和Rust内容。