分叉与线程

Rus*_*lia 60 unix linux multithreading fork programming-languages

我之前在我的应用程序中使用过线程并且很好地了解它的概念,但是最近在我的操作系统讲座中我遇到了fork().这与线程类似.

我谷歌搜索他们之间的差异,我开始知道:

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

但是,我脑子里还有一些问题.

  1. 什么时候你应该更喜欢fork()而不是线程和反之?
  2. 如果我想作为孩子调用外部应用程序,那么我应该使用fork()或线程来做吗?
  3. 在进行谷歌搜索时,我发现有人说在线程中调用fork()是件坏事.为什么人们想在类似的东西中调用线程内的fork()?
  4. fork()是否无法利用多处理器系统,因为父进程和子进程不同时运行?

Nie*_*jes 54

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

特别针对您的问题:

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

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

如果我想作为孩子调用外部应用程序,那么我应该使用fork()或线程来做吗?

如果孩子将使用相同的代码对父母执行相同的任务,请使用fork.对于较小的子任务,请使用线程.对于单独的外部进程,请不要使用,只需使用正确的API调用即可调用它们

在进行谷歌搜索时,我发现有人说在线程中调用fork()是件坏事.为什么人们想在类似的东西中调用线程内的fork()?

不完全确定,但我认为复制流程和大量子线程在计算上相当昂贵.

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

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

  • 在Unix上,用于调用外部程序的正确API是fork,后跟exec(我在这里省略了一些额外的细节).对于某些特殊情况,有更简单的替代方案(主要是popen). (2认同)

小智 33

分叉过程称为重量级过程,而线程过程称为轻量级过程.

以下是它们之间的区别:

  1. 分叉进程被视为子进程,而线程进程被称为兄弟进程.
  2. 分叉进程与父进程不共享代码,数据,堆栈等资源,而线程进程可以共享代码但有自己的堆栈.
  3. 进程切换需要OS的帮助,但不需要线程切换
  4. 创建多个进程是一项资源密集型任务,而创建多个线程则是资源密集型任务较少
  5. 每个进程可以独立运行,而一个线程可以读/写另一个线程数据.线程和过程讲座 在此输入图像描述

  • 我不认为它是如何在不提出一些问题的情况下获得大量选票的。1)分叉进程被认为是子进程,而线程进程被称为兄弟进程。--这一点无关紧要,机器不关心你是子进程还是兄弟进程。2)进程切换需要操作系统的帮助,但线程切换不是必需的——它需要,除非您使用称为用户态线程的东西。3)创建多个进程是资源密集型任务,而创建多个线程是资源密集型任务——取决于实现。 (4认同)

Bri*_*new 13

fork()正如您所指出的那样,会产生一个新的过程副本.上面没有提到的是exec()通常遵循的呼叫.这将使用新进程(新的可执行文件)替换现有进程,因此,fork()/ exec()是从旧进程生成新进程的标准方法.

例如,shell是如何从命令行调用进程的.你指定你的进程(ls比方说)和shell分叉然后执行ls.

请注意,这与线程的操作级别非常不同.线程在进程内运行多行执行.分叉是创建流程的一种手段.