是什么叉子和线程之间的区别?是什么叉子和线程之间的区别?(What is the differenc

2019-05-13 03:55发布

谁能解释叉子和线程之间的区别?

Answer 1:

叉给你一个全新的过程,这是当前进程的副本,具有相同的代码段。 由于存储图像的变化(通常这是由于这两个过程的不同的行为),你得到的存储图像的分离(写时复制),但可执行代码保持不变。 除非他们使用的一些任务不共享存储器进程间通信(IPC)原语。

一个进程可以有多个线程,该方法的在同一范围内并联每个执行。 存储器和其它资源被线程之间共享,因此共享数据必须通过一些原始和同步对象进行访问(如互斥 , 条件变量和信号量 ),允许你以避免数据损坏。



Answer 2:

叉子:

叉只不过是一个新的工艺,看起来酷似老或父进程,但仍然是一个不同的过程用不同的进程ID,并有它自己的内存。 父进程创建了孩子独立的地址空间。 两个父和子过程具有相同的代码段,而是彼此独立地执行。

分叉的最简单的例子是,当你在Unix / Linux操作系统的shell中运行命令。 用户每次发出命令时,shell叉一个子进程,任务就完成了。

当发出fork系统调用,将创建所有相应的父进程页的复印件,装入由OS子进程一个独立的存储位置,但在某些情况下,这是没有必要的。 像“EXEC”的系统调用,有没有需要复制父进程页面,execv代替父进程本身的地址空间。

几件事情需要注意分叉是:

  • 子进程将有它自己独特的进程ID。
  • 子进程将有它自己的父母的文件描述符的副本。
  • 由父进程设置文件锁定,不得由子进程继承。
  • 这是在父进程中打开的任何信号灯也应在子进程中打开。
  • 子进程都有它自己父母的消息队列描述符的副本。
  • 孩子将有它自己的地址空间和内存。

主题:

线程是重量轻进程(LWP)。 传统上,一个线程仅仅是一个CPU(和其他一些最小的状态)的状态与含有残留(数据,栈,I / O,信号)的处理。 线程需要比“分叉”或产卵一个新的进程,因为系统不初始化过程中一个新的系统的虚拟内存空间和环境的开销更少。 虽然最有效的多处理器系统,其中,处理流程可以被调度到另一个处理器从而获取通过并行或分布式处理速度上运行,增益也在其上利用延迟在I / O,并且可停止过程中的其他的系统功能的单处理器系统中发现的执行。

线程在同一进程中分享到:

  • 流程说明
  • 大多数数据
  • 打开文件(描述)
  • 信号和信号处理程序
  • 当前的工作目录
  • 用户和组ID

更多细节可以发现在这里 。



Answer 3:

Dacav的答案是优秀的,我只是想补充一点,并不是所有的线程模型给你真正的多处理。

例如,Ruby的默认线程实现不使用真正的OS /内核线程。 相反,它模仿由单个内核线程/进程中的线程对象之间的切换具有多个线程。

这是在多处理器/多核心系统非常重要,因为这些类型的轻量级线程都可以在一个单一的核心只能运行 - 你不会在性能提升的方式很多,从有多个线程。

其他地方这个有差别是当一个线程块(在I / O等待或调用驱动程序的ioctl),所有线程阻塞。

这是不是很常见时下 - 最线程实现使用内核线程不从这些问题的影响 - 但它的价值mentioining的完整性。

相比之下,叉子为您提供了另一种过程,而原来的进程正在执行同时可运行在另一个物理CPU。 有些人觉得IPC更适合他们的应用程序,另一些人喜欢穿。

祝好运并玩得开心点! 多线程是兼具挑战性和奖励。



Answer 4:

  1. 线程共享创建它的进程的地址空间; 流程都有自己的地址空间。
  2. 线程具有其进程的数据段的直接访问; 流程有自己的父进程的数据段的副本。
  3. 线程可以直接与它的过程的其它线程进行通信; 过程必须使用进程间通信与同级进程通信。
  4. 帖子几乎没有开销; 过程有相当大的开销。
  5. 新语丝可轻松创建; 新工艺要求父进程的重复。
  6. 线程可以行使在同一进程的线程相当大的控制力; 流程只能行使对子女的过程控制。
  7. 变化到主线程(取消,优先级改变,等等)可能会影响该过程的其他线程的行为; 更改父进程不会影响子进程


Answer 5:

线程是并行运行的功能,叉是与父母继承的新工艺。 线程是很好的并行执行任务,同时叉是独立的过程中,也同时运行。 螺纹具有竞态条件和有控制信号量和锁或互斥,管道都可以在叉和线程使用。



文章来源: What is the difference between fork and thread?