我以前在应用程序中使用过线程,并且对线程的概念非常了解,但是最近在我的操作系统讲座中,我遇到了fork()。这类似于线程。
我用谷歌搜索了它们之间的区别,我知道:
但是,我仍然有一些疑问。
分叉和线程化方法之间的主要区别是操作系统体系结构之一。在Unix设计之初,fork是一个简单,简单的系统,可以最好地满足大型机和服务器类型的要求,因此在Unix系统上得到了广泛的应用。当Microsoft从头开始重新架构NT内核时,它更多地关注线程模型。因此,今天与Unix系统在分叉方面的效率和Windows在线程方面的效率更高之间仍然存在显着差异。您可以在Apache中最明显地看到这一点,Apache在Unix上使用prefork策略,在Windows上使用线程池。
具体针对您的问题:
什么时候应该更喜欢fork()而不是线程?
在Unix系统上,您要执行的工作要比实例化工作程序复杂得多,或者您需要单独的进程的隐式安全沙箱。
如果我想以子代身份调用外部应用程序,那么应该使用fork()还是线程来执行此操作?
如果孩子用相同的代码执行与父对象相同的任务,请使用fork。对于较小的子任务,请使用线程。对于单独的外部进程,都不使用它们,只需使用适当的API调用即可调用它们。
在进行Google搜索时,我发现有人说在线程内调用fork()是一件坏事。人们为什么在做类似的事情时想在线程内调用fork()?
不能完全确定,但是我认为复制一个进程和许多子线程在计算上相当昂贵。
因为父级和子级进程无法同时运行,fork()不能利用多处理器系统是真的吗?
这是错误的,fork创建了一个新进程,然后利用OS任务调度程序中进程可用的所有功能。