欢迎光临
我们一直在努力

《性能之巅》第三章 “操作系统” 读书笔记

本章作为全书的理论基石,系统性地阐述了操作系统与内核的核心概念,为后续的性能分析工作提供了必要的知识框架。作者Brendan Gregg强调,理解操作系统行为(如系统调用执行、CPU调度、内存管理、文件系统I/O)对于系统性能分析至关重要。

一、核心概念与背景

1. 内核(Kernel)

内核是操作系统基于硬件的第一层软件扩展,扮演着硬件设备与应用软件之间的“传令官”和“翻译官”角色。它将磁盘、CPU、内存等硬件操作指令封装成用户可调用的系统接口。频繁的I/O操作(如磁盘读写、网络交互)主要在内核中进行,而计算密集型负载通常在用户态运行。

2. 内核态与用户态

这是通过CPU的特权环(Privilege Rings)控制的,通常分为0到3级,权限依次降低,实际主要使用0级(内核态)和3级(用户态)。用户程序运行在用户态,当需要执行特权操作(如写磁盘)时,必须通过系统调用触发CPU切换到内核态,这涉及上下文切换:保存用户态现场、切换至内核态执行、再切换回用户态并恢复现场。频繁的上下文切换会增加CPU开销,因此I/O密集型业务需同时关注磁盘与CPU性能。相应地,内存也区分为用户空间和内核空间,仅内核态有权操作内核空间内存。

3. 系统调用(System Calls)

这是用户程序请求内核执行特权例程的接口。UNIX设计理念倡导系统调用数量应尽可能少,以保持内核简洁,更复杂的接口应构建在用户空间。常用系统调用包括:

  • 文件操作类:read(), write(), open(), close(), stat()。
  • 进程管理类:fork(), exec()。
  • 网络通信类:connect(), accept()。
  • 其他功能类:
    • ioctl(2):用于设备I/O操作,功能取决于请求码,在Linux中几乎所有要素(网络套接字、文件等)都被视为文件并分配文件描述符(fd)。
    • mmap(2):将可执行文件、库及内存映射文件映射到进程地址空间,有时用于替代基于brk()的malloc()以减少系统调用、提升性能。
    • futex(2):处理用户空间的锁。

4. 中断(Interrupts)

中断是向处理器发出的信号,用于处理高优先级事件,会中断处理器当前执行。中断分为:

  • 异步中断(硬件中断):如磁盘I/O完成、网络数据包到达、键盘输入等。
  • 同步中断(软件中断):包括自陷(主动调用内核)、异常(如除零错误)、故障(如内存缺页)。
    中断由中断服务例程(ISR)处理,设计要点是运行尽可能快以减少对活动线程的影响。若中断处理工作多且可能阻塞,最好使用中断线程处理。Linux设备驱动常分“上半部”(快速处理中断)和“下半部”(在禁止中断后处理,可作为tasklet或工作队列)。

二、进程与内存管理

1. 进程(Process)

进程是执行用户级程序的环境,包含内存地址空间、文件描述符、线程栈和寄存器等。每个进程由唯一的进程ID(PID)标识,第一个进程是init(PID为1)。

  • 进程创建:通常通过fork()或clone()创建副本,再调用exec()执行新程序。fork()采用写时拷贝(Copy-On-Write, COW)策略提升性能,即添加对原有地址空间的引用,仅当进程修改内存时才建立独立副本。
  • 进程生命周期:包括创建、空闲(idle)、就绪(ready-to-run)、运行(on-proc)、睡眠(sleep,因I/O阻塞)、僵尸(zombie)等状态。
  • 进程环境:分为用户地址空间(含可执行段、库、堆等)和内核上下文(含PID、文件描述符等元数据)。

2. 虚拟内存与内存管理

虚拟内存是主存的抽象,为每个进程提供近乎无穷且私有的地址空间,支持多任务处理与主存超额使用。它并非真实内存,操作系统仅在内存首次被写入时才将虚拟内存映射到真实内存。
内存管理的目标是将最活跃的数据保留在主存中,主要方式有:

  • 换页(Paging):移动小内存单元(如4KB的页),是更高效的方法。
  • 交换(Swapping):移动整个进程,会造成严重性能损耗,是原始UNIX方法。在Linux中,术语“swapping”常指代paging,且内核不支持老UNIX风格的整体进程交换。

三、调度与文件系统

1. 调度器(Scheduler)

UNIX及其衍生系统是分时系统,通过划分时间片实现多进程“同时”运行。调度器是内核关键组件,负责将线程(在Linux中称为任务)调度到CPU上执行。

  • 调度原理:维护优先级机制和运行队列,动态调整进程优先级以优化性能。工作负载主要分为:
    • CPU密集型:执行大量计算,受CPU资源限制。
    • I/O密集型:执行大量I/O操作,需低延时响应,受存储或网络资源限制。
      调度器会识别CPU密集型进程并降低其优先级,让I/O密集型负载优先运行,从而优化整体性能。
  • 现代调度特点:支持多类别调度(如实时调度类别,优先级更高)、抢占(高优先级线程可中断低优先级线程)等。优先级反转(低优先级线程阻塞高优先级线程)问题在Linux中可通过支持优先级继承的用户态mutex解决。

2. 文件系统(File System)

文件系统是组织目录和文件的数据结构,基于POSIX标准接口访问。操作系统提供以根目录(“/”)为起点的全局文件命名空间,通过挂载(mounting)添加分支。

  • 物理结构到逻辑抽象:理解文件系统需自下而上:硬盘(扇区、磁道、柱面)-> 驱动 -> 卷管理 -> 块设备接口 -> 文件系统 -> 虚拟文件系统(VFS) -> 应用程序。卷管理(如分区)将硬盘转换为逻辑线性结构,常见分区形式有MBR和GPT。
  • 文件系统组成:分区通常划分为启动区、超级块(存放文件系统关键信息,有多个备份)、inode区和数据块。inode存储文件的元数据(metadata,如大小、所有者、修改日期)以及指向数据块的指针,是文件从抽象到具体的关键。使用ls -l可查看文件元数据。

四、性能分析启示

本章虽为理论概述,但多处隐含了性能分析的关键视角:

  • 上下文切换开销:频繁的系统调用导致的用户态/内核态切换是潜在CPU瓶颈源,尤其在I/O密集型场景。
  • COW优化:fork()的写时拷贝策略是提升进程创建性能的经典设计,理解其原理有助于分析内存使用模式。
  • 中断处理:中断延时与处理方式(快速ISR vs. 中断线程)直接影响系统响应能力,特别是实时或低延时系统。
  • 调度策略:理解调度器对CPU密集型和I/O密集型负载的优先级调整,有助于解读top、vmstat等工具中进程状态变化的原因。
  • 内存与文件系统抽象:虚拟内存和VFS提供了便利,但也增加了性能分析的复杂度(如缺页故障、缓存命中率)。性能工具需要穿透这些抽象层,观测底层硬件行为。
  • 赞(0)
    未经允许不得转载:171主机测评 » 《性能之巅》第三章 “操作系统” 读书笔记
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址