fork() 是 Unix/Linux 创建进程的核心系统调用。现代 Linux 通过 clone() 系统调用实现 fork()、vfork() 与 __clone(),并采用写时复制(Copy-on-Write, COW)技术最小化内存复制开销。本文深度解析实现流程与内核关键函数。
fork() → glibc wrapper
→ clone(CLONE_CHILD_CLEARTID | CLONE_CHILD_SETTID | SIGCHLD, 0)
→ sys_clone() (内核入口)
→ do_fork()
→ copy_process()
dup_task_struct() 分配新内核栈、thread_info、task_struct,内容与父进程相同。RLIMIT_NPROC。TASK_UNINTERRUPTIBLE 防止抢占、清除 PF_SUPERPRIV、设置 PF_FORKNOEXEC。get_pid() 获取新 PID。CLONE_FILES)CLONE_FS)CLONE_SIGHAND)CLONE_VM,fork() 不设置,故复制页表指针,启用 COW)CLONE_NEW*)fork() 后,父子进程共享物理页面,页表项标记为只读。fork() 后立即 exec(),地址空间完全替换,无任何页面实际复制,极大提升效率。copy_process() 成功 → wake_up_new_task() 唤醒子进程 → 放入运行队列。exec(),避免父进程先写入触发不必要的 COW 复制。vfork() 设置 CLONE_VM | CLONE_VFORK,父子完全共享地址空间,父进程挂起直到子进程 exec() 或 exit()。exec() 场景。
理解 fork() → clone() → do_fork() → copy_process() 调用链与 COW 机制,是掌握 Linux 进程管理、容器技术(命名空间隔离)与高性能服务器编程的基石。