面试题答案
一键面试在Linux环境下C语言实现的prefork模型中:
- 内存分配:
- 父进程:父进程在创建子进程前,拥有自己独立的地址空间,包含代码段、数据段(初始化数据和未初始化数据)、堆、栈等内存区域。当父进程调用
fork
函数创建子进程时,子进程会复制父进程的内存状态,采用写时复制(Copy - On - Write,COW)机制。这意味着父子进程最初共享相同的物理内存页面,只有当其中一个进程尝试修改某个页面时,才会为修改的进程分配新的物理内存页面进行复制。例如,父进程有一块包含全局变量的内存区域,子进程创建后,它们最初共享这块内存,若父进程修改了该全局变量,系统会为父进程复制该内存页面并进行修改,子进程对应的页面不受影响。 - 子进程:子进程创建后,继承父进程的内存布局,但实际内存空间是共享的(COW机制),在未发生写操作前,不会额外分配物理内存,节省了内存资源。
- 父进程:父进程在创建子进程前,拥有自己独立的地址空间,包含代码段、数据段(初始化数据和未初始化数据)、堆、栈等内存区域。当父进程调用
- 文件描述符分配:
- 父进程:父进程打开的文件描述符(如通过
open
函数打开文件、socket
函数创建套接字等操作得到的文件描述符),在fork
调用创建子进程时,子进程会继承这些文件描述符。每个文件描述符在内核中对应一个文件表项,文件表项记录了文件的当前偏移量、打开模式等信息。父进程打开的文件描述符在子进程中具有相同的数值和对应的文件表项引用。例如,父进程打开一个日志文件,文件描述符为3,子进程创建后也拥有文件描述符3,且该描述符指向内核中相同的文件表项,意味着父子进程对该文件的操作(如读写位置等)是共享的。 - 子进程:子进程继承父进程的文件描述符,这些描述符与父进程中的描述符指向相同的文件或设备等资源。但要注意,父子进程对文件描述符的操作是相互独立的,比如子进程对某个文件描述符执行
read
操作后移动了文件偏移量,父进程再次read
时会从子进程移动后的偏移量位置继续读取。
- 父进程:父进程打开的文件描述符(如通过