(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 目录下的文件,其实是内核变量的接口。









请登录后发表评论
注册
停留在世界边缘,与之惜别