模块机制

可加载模块的概念

微内核:只保留核心模块,易维护、低性能

内核许可声明

协议分类

image-20250628134458427

Page Cache

​ Page Cache 就是内核为了加速文件读写而在内存中保留的文件页。你每次 read/write 文件时,其实不是直接访问硬盘,而是在和 Page Cache 互动。

产生

调用

write(fd, buffer, len);

这个时候你只是拿着一个缓冲区(Userspace Page),把数据交给内核。

内核检查:

  • 文件在该 offset 对应的 page cache 是否存在?
  • 如果不存在 → 会触发缺页(page fault)并分配 page cache 页。
meian@ubuntu200406:~/work/MyProject/study$ sar -B 1
Linux 5.4.0-153-generic (ubuntu200406) 	11/13/2025 	_x86_64_	(8 CPU)

07:23:57 PM  pgpgin/s pgpgout/s   fault/s  majflt/s  pgfree/s pgscank/s pgscand/s pgsteal/s    %vmeff
07:23:58 PM      0.00      0.00      9.00      0.00     15.00      0.00      0.00      0.00      0.00
07:23:59 PM      0.00      0.00      8.00      0.00     16.00      0.00      0.00      0.00      0.00
07:24:00 PM      0.00      0.00     15.00      0.00     15.00      0.00      0.00      0.00      0.00
07:24:01 PM      0.00     40.00     33.00      0.00     28.00      0.00      0.00      0.00      0.00
07:24:02 PM      0.00      0.00     22.00      0.00     15.00      0.00      0.00      0.00      0.00
07:24:03 PM      0.00    404.00     11.00      0.00     15.00      0.00      0.00      0.00      0.00
07:24:04 PM      0.00      0.00     12.00      0.00     15.00      0.00      0.00      0.00      0.00
07:24:05 PM      0.00      0.00     16.00      0.00     15.00      0.00      0.00      0.00      0.00
07:24:06 PM      0.00     44.00    150.00      0.00    252.00      0.00      0.00      0.00      0.00
07:24:07 PM      0.00      0.00     25.00      0.00     15.00      0.00      0.00      0.00      0.00
  1. pgpgin/s Page cache 读入量(KB/s)

定义:从磁盘读入 page cache 的速率(KB/s)。

你的程序读磁盘 → 系统把数据读到 Page Cache → pgpgin/s 就会上升。

  1. pgpgout/s — Page cache 写出量(KB/s)

定义:把 page cache 写回磁盘的速率(KB/s)。

你的程序 write 文件 → 内核把 dirty page 刷到磁盘 → pgpgout/s 上升。

  1. fault/s — minor page faults(轻微缺页)

定义:轻微缺页次数(不需要读磁盘的 page fault)。

访问了一块不在进程页表里的内存,但数据已经在 RAM 中(比如 page cache),只是缺少映射。

  1. majflt/s — major page faults(严重缺页)

定义:必须从磁盘读数据才能满足的缺页。

内存里没有对应内容 → 必须读硬盘 → 最慢的那种 page fault。

  1. pgscank/s — kswapd 扫描的页数(后台扫描)

定义:kswapd(后台内存回收线程)扫描的页数量(per-second)。

系统检测到内存压力 → 内核后台回收线程试图找可以回收的内存。

  1. pgscand/s — direct reclaim 扫描的页数(应用线程主动扫描)

定义:应用进程在内存不足时,被迫参与内存回收所扫描的页数。

进程自己在扫描内存 → 内存已经很紧张 → 接近 OOM。

  1. pgsteal/s — 每秒成功回收的 page 数

定义:通过扫描找到并回收掉的 page 数量。

系统正在回收 page cache 或匿名页。