(1)“一切皆文件” 和 虚拟文件系统 (VFS)。

习惯 Windows 的都知道,文件是文件,注册表是注册表,网络连接是网络连接,硬件设备是硬件设备。

但 Linux 内核用一层抽象,直接抹平这些资源的差异。一切皆文件!

本质是:统一的接口。

Linux 为实现一切皆文件,引入VFS (Virtual File System)。VFS 是一个内核软件层,介于用户程序和具体文件系统之间。VFS 比较像面向对象编程的多态。

(2)伙伴系统 和 SLAB/SLUB 分配器。
Linux 的伙伴系统解决外部碎片,SLAB/SLUB 解决内部碎片。

伙伴系统直接管理物理内存页(4KB)。任务是分配连续的页框。

SLAB/SLUB 就是专门针对小对象的 对象池 技术。

SLAB 分配器有三个层级:Cache、Slab、Object。

每个 Cache 维护三个链表,对应 Slab 的三种状态:Full、Partial、Empty。

(3)完全公平调度器(CFS)。

在 2.6.23 引入 CFS。理想的多任务处理器:可以无限细分的 CPU。N 个进程,每个进程应该在任何时刻都是获得 1/N 的 CPU 处理能力。

CFS 引入一个全新的概念:vruntime。即 进程已经在 CPU 上运行的“虚拟”时间。
调度准则只有一条:谁的 vruntime 最小,就让谁运行。CFS 不再用数组,而是用一棵按 vruntime 排序的时间序红黑树来组织所有等待运行的进程。

(4)RCU (Read-Copy-Update) 锁机制。

RCU (Read-Copy-Update) 主要是解决 读写锁 在多核 CPU 下的性能瓶颈。

RCU 让读者完全没有任何同步开销。不拿锁,没有原子操作,甚至没有内存屏障。

读写锁最大的难题是旧的数据什么时候能删?RCU 加入了 延迟释放 和 宽限期。

(5)eBPF。

eBPF (Extended Berkeley Packet Filter) 是 Linux 内核过去十年最有革命性的技术,没有之一。
eBPF 在不修改内核源码、不重启机器、安全的前提下,让用户在内核运行自定义的代码。

eBPF 本质是一个运行在 Linux 内核的寄存器虚拟机。

eBPF 程序运行在内核里,用户程序运行在用户态,怎么通信?

用 Maps。Maps 是内核通用的键值对存储结构。eBPF 程序不能随意调用内核函数(那样不安全)。内核有白名单函数,叫 Helper Functions。

(6)namespace 和 cgroups。

Namespace 的本质是欺骗。通过修改进程的视觉,让进程以为自己独占整个操作系统。

Cgroups 是 Linux 内核提供的一种机制,可以把一组进程组织成层级结构,并对这个层级树上的节点应用资源限制。
Docker 容器只是一个普通的进程。只是这个进程被Namespace隔离,看不到其他进程,看不到真实网络。又被Cgroups限制住,只能用指定的 CPU 和内存。再配合OverlayFS(分层文件系统)换一个独立的根目录。

(7)统一设备模型 和 sysfs。

Linux 设备模型是把硬件管理抽象成三个实体:Bus (总线)、Device (设备)、Driver (驱动)。

总线是 CPU 和设备之间通信的通道。内核的总线也是一个容器。维护两个链表:设备链表和驱动链表。
sysfs 是一个基于内存的虚拟文件系统,挂载在 /sys 目录下。
sysfs 不存文件,是内核数据结构的可视化窗口。
sysfs 目录下的文件,其实是内核变量的接口。

【瓜分奖池】Linux 内核7个比较牛的设计! 第5张插图
【瓜分奖池】Linux 内核7个比较牛的设计! 第6张插图
【瓜分奖池】Linux 内核7个比较牛的设计! 第7张插图
【瓜分奖池】Linux 内核7个比较牛的设计! 第8张插图
【瓜分奖池】Linux 内核7个比较牛的设计! 第9张插图
【瓜分奖池】Linux 内核7个比较牛的设计! 第10张插图
【瓜分奖池】Linux 内核7个比较牛的设计! 第11张插图
【瓜分奖池】Linux 内核7个比较牛的设计! 第12张插图
【瓜分奖池】Linux 内核7个比较牛的设计! 第13张插图