当前位置: 首页 > 面试题库 >

分叉与线程

翟奇
2023-03-14
问题内容

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

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

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

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

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

问题答案:

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

具体针对您的问题:

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

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

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

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

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

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

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

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



 类似资料:
  • 我不确定的是,在这种情况下,会创建多少个线程?我在一台2核心的机器上运行,所以每核心24个线程,最多48个线程? 当并行度因子设置为4.0时,可以并行运行的线程数将是8。那么,设置最小值和最大值(我的例子是24和48)的需要是什么?

  • 问题内容: 我知道从线程调用是一个坏主意。但是,如果线程使用创建新进程,将会发生什么? 新进程将是创建线程的主线程的子进程。我认为。 如果其父级先完成,则新进程将附加到init进程中。它的父级是主线程,而不是创建它的线程。 如果我错了,请纠正我。 问题答案: 新进程将是创建线程的主线程的子进程。我认为。 创建一个新的过程。一个进程的父进程是另一个进程,而不是线程。因此,新流程的父级是旧流程。 请注

  • 问题内容: 可以使用fork()函数复制多线程进程。如果是这样,那么所有线程都将完全相同,如果不是,为什么不这样做。如果无法通过fork完成复制,是否还有其他功能可以帮助我? 问题答案: 进行分叉后,子进程中只有一个线程正在运行。这是POSIX标准要求。

  • 我一直在研究JDK 7中的新特性,即Fork和Join。在Javadoc中,它指出,在中,不能仅在的上下文中执行fork。但是它没有提到方法调用是否创建了一个新线程。 使用工作窃取算法来平衡线程之间的工作,但没有提到实际创建了多少线程。 我有一个任务,我应该以某种方式分解它,但我担心会创建太多线程,并且会因为管理这些线程的开销而降低执行性能。 有人能帮我吗?

  • 在Chapter 4, 社会和政治的基础架构的the section called “分叉能力(forkability)”,我们说了潜在的分叉能力对于项目管理的重要影响。但是当分叉确实发生时,我们应该怎么做?你应该如何处理,会发生怎样的情况?与之对应,何时你应当开始一个分叉。 答案取决于你选择的分叉类型。有一些分叉源于对于项目方向的友善但不可调和的异议;也有一些由于技术分歧和个人冲突。当然,很难说