Linux进程创建

Linux进程创建很特别。许多其他的操作系统都提供了产生(spawn)进程的机制,首先在新的地址空间里创建进程,读入可执行文件,最后开始执行。Linux通常采用了与众不同的实现方式,他把上述步骤分解到两个单独的函数(步骤)中去执行:fork()和exec()。
首先fork()通过拷贝当前进程创建一个子进程。子进程与父进程的区别仅仅是多了一个PPID(父进程的进程号,子进程将其设定为被拷贝进程的PID),当然PID也是不同的,不过每个进程的PID都是不同的,要不然操作系统就没法识别和调度了。
exec()函数负责读取可执行文件并将其再如地址空间开始运行。把这两个函数组合起来使用效果和其他系统使用的单一函数效果相似。
fork()是通过简单的资源拷贝来实现创建子进程,尽管子进程有那么点和父进程的区别,这种通过简单拷贝实现的进程创建是非常低效率和耗资源的,因此人们想着去怎么提高这个效率,最后采用了一种类似与程序设计中的延迟绑定的措施,也就是“写时拷贝”。所谓写时拷贝就是内核在创建进程时不复制整个进程的地址空间,而是让父进程和子进程共享同一个拷贝。只有在需要写入的时候数据才会被复制到新的地址空间中,从而是个进程拥有各自的拷贝,也就是说在此之前都是以只读方式实现共享,何种技术使地址空间上的页拷贝被推迟到实际发生写入的时候。在页根本不会被写入的情况下,就无需再复制了。
废话了这么多,实际上也就是说Linux进程的创建是通过拷贝来实现的,然后对这个拷贝方式和时间进行了优化,出现了写时拷贝这么个东西。

此条目发表在 Operating System 分类目录,贴了 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

*

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">