进程创建与程序执行全解析
在操作系统的世界里,进程创建和程序执行是至关重要的环节。本文将深入探讨进程创建的相关系统调用、算法,以及程序执行的机制。
进程创建概述
在操作系统中,除了系统初始化时从 main()
启动的系统进程外,所有进程都是通过 fork
系统调用创建的。此外,还有一个源自 4.3BSD 的 vfork
系统调用,它能高效利用虚拟内存系统,但由于操作系统实现的变化, fork
几乎和 vfork
一样高效, vfork
可能会在未来版本中被移除。
当使用 fork
创建新进程时,新进程被称为子进程。子进程会拥有自己的 proc
、 user
、 cred
和 pid
结构,如果它是新会话的领导者,还可能有 sess
结构。子进程会继承父进程的几乎所有变量和数据结构,系统会自动根据父进程的内容初始化子进程的数据结构。同时,子进程用户区的某些会计变量会被初始化,会被分配唯一的 PID,并且其父进程的 PID(PPID)也会被初始化。
新进程创建后,其可交换映像几乎是父进程的精确镜像,包括文本、数据和栈段。系统通过给子进程复制父进程的页表来实现这一点,但实际的数据页不会被复制。相反,父进程的页表以及子进程的数据和栈页会被标记为写时复制,父进程和子进程共享父进程的页面(文本页从不修改,因此无需标记)。如果父