使用fork()创建多进程时,进程是否需执行完毕才切换?
多进程fork后的输出交错问题
问题场景
代码中通过3次fork()生成总计8个进程,代码如下:
int main() { fork(); fork(); fork(); printf("First print statement.\n"); printf("Second print statement.\n"); return 0; }
已知这些进程的执行顺序无固定规则,在不使用wait(NULL)的情况下,是否必须一个进程完全执行完毕(连续打印两条输出语句)后,另一个进程才能开始执行?还是会出现不同进程的输出语句交错的情况?
回答
会出现不同进程的输出语句交错的情况,原因如下:
- 现代操作系统的进程调度是抢占式的,每个进程只能获得有限的CPU时间片。当一个进程的时间片耗尽,内核调度器会暂停它,切换到其他处于就绪状态的进程执行。
- 代码中的两个
printf是独立的操作,中间没有任何同步机制(比如锁、信号量或wait)。完全可能出现这样的场景:进程A执行完第一个printf后,时间片耗尽,调度器切换到进程B,进程B执行第一个printf甚至第二个printf,之后才切回进程A执行剩下的第二个printf。 - 举一个可能的交错输出示例:
First print statement. First print statement. Second print statement. First print statement. Second print statement. Second print statement. ... - 没有同步手段的情况下,内核不会保证某个进程必须完整执行所有代码后才调度其他进程,进程的执行片段完全由调度策略决定。
内容的提问来源于stack exchange,提问作者nalabof679
相关产品推荐
相关产品推荐

