【问题标题】:Linux system call for creating process and thread用于创建进程和线程的 Linux 系统调用
【发布时间】:2012-03-17 16:15:48
【问题描述】:

我在paper 中读到,创建进程和线程的底层系统调用实际上是相同的,因此通过线程创建进程的成本并没有那么高。

  • 首先,我想知道创建的系统调用是什么 进程/线程(可能是示例代码或链接?)
  • 第二,是 作者正确地假设创建进程而不是 线程便宜吗?

编辑:
引用文章:

用进程替换 pthread 出奇的便宜, 特别是在同时调用 pthread 和进程的 Linux 上 使用相同的底层系统调用。

【问题讨论】:

  • 创建进程而不是线程?不,一般来说,线程是轻量级进程。但是,由于写入时复制等问题,这条线有些模糊。

标签: linux multithreading process system-calls


【解决方案1】:

创建线程的底层系统调用是clone(2)(它是特定于Linux 的)。顺便说一句,Linux 系统调用列表在syscalls(2) 上,您可以使用strace(1) 命令来了解某个进程或命令完成的系统调用。进程通常使用fork(2)(或vfork(2),这几天没多大用处)创建。但是,您可以(并且某些 C 标准库可能会这样做)使用某种特定形式的 clone 创建它们。我猜内核正在共享一些代码来实现clonefork 等...(因为某些功能,例如virtual address space 的管理很常见)。

确实,在大多数 Unix 系统上,进程创建(以及线程创建)通常都非常快(因为它们使用 copy-on-write 机制来表示 virtual memory),通常只有几分之一毫秒。但是您可能会遇到病态病例(例如thrashing),这会使时间更长。

由于大多数C standard library 在Linux 上的实现是free software,您可以研究系统上的源代码(通常是GNU glibc,但有时是musl-libc 或其他)。

【讨论】:

  • 所以它们是不同的系统调用?
  • 它们是不同的,但 AFAIU fork 可以用 clone 实现(但比它早了十几年)。
【解决方案2】:

进程通常使用fork 创建,现在线程(轻量级进程)通常使用clone 创建。然而,有趣的是,也存在 1:N 线程模型,但它们也不这样做。

forkclone 在内部映射到相同的内核函数 do_fork。这个函数可以创建一个与旧进程共享地址空间的轻量级进程,也可以创建一个单独的进程(以及许多其他选项),具体取决于您提供给它的标志。 clone 系统调用或多或少是该内核函数的直接转发(并由更高级别的线程库使用),而 forkdo_fork 包装到具有 50 年历史的传统 Unix 函数的功能中。

重要的区别在于fork 保证创建一个完整的、单独的地址空间副本。正如 Basil 正确指出的那样,现在是通过写时复制完成的,因此并不像人们想象的那么昂贵。
当你创建一个线程时,它只是重用了原来的地址空间和相同的内存。

但是,由于写入时复制,不应假设在类 unix 系统上创建进程通常是“轻量级”的。它比在 Windows 下要轻一些,但它远非免费。
一个原因是,虽然没有复制实际的页,但新进程仍然需要页表的副本。对于使用大量内存的进程,这可能是几千字节到几兆字节的内存。 另一个原因是,虽然写时复制是不可见的,并且是一个巧妙的优化,但它不是免费的,它不能变魔术。当数据被任一进程修改时,这不可避免地会发生,受影响的页面会出错。

Redis 是一个很好的例子,你可以看到 fork 不是轻量级的(它使用 fork 进行后台保存)。

【讨论】:

  • 谢谢。我搜索了do_fork,找到了它的来源。有没有关于如何使用的文档?
  • 除非你写内核代码,否则你根本不会直接调用do_fork。一般情况下,您可能也不想使用clone(建议改用构建在它之上的 pthreads 库)。无论如何,如果您确实想要使用clone,文档是here。另一方面,现在fork 是您可能真正想要使用的东西,文档是on the same site
  • 我正在对这篇论文进行评论,我想知道实际情况如何。我找到了forkpthread_create 的源代码。但我找不到任何致电do_fork
  • 不幸的是,谷歌代码搜索已经关闭,并且 Koders 是一个磨难的工作......这里是some implementations(在不同的拱子文件夹中有不同的,但可能没有太大区别,如果在all) 对于我可以通过快速搜索找到的 sys_fork 和 sys_clone。
  • 非常感谢。正是我想要的。
猜你喜欢
  • 1970-01-01
  • 2011-08-17
  • 1970-01-01
  • 2014-05-17
  • 1970-01-01
  • 2011-10-18
  • 2014-02-18
  • 2011-04-22
  • 1970-01-01
相关资源
最近更新 更多