Rus*_*lia 60 unix linux multithreading fork programming-languages
我之前在我的应用程序中使用过线程并且很好地了解它的概念,但是最近在我的操作系统讲座中我遇到了fork().这与线程类似.
我谷歌搜索他们之间的差异,我开始知道:
但是,我脑子里还有一些问题.
Nie*_*jes 54
分叉和线程方法之间的主要区别在于操作系统架构.在Unix设计的时代,分叉是一个简单,简单的系统,可以最好地满足大型机和服务器类型的要求,因为它在Unix系统上得到了普及.当Microsoft从头开始重新构建NT内核时,它更多地关注线程模型.因此,今天仍然存在显着差异,因为Unix系统在分叉时效率很高,并且Windows在线程方面效率更高.你可以在Apache中看到这一点,它在Unix上使用prefork策略,在Windows上使用线程池.
特别针对您的问题:
什么时候你应该更喜欢fork()而不是线程和反之?
在Unix系统上,您执行的任务远比仅实例化工作程序要复杂得多,或者您需要单独进程的隐式安全沙箱.
如果我想作为孩子调用外部应用程序,那么我应该使用fork()或线程来做吗?
如果孩子将使用相同的代码对父母执行相同的任务,请使用fork.对于较小的子任务,请使用线程.对于单独的外部进程,请不要使用,只需使用正确的API调用即可调用它们
在进行谷歌搜索时,我发现有人说在线程中调用fork()是件坏事.为什么人们想在类似的东西中调用线程内的fork()?
不完全确定,但我认为复制流程和大量子线程在计算上相当昂贵.
fork()是否无法利用多处理器系统,因为父进程和子进程不同时运行?
这是错误的,fork创建了一个新进程,然后利用OS任务调度程序中进程可用的所有功能.
小智 33
分叉过程称为重量级过程,而线程过程称为轻量级过程.
以下是它们之间的区别:

Bri*_*new 13
fork()正如您所指出的那样,会产生一个新的过程副本.上面没有提到的是exec()通常遵循的呼叫.这将使用新进程(新的可执行文件)替换现有进程,因此,fork()/ exec()是从旧进程生成新进程的标准方法.
例如,shell是如何从命令行调用进程的.你指定你的进程(ls比方说)和shell分叉然后执行ls.
请注意,这与线程的操作级别非常不同.线程在进程内运行多行执行.分叉是创建新流程的一种手段.