进程与线程
进程组织地址空间与资源,线程是其中的执行路径。本文以 Linux 为主,负责资源共享、调度和进程生命周期。
1. 面试核心
先记住这几条,再读正文- 资源共享。 同进程线程共享地址空间和 fd 表,各自保存寄存器与栈。卡 · 面试核心
- 并发与并行。 并发指多个任务在重叠时段内推进,并行指同一时刻执行。
- 创建与替换。 fork 创建子进程,exec 替换当前进程的程序映像。卡 · fork、exec 与退出回收
- 退出回收。 已退出子进程的状态由 wait 或 waitpid 回收。卡 · fork、exec 与退出回收
- 内核切换与调度。 系统调用切换特权级,调度切换才会更换当前执行任务。
2. 资源与执行状态
独立进程可以把同一虚拟地址映射到不同物理页。线程共享进程的全局变量、堆、代码和 fd 表。每个线程保存自己的寄存器、栈和线程局部数据。
线程栈属于共享地址空间。其他线程拿到有效指针后也能访问这块内存。因此传递栈对象时,需要同步并保证对象仍存活。
3. 调度与上下文切换
| 状态 | 含义 |
|---|---|
| 运行 | 当前正在 CPU 上执行。 |
| 就绪 | 已具备执行条件,等待分配 CPU。 |
| 阻塞 | 等待 I/O、锁或其他事件。 |
运行任务因抢占转为就绪。等待事件时,它进入阻塞。事件发生后,任务重新进入就绪队列。唤醒后仍需等待调度才能运行。
上下文切换保存并恢复寄存器等状态。同进程线程切换共享地址空间。跨进程切换还要切换地址空间上下文。具体成本取决于硬件和工作集,无法给出固定倍数。
系统调用进入内核态后,可仍在原线程内完成。只有阻塞或抢占等触发调度时,才会切到其他任务。
4. fork、exec 与退出回收
fork 创建具有新 PID 的子进程。父进程取得子进程 PID,子进程取得返回值 0。Linux 用写时复制避免立即复制全部内存,机制见虚拟内存。
多线程进程 fork 后,子进程仅保留调用线程。其他线程持有的锁状态却会随内存继承。子进程在 exec 前只调用异步信号安全函数。
exec 成功后替换程序映像,PID 保持不变。描述符的继承与关闭见文件描述符。
子进程退出后,内核暂存退出状态等信息。父进程调用 wait 或 waitpid 完成回收。尚未回收的退出进程称为僵尸进程。它已停止执行,但仍占据进程表记录。
父进程先退出时,子进程成为孤儿。Linux 会把它交给子收割器或 init 收养。孤儿进程仍可继续运行,退出后由新父进程回收。
5. 进程间通信
| 方式 | 适用信息 |
|---|---|
| 管道、FIFO | 字节流,适合串联本机处理流程。 |
| 消息队列 | 有边界的消息,需管理队列容量。 |
| 共享内存 | 共享大块数据,另需同步访问。 |
| Unix domain socket | 本机双向通信,也支持传递 fd。 |
| 网络 socket | 跨机器通信。 |
| 信号 | 事件通知,负载表达能力有限。 |
共享内存减少数据经内核中转的复制。进程仍需协调并发和对象生命周期。字节流通信还需要协议分帧。
6. 使用边界
进程适合资源和故障隔离。线程适合共享数据与协同执行,但内存破坏会影响整个进程。
CPU 密集任务受可用核数限制。I/O 密集任务可增加并发以覆盖等待。并发上限仍要服从下游容量、内存和调度成本。
7 · 面试题卡片
本页题目与参考回答
7.1 进程与线程有什么区别,线程共享资源会带来哪些影响?
考察重点:资源隔离与共享范围、执行状态和并发访问风险。
参考回答
进程提供地址空间和资源边界。
线程在其中执行,共享堆、全局变量和 fd 表。每个线程保留寄存器状态与栈。共享减少通信成本,也带来竞争和共同的故障影响。选择时应结合隔离、通信与调度需求。
7.2 fork、exec、wait 分别做什么,僵尸与孤儿进程有何区别?
考察重点:创建、程序替换和退出回收。
相关内容:fork、exec 与退出回收。
参考回答
fork 创建子进程,exec 替换当前程序映像。
wait 获取子进程退出状态并完成回收。僵尸已经退出,只保留待回收记录。孤儿失去原父进程,但仍可继续运行。Linux 由子收割器或 init 收养并回收它。
7.3 共享内存为什么适合大数据通信,还需要哪些配套机制?
考察重点:数据共享、同步和生命周期。
相关内容:进程间通信。
参考回答
共享内存让进程直接访问同一批物理页。
它减少数据在进程间传递的复制。读写仍需互斥锁、信号量或其他同步机制。创建、映射和释放也要约定责任,避免提前回收。