1.3 进程与内存
前置知识:程序与文件
预计时间:10–15 分钟
完成标志:能区分程序和进程,读懂 PID、PPID、状态和系统内存概况
可执行文件仍在持久存储中。在终端启动它后,计算器窗口随即出现。磁盘上的文件没有变成另一个文件;操作系统为这次运行建立了一组新的状态。
这组正在变化的状态,就是我们要观察的进程。
从程序到进程
启动程序时,操作系统通常要完成下面这些工作。不同内核和运行时的细节并不相同,这份清单只描述共同轮廓:
- 解析启动请求;
- 创建进程对象、虚拟地址空间和安全上下文;
- 映射可执行文件、动态库、栈和其他区域;
- 建立标准流、工作目录和继承资源;
- 创建初始线程并交给调度器。
现代系统不必先把整个程序完整复制进物理内存。内存映射和按需分页允许系统在页面第一次被访问时再加载它。
程序描述要执行的工作,进程代表一次运行。同一个程序可以产生多个进程;一个进程也会使用多个程序文件、共享库和配置。
PID 不是永久身份证
PID 在一个 PID 命名空间内、某一时刻区分进程。进程退出后,系统可以复用这个数字。容器还可能让同一进程在不同命名空间中看到不同 PID。排障时同时记录命令和启动时间。
启动并观察一个进程
python3 -c 'import time; time.sleep(30)' &
pid=$!
sleep 0.2
ps -p "$pid" -o pid,ppid,stat,%cpu,%mem,etime,command
kill "$pid"
wait "$pid" 2>/dev/null || true类型: runnable环境: Bash、Python 3、Linux/macOS 常见 ps观察: $! 保存后台任务 PID;PPID 是父进程号;STAT 是采样时状态;kill 默认发送 SIGTERM。macOS 的 ps 字段支持略有差异,如报错可先运行 ps -p "$pid" -o pid,ppid,state,etime,command。
虚拟内存与物理内存
进程看到虚拟地址空间。CPU 按页表把可访问的虚拟地址转换为物理地址;页面不在内存中时,操作系统可能在缺页处理期间从文件或交换空间调入它。CPU 不会直接把磁盘当作 RAM 读取。默认隔离阻止普通进程任意访问其他进程,但共享内存、调试权限和内核权限可以建立受控例外。
Linux 查看系统概况:
free -hfree是完全未用的物理内存;buff/cache包含可回收缓存;available是内核对不必换页就可供新应用使用的内存估计;swap保存换出的页面,不表示“整个进程搬到了磁盘”。
used 百分比高不能单独证明内存不足。还要观察 available、持续换页、延迟和工作负载。macOS 用 vm_stat 或活动监视器,Windows 用任务管理器或性能计数器。
信号与结束进程
kill PID 发送信号,默认是 SIGTERM,给程序清理资源的机会。kill -KILL PID 发送无法捕获的 SIGKILL,只适合程序无法响应且你已确认目标时使用。后台服务可能被服务管理器重新拉起,这时应操作服务而不是反复杀进程。
你现在应当能判断什么
看到一个 PID 时,不要只问“它是多少”,还要问它对应哪条命令、何时启动、当前处于什么状态。看到内存使用率很高,也不要立刻判定故障;先检查 available、换页和实际延迟。
运行上面的实验并确认测试进程已经退出。然后用一句话区分程序与进程。能做到这两点,就可以进入线程、并发与并行。