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

------ 小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


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

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

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

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

相关推荐
红橙Darren1 小时前
手写操作系统 - 环境搭建
android·微信·操作系统
egoist20237 小时前
【Linux仓库】虚拟地址空间【进程·陆】
linux·运维·服务器·操作系统·进程·虚拟地址空间·fork
望获linux9 小时前
【实时Linux实战系列】多核同步与锁相(Clock Sync)技术
linux·前端·javascript·chrome·操作系统·嵌入式软件·软件
望获linux17 小时前
【实时Linux实战系列】硬实时与软实时设计模式
linux·运维·服务器·数据库·操作系统·rtos·嵌入式软件
DoraBigHead1 天前
别只会点开浏览器!操作系统才是你代码的亲爹
操作系统
Brookty1 天前
【操作系统】线程
java·linux·服务器·后端·学习·java-ee·操作系统
喧星Aries2 天前
进程调度的时机,切换与过程方式(操作系统OS)
java·服务器·前端·操作系统·进程调度
OpenAnolis小助手3 天前
Anolis OS 23 架构支持家族新成员:Anolis OS 23.3 版本及 RISC-V 预览版发布
开源·操作系统·龙蜥社区·risc-v·anolis os·龙蜥操作系统
沐森3 天前
桌面右键功能开发
前端框架·操作系统