Reading Papers 10 - System Design
# Operating System Design and Implementation
# SOSP'09 - seL4
……
# SOSP'09 - Multikernel, Barrelfish
……
# OSDI'18 - Biscuit
用 Go 语言实现一个 POSIX-style 宏内核,与传统由 C 语言实现的内核相比,性能有 5~15% 的损失。
使用(在语言层面提供 GC 的)高级语言实现内核的好处是 well-known 的,但是高级语言特性也带来了问题:
语言提供的 GC 和 type safety 在改善内核实现正确性和安全性的同时也带来了性能上的损失。
语言的 runtime 提供的线程和同步机制使并发编程更简单,但是 runtime 的封装也隐藏了重要的机制,例如内存分配的实现细节,并且 runtime 的强制抽象可能会减少开发人员的实现选择。
处理 heap exhaustion :
利用保守的静态分析技术来预测每个系统调用的堆内存用量。在系统调用开始之前,如果估计剩余内存不足,则唤醒 killer thread 杀死占用内存过多的线程。在系统调用返回之后,用统计出的实际使用内存来 relax 先前的保守估计。
因为系统调用的数量有限,其中无法简单处理的循环数量有限,所以可以直接用人工注解来协助处理。
# OSDI'18 - Splitkernel, LegoOS (reading unfinished)
hardware disaggregation :对于数据中心当前所用的 monolithic server 架构的缺陷,提出将服务器分解为若干个互相独立的、通过网络互联的硬件资源,而不是传统地在每个机器上设置一整套各类硬件资源。
硬件资源利用率低,因为每个服务器必须搭载全套硬件资源。
硬件资源不能弹性规划:在服务器上增减硬件困难;硬件变更通常不得不购买新的服务器;新设计的硬件必须适配现有架构。
在 fault tolerance 上的不足,单个硬件资源的损坏会导致对应机器上整个服务器的崩溃。
传统的内核架构(包括 monolithic kernel 、microkernel 、exokernel 、multikernel 在内)都假定所有硬件资源都在本地机器上,直接基于这些架构将所有硬件资源的本地访问改为远程网络访问是不可行的,效率要低太多。
KEY Idea :内核应随硬件资源的分解一同被模块化分解。
针对 hardware disaggregation 的需求提出一种新的内核架构 splitkernel ,据此设计并实现了 LegoOS 。
LegoOS 将操作系统分解为若干个松耦合的 monitor ,在不同的机器上分别管理各自的硬件资源,仅在需要访问其它硬件资源时通过网络与其它 monitor 交互。
LegoOS 向用户暴露的是一组分布式的虚拟节点 vNode ,从用户的角度看就像是一组虚拟机,每个 vNode 都有唯一的 ID 和虚拟 IP 地址,以及自己的 storage mount point 。
- 每个 vNode 可以从多个节点获取硬件资源,并且为不同 vNode 分配的硬件资源之间是隔离的。具体的资源分配情况对用户是透明的。
LegoOS 兼容 Linux syscall & ABI ,运行在 Linux 上的分布式应用可以直接运行在 LegoOS 的一组 vNode 上。
- LegoOS 是 stateless 且资源分离的,然而许多 Linux syscall 都与系统状态相关,这些状态是存储在每个进程中的关于各个 Linux 子系统的信息,例如 open fds 。为抹平二者在设计上的差异,LogoOS 在每个 pComponent 的 monitor 上添加了一个适配层,存储 Linux 状态并将其翻译为 LegoOS 内部接口。
LegoOS 将处理器和存储系统分离,仅在处理器中保留 ExCache 作为最后一级缓存来提高性能,以及一小块专供 kernel 直接通过物理地址访问和使用的内存。这迫使处理器和 ExCache 完全使用虚拟内存地址,提高了处理器的运行速度(无需计算内存映射)。
- ExCache 由软硬件协同管理:软件负责处理 cache miss ,向 mComponent 发送网络请求获取数据,同时负责处理 cache full 和 cache line eviction ;硬件负责处理 cache hit ,从 Cache 中取出数据。
LegoOS Processor Component :
对每个新生的进程,LegoOS 使用某种全局策略为其选择一个 pComponent ;
对每个新生的线程,LegoOS 选择其对应进程所属的 pComponent ,将新线程分配给该 pComponent 上当前承载线程数最少的 core ,使其执行到最后,在通常情况下不进行 core scheduling 或 kernel preemption 。
线程直接 busy wait 网络请求,不需要中断机制,因为网络请求的处理速度足够快。
LegoOS Memory Component :
LegoOS 中每个进程的地址空间都会跨越多个 mComponent 以实现高效空间资源利用和高并行性。
LegoOS 中每个进程都有一个 home mComponent,负责最初的进程加载,以及接受和监督与虚拟内存空间管理相关的所有系统调用。
……
LegoOS Storage Component :