深入Linux内核架构-进程管理和调度(四)

假如想象 提交于 2020-01-20 21:20:19

一、进程管理相关的系统调用

讨论 fork 和 exec 函数族(用来用指定的程序替换当前进程的所有内容)系统调用的实现。通常这些调用不是由应用程序直接发出
的,而是通过一个中间层调用,即负责与内核通信的C标准库。

从用户状态切换到核心态的方法,依不同的体系结构而各有不同。用于在这两种状态之间切换的机制,并解释了用户空间和内核空间之间如何交换参数。就目前而言,将内核视为由C标准库使用的“程序库”即可。

1、进程复制

传统UNIX中用于复制进程的系统调用是fork。但fork并不是Linux为此实现的唯一调用,实际上Linux实现了3个。

(1) fork 是重量级调用,因为fork建立了父进程的一个完整副本,然后作为子进程执行。为减少与该调用相关的工作量,Linux使用写时复制(copy-on-write)技术。

(2) vfork 类似于 fork ,但vfork 并不创建父进程数据的副本。相反,父子进程之间共享数据。这节省了大量CPU时间(如果一个进程操纵共享数据,则另一个会自动注意到)。

vfork 设计用于子进程形成后立即执行 exec 系统调用加载新程序的情形。在子进程退出或开始新程序之前,内核保证父进程处于堵塞状态。由于 fork 使用了写时复制技术, vfork 在速度方面不再有优势,因此应该避免使用 vfork 。

(3) clone

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!