------ 小dora 操作系统学习笔记 · 进程管理全攻略(深度 + 幽默 + 练习)
"程序只是静静地躺在磁盘里,等着被操作系统安排命运。"
------ 小dora,在理解 fork 机制后的感慨
你打开编辑器、写下几行代码、点击运行,然后它就「跑起来」了?
NO。程序没有自己站起来去 CPU 上「执行」的能力,它得排队、申请资源、初始化状态、等待调度器翻牌,最后才能「苟且偷生」在操作系统的怀抱里。
这背后,就涉及到了我们的主角 ------ 进程(process)。
🧱 一、什么是进程?程序的「活体克隆」
📌 巧记口诀:
程序是死的,进程是活的;代码是静态的,进程是动态的。
程序 ≠ 进程。
- 程序是你写下的源代码 / 编译后的二进制文件。
- 进程是:操作系统将程序加载后,为它分配资源、分配空间、登记户口的运行实例。
📦 一个进程拥有啥?
资源 | 说明 |
---|---|
地址空间 | 自己的内存空间,和别人隔离 |
打开的文件表 | 每个文件描述符都记录着 |
CPU 寄存器 | 运行状态的「快照」 |
栈、堆 | 局部变量 / 动态数据分区 |
PCB(进程控制块) | 系统对它的"档案" |
📌 PCB 就像是"进程档案袋",里面记录了你是谁(PID)、你要啥资源、你跑到哪了、你还活着没......
🧬 二、进程的五大状态:走完这条命运之路
📌 巧记顺口溜:
"出生即创建,就绪在排队;抢到 CPU 跑,遇阻停一会;干完活就死。"
状态 | 说明 | 类比 |
---|---|---|
创建(New) | 系统正准备创建进程 | 刚入职还没分配工位 |
就绪(Ready) | 等待 CPU 的进程 | 排队等打卡 |
运行(Running) | 正在 CPU 上跑 | 正上班敲代码 |
阻塞(Blocked) | 卡在 I/O、网络等待 | 等接口返回,不然动不了 |
终止(Exit) | 程序执行完 / 异常结束 | 离职了,资源回收了 |
🧠 三、什么叫"调度"?不是你想跑就能跑!
你以为你代码写完了系统就自动执行了?
错。你只是加入了调度器排队系统。操作系统会看:
- 谁先来?
- 谁跑得快?
- 谁等级高?
- 谁已经等很久?
这套调度的算法就决定了你「能不能被翻牌」。
🔁 调度算法合集(附记忆技巧):
📌 巧记口诀:
"FCFS 谁先来谁先跑,SJF 快的先上道;RR 转盘分时间,Priority 大佬先干掉。"
调度算法 | 特点 | 类比 |
---|---|---|
FCFS | First Come First Serve | 谁排队早谁先上 |
SJF | Shortest Job First | 小任务优先处理 |
RR | Round Robin | 每人来一口轮流吃 |
优先级调度 | Priority Scheduling | 级别高先干活 |
多级反馈队列 | 动态调整优先级 | 排队久了会被优先考虑 |
🧠 高级调度器看重的是「整体性能」与「响应性」,不是盲目排队。
🧠 四、上下文切换:让进程"换人"真没你想的那么轻松
每次操作系统决定「下一个人上 CPU」的时候,要做一次:
- 保存当前进程:它的寄存器、PC 指针、栈位置等等
- 切入下一个进程:恢复它的寄存器、状态等
- 更新调度器状态
📌 巧记口诀:
"你说换人我就换?得备份现场还得换衣服。"
上下文切换会导致:
- CPU 缓存失效
- TLB(Translation Lookaside Buffer)清空
- 调度延迟
所以系统不能乱切 ------ 切换是贵的!
👨👩👧 五、进程的「fork」:Linux 的忍术·影分身之术
在 Linux 下,创建新进程最常见的方式是 fork()
:
- 它会复制当前进程(几乎一模一样)
- 复制的是:内存空间、打开的文件、堆栈......
- 父子进程几乎没区别,只是 PID 不一样
📌 重点来了:并没有真的复制内存内容!
是用了**写时复制(Copy-on-Write)**机制 ------ 你要写的时候,才真正复制!
📌 巧记口诀:
"fork 复制不花钱,写东西才算真。"
👬 六、线程和进程的区别:别再傻傻分不清楚!
📌 巧联想口诀:
"进程像公司,线程是员工;员工共享茶水间,但不能访问别的公司。"
对比 | 进程 | 线程 |
---|---|---|
拥有资源 | 独立资源空间 | 与进程内线程共享资源 |
是否隔离 | 严格隔离 | 不隔离,易出事 |
通信方式 | IPC 较重 | 内存共享就能通信 |
调度开销 | 较大 | 更轻量 |
所以现代系统大量使用线程(比如浏览器的多标签页),但线程之间容易"踩脚",所以要用锁、信号量、条件变量来管。
🔧 七、进程通信(IPC):多个进程怎么"说悄悄话"?
通信方式 | 特点 | 记忆联想 |
---|---|---|
管道(pipe) | 父子进程专用 | 你说我听,单向传声筒 |
FIFO(命名管道) | 无血缘也能通信 | 留言板 |
消息队列 | 有序传输消息 | 快递站 |
信号量 | 控制同步/数量 | 门禁闸机 |
共享内存 | 高效共享,但需同步 | 公共白板,需打架预防机制 |
套接字(socket) | 网络通信/本地也可用 | 发微信、打电话 |
📌 巧记口诀:
"亲子用 pipe,陌生用 FIFO;写多同步靠锁头,远程发话用 socket。"
🧪 练习时间 · 快来试试你是不是掌握了进程的精髓?
🧩 Q1:下列哪项不是进程的状态?
A. 就绪(Ready)
B. 运行(Running)
C. 编译(Compiling)
D. 阻塞(Blocked)
✅ 正确答案:C
💡 编译是程序阶段,不是进程生命周期状态。
🧩 Q2:下列哪项说法正确描述了 fork 行为?
A. fork 会立刻复制所有内存
B. fork 后父子共享 PID
C. fork 是基于 Copy-on-Write 的优化策略
D. fork 只能用来创建线程
✅ 正确答案:C
🧩 Q3:多线程比多进程性能好,是因为?
A. 线程不会调度
B. 线程不需要栈
C. 线程间资源隔离好
D. 线程切换成本低,资源共享性强
✅ 正确答案:D
🧩 Q4:进程调度中时间片轮转(RR)策略的主要优点是?
A. 最快完成任务
B. 公平性高,响应快
C. 优先级最高的先跑
D. 适用于只有一个进程的场景
✅ 正确答案:B
🧠 总结 · 进程的管理,其实是操作系统最核心的"社会调度学"
你写代码只是"请求服务",操作系统才是「谁能干、谁先干、谁等着、谁被踢出局」的大管家。
📌 一句话记住今天的重点:
"写代码只是把程序写好,而操作系统要负责让它'活起来','跑起来',还能'相处好'。"