元数据卡
- 前置知识:程序与文件的概念(上一页)
- 预计时间:10 分钟
- 完成标志:能区分程序和进程,能用 ps aux 查看进程
你的进度
"好了,我们知道程序是一个文件——躺在硬盘上的图纸。那怎么让它活过来?"
工坊主人把计算器图标放在桌上,指了指它。"这张图纸你拿到了。现在告诉我,你能用它敲钉子吗?"
你摇头。"除非……你把它做成锤子?"
"对!"他一拍桌子,"从图纸到锤子,需要一个步骤:拉一下手柄。双击鼠标,拉一下。"
你双击了计算器图标。操作系统做了几件事。
程序变成了进程
- 在硬盘上找到
calc.exe这个文件 - 读取它的内容——那一长串机器指令
- 在内存里划出一块区域
- 把指令复制进去
- 准备一个"控制面板"记录它的一切(进程 ID、状态、占用资源)
- 让 CPU 开始执行第一条指令
那一刻,程序变成了进程。
程序是静态的,进程是动态的。书关着是程序,打开在读是进程。
# 查看当前运行的所有进程
ps aux
# 预期输出(简化):
# USER PID %CPU %MEM START TIME COMMAND
# steven 1234 0.1 2.3 10:00 0:02 /usr/bin/gnome-terminal
# steven 5678 0.0 0.5 10:05 0:00 /usr/bin/calc
#
# PID = 进程 ID,操作系统给每个进程的唯一编号语言:Shell (Bash) 如何运行:输入 ps aux 或 ps aux | head -20预期输出:所有正在运行的进程列表,包含 PID、CPU/内存使用情况 你试试:在另一个窗口打开一个程序,再跑一次 ps aux,看看多了哪一行
Windows 替代:
Get-Process(PowerShell)或打开任务管理器(Ctrl+Shift+Esc)
看到那个 PID 了吗?它叫进程 ID,是操作系统给每个进程的身份证号。你在工坊的后续冒险中会大量用到它——查、杀、看、跟踪。
内存是工作台
"好的,程序变成进程了。那进程住在哪?"
工坊主人把你带到一面工具墙前。墙上挂着各种工具——螺丝刀、扳手、钳子——整整齐齐。
"这是我的工作台。每次干活的时候,我把需要的工具从柜子里拿出来放到台面上。用完了再放回去。柜子大但麻烦——你得走过去翻。台面就在手边,但地方就那么大。"
"进程也一样。它需要一个工作台。"
内存是进程的工作台。操作系统把程序的指令从硬盘复制到内存,然后 CPU 开始一条一条地拿取指令来执行。
# 查看系统的内存使用情况
free -h
# 预期输出:
# total used free shared buff/cache available
# Mem: 15Gi 5.2Gi 3.1Gi 512Mi 6.7Gi 9.1Gi
# Swap: 2.0Gi 0.0Gi 2.0Gi语言:Shell (Bash) 如何运行:输入 free -h(-h 表示人类可读格式) 预期输出:内存总量、已用、空闲、可用等情况 你试试:开一个大程序(或很多浏览器标签页)后再运行,观察变化
Windows 替代:任务管理器 → 性能 → 内存
这里有两个关键点:
内存是有限的。15GB 总内存,开几个大程序就会用完。不够时操作系统会"交换"(swap)——把暂时不用的数据挪回硬盘。内存不够时电脑会变慢。
每个进程有自己的内存空间。A 程序不能直接访问 B 程序的内存。这是操作系统强制保护的安全机制——如果一个程序崩溃了,不会带走其他程序。
常见陷阱
一个进程占满了一个 CPU 核
你的电脑风扇狂转,但只看到一个进程在拼命跑。这不是病毒——更可能是程序写了死循环。
在 top 里按 P 按 CPU 排序,找到 PID,然后用 kill <PID> 杀掉它:
kill 12345 # 12345 换成实际进程号如果杀不掉,加 -9。但优先用不带参数的 kill——它让进程有清理的机会。
深入:父子进程和僵尸
你现在不需要深入理解这些,但至少知道它们存在:
- 父子进程:一个进程可以创建子进程。你在终端里运行
ls,终端进程会创建一个子进程来执行ls。 - 信号:
kill不只"杀死"进程,它在发送信号。kill <PID>发送SIGTERM(请求优雅终止),kill -9发送SIGKILL(强制杀掉)。
旅人笔记
程序是硬盘上存着的文件,静态不动;进程是运行起来的程序,动态、有 ID 编号、占内存和 CPU。内存是进程的工作台,有限、快速、独立隔离。
六个字:程序 → 进程 → 运行。
→ 下一步:操作系统与并发
一台电脑能同时运行几十个进程——可你的 CPU 只有几个核。这是怎么做到的?