本文约3300字,今天继续阅读《操作系统教程(Linux 版)》这本书, 本文整理了第三章的读书笔记。
关注公众号, 即可获得与Linux相关的电子书籍(含《操作系统教程(Linux 版)》)以及常用开发工具,文末有文档清单。
本章主题为进程管理,是操作系统的核心内容之一。主要围绕进程的基本概念、进程描述与控制、进程调度、线程以及 Linux 系统的进程模型展开讲解。
进程管理是操作系统的“心脏”,负责管理系统中最活跃的实体——进程。本章从程序的顺序与并发执行引入,逐步深入到进程的定义、状态转换、控制原语,最后结合 Linux 系统实例分析其进程管理机制。本章是理解操作系统并发执行、资源分配与CPU 调度的关键内容。
进程:程序关于某数据集上的一次运行活动,是系统进行资源分配和调度的基本单位。
进程与程序的区别是理解进程概念的关键:
| 本质 | ||
| 生命周期 | ||
| 资源 |
程序是存放于磁盘上的被动实体,而进程是拥有程序计数器、寄存器内容、堆栈段和数据段的活动实体。
进程通常包含以下组成部分:
操作系统中进程存在以下状态,不同教材分类略有差异:
| 新建(New) | |
| 就绪(Ready) | |
| 运行(Running) | |
| 等待(Waiting) | |
| 终止(Terminated) |
在 Linux 内核中,进程状态被进一步细分为可中断等待、不可中断等待、停止、跟踪等多种状态。
操作系统为每个进程维护一个数据结构来记录其所有信息,这个结构在 Linux 中称为 **task_struct**(进程描述符),包含:
| 进程状态 | |
| 程序计数器 | |
| CPU 寄存器 | |
| 调度信息 | |
| 内存管理信息 | |
| 记账信息 | |
| I/O 状态信息 |
进程进入系统后,操作系统会将其放入不同的调度队列中管理:
| 长期调度 | |||
| 中期调度 | |||
| 短期调度 |
长期调度程序需要合理平衡 I/O 为主和 CPU 为主的进程组合,以充分利用系统资源。
上下文切换是指将 CPU 从一个进程切换到另一个进程的过程:
⚠️ 上下文切换是额外开销,切换期间系统无法执行有用工作,切换时间与硬件支持密切相关。
进程可以通过创建子进程来形成进程树。在 Linux 系统中,所有进程都是 PID=1 的 init 进程的后代。
创建流程:
fork() 系统调用
fork()返回两次:父进程返回子进程 PID,子进程返回 0。
父进程可通过 wait() 等待子进程终止;子进程可用 exec() 族函数加载新程序。
进程通过 exit() 系统调用终止,此时:
wait() 获取子进程退出状态后,系统最终释放 PCB若父进程先于子进程终止,子进程将成为孤儿进程,由 init 进程收养。
并发执行的进程分为独立进程和协作进程。协作进程需要进程间通信(IPC) 来交换数据。
两种基本通信模式:
| 共享内存 | ||
| 消息传递 |
管道是 Linux 中常见的 IPC 方式,分为普通管道(用于相关进程)和命名管道(用于不相关进程)。
线程是进程中一个相对独立的、可调度的执行单元,是系统调度的基本单位。
一个进程可以包含一个或多个线程,同一进程的多个线程共享进程的地址空间和其他资源。
| 资源 | ||
| 调度 | ||
| 通信 | ||
| 上下文切换 |
在 Linux 内核中,并没有线程这个概念,线程只是一种特殊的进程——与其他进程共享某些资源的进程。
每个线程都拥有独立的 task_struct,在内核中看起来就像一个普通进程。创建线程与创建进程类似,只是在调用 clone() 时传递参数标志来指明需要共享的资源。
Linux 使用 task_struct 结构(进程描述符)表示每个进程:
fork() | |
clone() | |
exec() | |
exit() | |
wait() |
Linux 内核将进程状态细分为:
fork()、exec()、exit()、wait() 系统调用流程程序与进程的区别 → 进程状态与 PCB → 进程调度(队列 & 调度程序) → 进程控制(创建/终止) → 进程间通信 → 线程 → Linux 进程模型实践
| 名词解释 | |
| 简答题 | |
| 辨析题 | |
| 实操考点 | fork()/exec()/wait()/exit() 的使用、查看进程状态的命令(如 ps) |
第三章将视线从“用户接口”转向操作系统内部最活跃的管理对象——进程。进程是操作系统的核心抽象,理解了进程,就理解了操作系统如何管理 CPU 和并发执行。
本章的关键在于建立动态思维:程序是静态的,而进程是动态的、有生命周期的实体。进程控制块是操作系统感知进程存在的唯一方式,上下文切换则是进程在 CPU 上轮转的底层机制。
Linux 的 fork() 与写时拷贝设计体现了操作系统对性能的极致追求——能延迟的复制就延迟,能不复制就不复制。而“线程是一种特殊进程”的 Linux 哲学,则展示了简洁统一的设计思想。
结合 Linux 终端实际运行 ps -ef 查看进程树、编写 C 程序调用 fork() 体验父子进程的并发执行,能让抽象的进程概念变得触手可及。
📖 来源:《操作系统教程(Linux 版)》第三章 · 读书笔记

这里是女程序员的笔记本
15年+嵌入式软件工程师兼二胎宝妈
分享读书心得、工作经验,自我成长和生活方式。
希望我的文字能对你有所帮助