gpt4 book ai didi

linux系统调用创建进程和线程

转载 作者:IT王子 更新时间:2023-10-28 23:57:38 25 4
gpt4 key购买 nike

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

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

编辑:
引用文章:

Replacing pthreads with processes is surprisingly inexpensive, especially on Linux where both pthreads and processes are invoked using the same underlying system call.

最佳答案

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

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

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

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

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

关于linux系统调用创建进程和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9477753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com