Electronic Joint Business

Solution for E-Business

Linux与Windows进程之比较

进程是现代操作系统的一个最基本的概念。书本上说:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。 详细点说:进程的概念主要有两点: 第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。 第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。 在Unix系统中,我们通常用 fork 来创建一个进程,相应的,在 Windows 操作系统里,我们用的是 CreateProcess,如果我们分别用 fork 和 CreateProcess 反复创建1000个进程,你可能会得出 Windows 创建进程比在 Unix 慢许多这样一个结论。然而这是事实吗? fork 时发生了什么? 我们知道linux是基于进程的操作系统,当 fork() 系统调用发生时,子进程会拷贝其父进程的所有页面,并将其加载入操作系统为它分配的一片独立内存中。这些拷贝的动作很消耗时间,而且在某些情况下并不需要这么做。如果子进程马上执行了 “exec” 系统调用(用来执行任何可执行文件)或者 fork() 之后就退出进程,拷贝父进程的页面就很不划算,因为 exec 后包括代码段,数据段和堆栈等都已经被新的内容取代,只留下进程ID等一些表面上的信息仍保持原样,而如果 fork 完之后我们马上就调用 exec,这些辛辛苦苦拷贝来的东西又会被立刻抹掉。 在这种情况下,一种叫copy-on-write (随拷随写)(COW)的技术被采用了,当 fork 发生时,父进程的页面并没有被拷贝到子进程中,相反,这些页面被父进程和子进程所共享。无论父子进程中谁要去修改页面,系统就为该进程拷贝一个独立的特定页面,然后再对其进行修改。该进程以后就只使用这个新拷贝的页面而不再是共享的那个,而别的进程则继续使用共享的页面。这项技术就叫COW,因为当有进程要写页面的时候,就需要先拷贝页面。 采用了 COW 技术,Fork 时,子进程只需要拷贝父进程的页面表就可以了。产生这种设计是因为有时兼容 POSIX 的操作系统在 fork 之后,并不需要执行 Exec,比如Apache Web Server 就因此而受益,这时候的 fork 让你想起点什么?恩,有点接近 Windows 的 […]

,

Comments are currently closed.