第 10 章 · OS 实例

Linux 实操串起前九章的「进程 → 内存 → 文件」全链路。

10.1 Linux vs Windows 结构对比

LinuxWindows
内核类型宏内核 + 模块(LKM)混合内核(NT)
可执行格式ELFPE
文件系统ext4/xfs/btrfsNTFS/ReFS
权限模型POSIX(uid/gid/rwx)ACL/SID
一切皆文件是(/proc、/dev)部分(对象管理器)
线程/进程轻量进程(clone)线程为主
源码开放(GPL)闭源

共同点:都支持虚拟内存、多线程、日志文件系统、抢占式多任务;差异在内核组织、权限模型、文件抽象三处。

10.2 Linux 进程 / 文件命令实操

ps aux              # 查看进程(PID、状态、内存 RSS)
top                 # 实时查看 CPU/内存/进程
kill -9 1234        # 发 SIGKILL 信号终止进程
cat /proc/1234/maps # 查看进程的内存映射(五大段)
free -h             # 物理内存/交换区
df -h; du -sh dir   # 磁盘占用
ls -li              # -i 显示 inode 号
  • psSTAT 列对应第 2 章进程状态:R(运行)、S(等待)、Z(僵尸)、T(停止)。
  • /proc/<pid>/maps 能看到第 6 章说的各段与映射区。

10.3 进程内存布局

C 指针课程第 2 章画的「进程五大段」就是第 6 章内存管理的用户态视图:

#include <stdio.h>
#include <stdlib.h>
int  g = 1;               // Data 段
char *lit = "hello";      // lit 在栈,"hello" 在 .rodata
void f(void) {
    int local = 2;        // 栈帧局部变量 [rbp-offset]
    int *p = malloc(8);   // 堆
    printf("%p %p %p %p\n", &g, lit, &local, p);
}
  • &g(Data)、lit(.rodata)、&local(栈)、p(堆)分属四段,用 cat /proc/self/maps 或看地址大小即可验证。
  • C 指针的栈帧/悬空指针/栈溢出,OS 视角就是第 6 章「栈段向下生长 + 缺页/越界触发 SIGSEGV」;malloc 的堆是 OS 用 brk/mmap(第 1 章)从内核要来的。

C 指针的「进程内存布局」 = 操作系统的「虚拟内存 + 分段」的用户态投影。