分叉与线程

新手上路,请多包涵

我以前在我的应用程序中使用过线程并且非常了解它的概念,但最近在我的操作系统讲座中我遇到了 fork()。这类似于线程。

我用谷歌搜索了它们之间的区别,我知道:

  1. Fork 只不过是一个看起来与旧进程或父进程完全相同的新进程,但它仍然是具有不同进程 ID 并拥有自己的内存的不同进程。
  2. 线程是具有较少开销的轻量级进程

但是,我心中仍有一些疑问。

  1. 什么时候你应该更喜欢 fork() 而不是线程,反之亦然?
  2. 如果我想调用一个外部应用程序作为一个孩子,那么我应该使用 fork() 还是线程来做呢?
  3. 在进行谷歌搜索时,我发现人们说在线程中调用 fork() 是一件坏事。为什么人们在做类似的事情时要在线程内调用 fork()?
  4. 由于父进程和子进程不同时运行,fork() 不能利用多处理器系统,这是真的吗?

原文由 Rushabh RajeshKumar Padalia 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 511
2 个回答

分叉和线程方法之间的主要区别在于操作系统架构之一。早在 Unix 设计的时候,fork 是一个简单的系统,可以最好地满足大型机和服务器类型的要求,因此它在 Unix 系统上得到了普及。当微软从头开始重新构建 NT 内核时,它更多地关注线程模型。因此,今天仍然存在显着差异,Unix 系统在 fork 上的效率更高,而 Windows 在线程上的效率更高。您可以在 Apache 中最明显地看到这一点,它在 Unix 上使用 prefork 策略,在 Windows 上使用线程池。

具体到您的问题:

什么时候你应该更喜欢 fork() 而不是线程,反之亦然?

在 Unix 系统上,您执行的任务远比仅仅实例化一个工作程序要复杂得多,或者您希望单独进程的隐式安全沙箱。

如果我想调用一个外部应用程序作为一个孩子,那么我应该使用 fork() 还是线程来做呢?

如果孩子将使用相同的代码执行与父母相同的任务,请使用 fork。对于较小的子任务,使用线程。对于单独的外部进程,两者都不使用,只需使用适当的 API 调用来调用它们。

在进行谷歌搜索时,我发现人们说在线程中调用 fork() 是一件坏事。为什么人们在做类似的事情时要在线程内调用 fork()?

不完全确定,但我认为复制一个进程和许多子线程在计算上相当昂贵。

由于父进程和子进程不同时运行,fork() 不能利用多处理器系统,这是真的吗?

这是错误的,fork 创建了一个新进程,然后该进程利用了 OS 任务调度程序中进程可用的所有功能。

原文由 Niels Keurentjes 发布,翻译遵循 CC BY-SA 3.0 许可协议

分叉的进程称为重量级进程,而线程化的进程称为轻量级进程。

以下是它们之间的区别:

  1. 分叉进程被认为是子进程,而线程进程被称为兄弟进程。
  2. 分叉进程不与父进程共享代码、数据、堆栈等资源,而线程进程可以共享代码但有自己的堆栈。
  3. 进程切换需要操作系统的帮助,但不需要线程切换
  4. 创建多个进程是资源密集型任务,而创建多个线程是资源密集型任务
  5. 每个进程可以独立运行,而一个线程可以读取/写入另一个线程数据。线程与流程 讲座 在此处输入图像描述

原文由 Selvaperumal 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题