Linux系统调用创build进程和线程

我在一篇论文中读到,创build进程和线程的底层系统调用实际上是相同的,因此通过线程创build进程的成本并不是很高。

  • 首先,我想知道创build进程/线程的系统调用是什么(可能是示例代码或链接?)
  • 其次,作者是否正确地认为创build进程而不是线程是便宜的?

编辑:
引用文章:

使用进程replacepthread是非常便宜的,特别是在使用相同的底层系统调用调用pthread和进程的Linux上。

通常通过fork来创建进程,线程(轻量级进程)通常使用clone现在创建。 但是,有趣的是,也存在1:N的线程模型,这两个模型都不行。

forkclone都在内部映射到相同的内核函数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浏览器是一个经典的例子,其中多进程技术被认为比多线程更合适。