进程:你以为你写了代码,其实你只是申请了个号

------ 小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」的时候,要做一次:

  1. 保存当前进程:它的寄存器、PC 指针、栈位置等等
  2. 切入下一个进程:恢复它的寄存器、状态等
  3. 更新调度器状态

📌 巧记口诀:

"你说换人我就换?得备份现场还得换衣服。"

上下文切换会导致:

  • 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


🧠 总结 · 进程的管理,其实是操作系统最核心的"社会调度学"

你写代码只是"请求服务",操作系统才是「谁能干、谁先干、谁等着、谁被踢出局」的大管家。

📌 一句话记住今天的重点:

"写代码只是把程序写好,而操作系统要负责让它'活起来','跑起来',还能'相处好'。"

相关推荐
闪电麦坤955 小时前
操作系统:远程过程调用( Remote Procedure Call,RPC)
rpc·操作系统
丐中丐9992 天前
Android系统中如何在Native层调用java实现的系统服务
android·操作系统
丐中丐9992 天前
在Android中利用抽象类对外提供系统接口
android·操作系统
我命由我123453 天前
Windows 操作系统 - Windows 设置始终使用 Windows 照片查看器打开图片
运维·windows·经验分享·笔记·学习·操作系统·运维开发
huangyuchi.3 天前
【Linux】环境变量
linux·运维·操作系统·环境变量·系统调用·命令行参数·main函数参数
pedestrian_h4 天前
操作系统-lecture5(线程)
操作系统·线程·进程
Jooolin4 天前
【Linux】指令大全!常用的都在这了~
linux·操作系统·ai编程
自由鬼6 天前
如何处理Y2K38问题
java·运维·服务器·程序人生·安全·操作系统
moning6 天前
Window 的 Type 失效了?IME 为什么在 Toast 下方?
前端·操作系统·android studio
自由鬼6 天前
AI赋能操作系统:通往智能运维的未来
linux·运维·服务器·人工智能·程序人生·ai·操作系统