我以前在应用程序中使用过线程,并且对线程的概念非常了解,但是最近在我的操作系统讲座中,我遇到了fork()。这类似于线程。
我用谷歌搜索了它们之间的区别,我知道:
但是,我仍然有一些疑问。
分叉和线程化方法之间的主要区别是操作系统体系结构之一。在Unix设计之初,fork是一个简单,简单的系统,可以最好地满足大型机和服务器类型的要求,因此在Unix系统上得到了广泛的应用。当Microsoft从头开始重新架构NT内核时,它更多地关注线程模型。因此,今天与Unix系统在分叉方面的效率和Windows在线程方面的效率更高之间仍然存在显着差异。您可以在Apache中最明显地看到这一点,Apache在Unix上使用prefork策略,在Windows上使用线程池。
具体针对您的问题:
什么时候应该更喜欢fork()而不是线程?
在Unix系统上,您要执行的工作要比实例化工作程序复杂得多,或者您需要单独的进程的隐式安全沙箱。
如果孩子用相同的代码执行与父对象相同的任务,请使用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)”,我们说了潜在的分叉能力对于项目管理的重要影响。但是当分叉确实发生时,我们应该怎么做?你应该如何处理,会发生怎样的情况?与之对应,何时你应当开始一个分叉。 答案取决于你选择的分叉类型。有一些分叉源于对于项目方向的友善但不可调和的异议;也有一些由于技术分歧和个人冲突。当然,很难说