跳转至

fork/exec/spawn 辨析

总结

关于子进程父进程同步和等待这个问题,我没有考虑时间片轮转,也就是分时的操作系统;这个就是学长说的调度,宏观上其实是“同步”的。

答疑

我:有几个关于fork/exec/spawn的疑问...

  1. 「exec类比 老妈炒西红柿鸡蛋炒了一半,突然有别的事情要处理,完全把看锅的事情交给我了(老妈exec我),我炒好之后装盘端到桌子上(我exit)。」这个理解对吗?
  2. 「fork类比 老妈要做西红柿炒鸡蛋,让我帮忙切西红柿和打鸡蛋(父进程调用fork创建子进程),然后开始等我(父进程waitpid);我开始搞(子进程exec),搞好之后把切好的西红柿和蛋液给她(子进程exit),她开始炒(父进程继续运行);炒好之后老妈装盘端到桌子上(父进程exit),结束。」这个理解对吗?
  3. exec是不是和高级语言中的一行行执行是一样的?或者说,A代码块执行完开始执行下面的B代码块?
  4. fork+exec是不是和高级语言中的函数调用一样呢?还是说fork+exec+wait和高级语言中的函数调用一样呢?
  5. (关于子进程运行过程中父进程是否可以同步运行)如果 fork+exec和高级语言中的函数调用一样,高级语言中函数在执行时原来的语句相当于是在等待的(对应指令集的指令在单核运行时只能一条一条执行) —— 我想知道 fork之后 父进程是完全停止以等待子进程结束吗?还是说父进程在子进程执行的同时也在执行呢?(我在准备食材的时候,老妈在一直等我,她在等我的过程中是不是可以同时把锅加起来,把油倒进锅里,把火开开等油热?还是因为等我什么都不做呢?)
  6. (关于父进程等待子过程)是父进程每隔一段时间就瞅瞅子进程是不是结束了来判断子进程是否结束?还是子进程结束之后通知父进程说已经结束了呢?(老妈要等我所以每隔一分钟看一下我是不是搞完了?还是说我这边准备完了可以告诉老妈说我搞完了?)
  7. 「spawn基本实现了fork+exec,给用户提供了一种简单的调用方式,但单独fork和exec的各种组合能实现比spawn更强大的功能。」这样的理解对吗?
  8. 我们在ch5练习中实现的spawn可以只是fork+exec,但也可以是与fork+exec功能一致的一个系统调用,以不同方式实现(不必像fork一样复制父进程的地址空间)。是吗?

助教:

1,2:可以这样理解 3,4,5:最好不要用函数调用来理解,实际上从调度的角度来看,exec只是我把相应的CPU使用权给了子进程,父进程又回到了队列里,正常的进行调度,宏观上可以认为它们都在执行。 6:错误,实际上上一个解答应该可以解答你的问题。建议仔细阅读fork、exec等内容的实验代码,以及一些进程调度的实现,应该可以帮助正确理解 7:是的 8:功能上与fork+exec一致,但实现不能一致,因为有一些规定上的差异,可以阅读guide