小编典典

分叉与线程

linux

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

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

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

但是,我仍然有一些疑问。

  1. 什么时候应该更喜欢fork()而不是线程?
  2. 如果我想以子代身份调用外部应用程序,那么应该使用fork()还是线程来执行此操作?
  3. 在进行Google搜索时,我发现有人说在线程内调用fork()是一件坏事。人们为什么在做类似的事情时想在线程内调用fork()?
  4. 因为父级和子级进程无法同时运行,fork()不能利用多处理器系统是真的吗?

阅读 277

收藏
2020-06-03

共1个答案

小编典典

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

具体针对您的问题:

什么时候应该更喜欢fork()而不是线程?

在Unix系统上,您要执行的工作要比实例化工作程序复杂得多,或者您需要单独的进程的隐式安全沙箱。

如果我想以子代身份调用外部应用程序,那么应该使用fork()还是线程来执行此操作?

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

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

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

因为父级和子级进程无法同时运行,fork()不能利用多处理器系统是真的吗?

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

2020-06-03