解答:fork()函数执行后,子进程先执行的原因。

写过fork()函数的朋友应该有经验,一般使用fork()函数后,打印执行顺序时总是子进程先执行。但是书上却说fork函数的子进程与父进程之间的执行顺序不确定,原因是什么?

这就涉及到内核一个技术:copy-on-write,即写时拷贝。传统的fork函数调用直接把所有资源复制给新创建的进程,简单,但是浪费!写时拷贝技术是创建新进程时推迟或者不拷贝数据的技术。新创建进程后内核并不复制整个进程的地址空间给子进程,而是让父子进程暂时共享一个地址空间,只有在子进程需要写入的时候,数据才被复制到子进程地址空间。例如,在fork()后立即调用exec(),此时无需进行整个地址空间的数据拷贝,fork()的开销仅限于复制父进程的页表以及给子进程创建唯一的进程描述符。

往往我们新创建的进程总要调用exec(),所以,内核往往先执行新创建的子进程。但是并不是绝对的。

个人理解,抛砖引玉,不合适地方请大家提出。

你可能感兴趣的:(解答:fork()函数执行后,子进程先执行的原因。)