我在一篇论文中读到,创build进程和线程的底层系统调用实际上是相同的,因此通过线程创build进程的成本并不是很高。
编辑:
引用文章:
使用进程replacepthread是非常便宜的,特别是在使用相同的底层系统调用调用pthread和进程的Linux上。
通常通过fork
来创建进程,线程(轻量级进程)通常使用clone
现在创建。 但是,有趣的是,也存在1:N的线程模型,这两个模型都不行。
fork
和clone
都在内部映射到相同的内核函数do_fork
。 这个函数可以创建一个轻量级的进程,与旧进程共享地址空间,也可以创建一个单独的进程(以及许多其他选项),具体取决于提供给它的标志。 clone
系统调用或多或少是该内核函数的直接转发(并被更高级别的线程库使用),而fork
将50年前的传统Unix函数的功能包装为do_fork
。
最重要的不同之处在于, fork
保证了一个完整的,独立的地址空间副本。 正如罗勒指出的那样,现在已经完成了写下复制的工作,因此并不像人们想象的那么昂贵。
当你创建一个线程时,它只是重用了原来的地址空间和相同的内存。
但是,人们不应该认为创建进程通常是因为写入时复制而在类Unix系统上“轻量级”的。 它比Windows下的实例稍微重要一些,但是它远没有免费。
一个原因是虽然实际的页面没有被复制,但新的过程仍然需要页表的副本。 对于使用大量内存的进程,这可能是几千字节到兆字节的内存。 另一个原因是,虽然写入复制是不可见的,而且是一个聪明的优化,但它不是免费的,它不能做到魔术。 当数据被两个不可避免的进程修改时,受影响的页面都会出错。
Redis是一个很好的例子,你可以看到fork
是一切,但是轻量级的(它使用fork
来做后台保存)。
创建线程的底层系统调用是clone(2) (这是Linux特定的)。 通常使用fork(2)创建进程。
事实上,在大多数Unix系统上,进程创建速度相当快(因为它们使用了虚拟内存 的写时复制机制)。
如果你使用C,这里有一些可能帮助你的东西:
叉 – 创建过程: http : //en.wikipedia.org/wiki/Fork_(operating_system )
线程的Pthreads库: http : //en.wikipedia.org/wiki/POSIX_Threads
如果您使用C ++,则可以检查Boost线程库以获取线程。
Google Chrome浏览器是一个经典的例子,其中多进程技术被认为比多线程更合适。