前言
Liunx中fork用来产生一个子进程。
一、进程是什么
二、操作系统如何管理进程
pcb又叫进程管理块,其中有一个Pid唯一标识一个进程,并通过链表的结构将进程串接起来。
三、fork
其父进程的返回值为子进程的PID,子进程的返回值为0;
四、写时拷贝
传统的fork()系统调用直接把所有的资源复制给新创建的进程。这种实现过简单并且效率低下,因为它拷贝的数据也许并不共享,更糟的情况是,如果新进程打算立即执行一个新的映像,那么所有的拷贝都将前功尽弃。Linux的fork()使用写时拷贝(copy-on-write) 页实现。写时拷贝是一种可以推迟甚至免除拷贝数据的技术。内核此时并不复制整个进程地址空间,而是让父进程和子进程共享同一个拷贝。只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。也就是说,资源的复制只有在需要写人的时候才进行,在此之前,是以只读方式共享这种技术使地址空间上的页的拷贝被推迟到实际发生写入的时候。
五、常考面试题目
题目1
输出:
题目2
输出
总结
fork进行复制时,是把父进程的所有资源都进行了复制,这也是fork的主要开销(写时拷贝除外),需要注意的是如果在缓冲区有数据时也一并进行复制,例如当父进程执行printf“A“以后再进行复制时,子进程的缓冲区也会有相应的"A"存在。换句话说,fork是以进程为单位进行复制的。