这一组系统调用是 Linux / Unix 进程管理里最经典的一组面试题。很多同学一开始会把它们混在一起,觉得都和“创建进程、执行程序”有关,但其实它们三者分别负责完全不同的事情:
fork:创建子进程exec:让当前进程执行新的程序wait:父进程等待并回收子进程
最典型的组合关系是:
父进程先
fork出子进程,子进程再exec执行新程序,父进程最后通过wait回收子进程。
2026/4/1...大约 6 分钟
这一组系统调用是 Linux / Unix 进程管理里最经典的一组面试题。很多同学一开始会把它们混在一起,觉得都和“创建进程、执行程序”有关,但其实它们三者分别负责完全不同的事情:
fork:创建子进程exec:让当前进程执行新的程序wait:父进程等待并回收子进程最典型的组合关系是:
父进程先
fork出子进程,子进程再exec执行新程序,父进程最后通过wait回收子进程。
讲完进程之后,下一步最自然就是线程。
线程是面试里最常见也最容易讲乱的概念之一。很多人只会背:
但如果不理解“为什么要有线程”,这些话就容易变成死记硬背。
线程出现的核心目的,是在同一个进程内部实现更轻量的并发。
如果所有并发都用进程来做,会有几个问题:
线程这块最容易让人越学越绕,因为它同时牵扯:
如果这些层次混在一起,很容易越看越糊。所以这一篇我们只先抓住最重要的主线:
用户线程、内核线程、LWP 分别是什么,它们是怎么对应起来的。
用户线程可以理解成:
在线程库或运行时里实现和管理的线程。
调度这部分,本质上在回答:
CPU 先给谁用、给多久、什么时候换人。
单核 CPU 在同一时刻只能真正执行一个任务,因此操作系统必须从就绪任务中做选择,这个选择过程就是调度。
调度程序(scheduler)的职责,就是在多个可运行进程 / 线程之间做选择:
如果没有调度,系统就无法在多个任务之间高效分配 CPU 资源。
进程管理这部分,最先要搞清楚的不是各种系统调用,而是:
什么是进程,操作系统为什么要管理进程,以及它到底是怎么管理的。
很多同学一开始会把进程理解成“一个正在运行的程序”,这句话本身没错,但还不够。面试里如果只答这一句,后面的状态、PCB、上下文切换就很难接上。
程序本身是磁盘上的静态文件,只有被装入内存并开始执行后,才会变成进程。
所以可以直接记成: