进程是资源分配的基本单位:拥有独立的地址空间、文件描述符表等上下文。 线程是 CPU 调度的常见单位:同一进程内的多个线程共享地址空间,切换成本通常低于进程。 操作系统在内核里维护就绪队列,按调度策略决定下一个运行的线程/进程。
入门:为何需要多线程
在 I/O 等待时让其他线程继续工作,或在多核上并行计算,可提高吞吐。 但共享内存也带来竞态条件(race),需要锁、原子操作、消息传递或无共享架构(如 actor)等同步手段。
深入:阻塞、并行与并发
- 并发:多个任务交替推进(单核也可并发)。
- 并行:同一时刻多任务真正同时执行(通常需要多核或可并行设备)。
- 阻塞:线程等在 I/O 或锁上;调度器转去运行别的就绪线程。
深入:常见并发模型取舍
- 每连接一线程:写法直观;连接数极大时内存与上下文切换开销显著。
- 事件驱动 + 非阻塞 I/O:单或少线程处理大量连接(Node、Nginx、Netty 等),编码模型不同。
- 协程(用户态线程):由运行时调度;底层仍映射到 OS 线程。
- 线程池:限制并行度,避免无节制创建线程。
与容器、cgroup
在 Linux 上,cgroup 可对进程组限 CPU、内存与 I/O;容器常利用 namespace 与 cgroup 组合隔离。 理解进程树有助于排查「僵尸进程」(子进程已结束但未回收)、「孤儿进程」(父进程先退出)等问题。
不同教材对「轻量级进程」等术语定义略有差异;以所用平台文档与 POSIX 语义为准。调度算法细节(CFS 等)变化频繁,性能调优请读对应内核版本资料。
与其它主题的衔接
Linux 权限与进程 uid/gid、 Docker 中的 PID 命名空间、 Git 远程协作时的 CI runner,都会回到进程模型。