分叉与线程

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

我谷歌search他们之间的差异,我来知道:

  1. 叉只不过是一个新的过程,看起来完全像旧的或父过程,但它仍然是一个不同的过程,具有不同的过程ID和拥有自己的记忆。
  2. 线程是轻量级的过程,具有较less的开销

但是,我脑海里还有一些问题。

  1. 你应该什么时候更喜欢叉(),而不是线程和副诗?
  2. 如果我想调用一个外部应用程序作为一个孩子,那么我应该使用fork()或线程来做到这一点?
  3. 在search谷歌时,我发现有人说在一个线程中调用一个fork()是件坏事。 为什么当人们做类似的事情时,人们想在线程中调用一个fork()?
  4. 是否真的fork()不能利用多处理器系统,因为父进程和subprocess不能同时运行?

分叉和线程方法的主要区别在于操作系统体系结构。 早在设计Unix时,fork就是一个简单易用的系统,能够最好地满足大型机和服务器类型的要求,因此它在nix系统上得到了普及。 MS从零开始重新构建NT内核时,更侧重于线程模型。 因此,今天仍然有一个显着的差异,与分叉有效的nix系统和Windows更高效的线程。 你可以最明显地看到这在Apache使用nix prefork策略,并在Windows上的线程池。

具体到您的问题:

你应该什么时候更喜欢叉(),而不是线程和副诗?

在一个nix系统上,你正在做一个比实例化一个worker更复杂的任务,或者你需要单独进程的隐式安全沙箱。

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

如果孩子将完成与父母相同的任务,使用相同的代码,则使用分叉。 对于较小的子任务使用线程。 对于单独的外部进程,既不使用,只需使用适当的API调用来调用它们。

在搜索谷歌时,我发现有人说在一个线程中调用一个fork()是件坏事。 为什么当人们做类似的事情时,人们想在线程中调用一个fork()?

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

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

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

分叉过程称为重量过程,而螺纹过程称为轻量过程。

以下是它们之间的区别。

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

fork()产生了一个新的进程副本,正如你所指出的那样。 以上没有提到的是经常使用的exec()调用。 这将用一个新的进程(一个新的可执行文件)替换现有的进程,因此fork() / exec()是从旧进程中产生一个新进程的标准方法。

例如,这就是你的shell将从命令行调用一个进程的方式。 你指定你的进程( ls说)和shell分支,然后执行ls

请注意,这与线程的运行水平截然不同。 线程运行内部进程的多行执行。 分叉是创建流程的手段。