进程和线程之间的技术区别是什么?
我感觉像“进程”这样的词被过度使用了,而且还有硬件和软件线程。像Erlang这样的语言中的轻量级进程怎么样?是否有明确的理由使用一个术语而不是另一个术语?
进程和线程之间的技术区别是什么?
我感觉像“进程”这样的词被过度使用了,而且还有硬件和软件线程。像Erlang这样的语言中的轻量级进程怎么样?是否有明确的理由使用一个术语而不是另一个术语?
当前回答
基本上,线程是进程的一部分,如果没有进程线程就无法工作。线程是轻量级的,而进程是重量级的。进程之间的通信需要一些时间,而线程需要更少的时间。线程可以共享同一个内存区域,而进程则单独存在。
其他回答
到目前为止,我找到的最好答案是Michael Kerrisk的《Linux编程界面》:
在现代UNIX实现中,每个进程可以有多个线程执行。设想线程的一种方式是作为一组进程共享同一虚拟内存以及一系列其他属性。每个线程执行相同的程序代码并共享相同的数据区域和堆。但是,每个线程都有自己的堆栈包含局部变量和函数调用链接信息。[LPI 2.12]
这本书非常清晰;JuliaEvans在本文中提到了它在澄清Linux组真正工作方式方面的帮助。
来自嵌入式世界,我想补充一点,进程的概念只存在于具有MMU(内存管理单元)的“大型”处理器(台式CPU、ARM Cortex A-9)和支持使用MMU的操作系统(如Linux)中。对于小型/老式处理器和微控制器以及小型RTOS操作系统(实时操作系统),如freeRTOS,没有MMU支持,因此没有进程,只有线程。
线程可以访问彼此的内存,并且它们由OS以交错的方式调度,因此它们看起来是并行运行的(或者对于多核线程,它们实际上是并行运行)。
另一方面,进程则生活在由MMU提供和保护的私有虚拟内存沙盒中。这很方便,因为它可以:
防止错误进程导致整个系统崩溃。通过使其他流程数据不可见和无法访问。进程内的实际工作由一个或多个线程负责。
将流程视为一个所有权单位或任务所需的资源。进程可以具有内存空间、特定输入/输出、特定文件和优先级等资源。
线程是一个可调度的执行单元,或者简单地说是一系列指令的进程
对于那些更喜欢通过可视化学习的人来说,这里是我创建的一个方便的图表,用于解释流程和线程。我使用了MSDN中的信息-关于进程和线程
我从知识探索中复制了这些信息!博客:
流程:程序的执行实例称为进程。一些操作系统使用术语“任务”来指代正在执行的程序。进程总是存储在也称为主存储器或随机存取存储器的主存储器中。因此,流程被称为活动实体。如果重新启动机器,它将消失。多个进程可以与同一程序相关联。在多处理器系统上,可以并行执行多个进程。在单处理器系统上,虽然无法实现真正的并行性,但应用了进程调度算法,处理器计划每次执行一个过程,产生一种错觉并发性。示例:执行“计算器”程序的多个实例。每个实例都称为一个过程。线程:线程是进程的子集。它被称为“轻量级进程”,因为它类似于真实进程,但在进程的上下文中执行并共享内核分配给进程的相同资源。通常,一个进程只有一个控制线程——一次执行一组机器指令。进程也可以由并发执行指令的多个执行线程组成。多个控制线程可以利用多处理器系统上可能的真正并行性。在单处理器系统上,应用线程调度算法,并调度处理器每次运行一个线程。进程中运行的所有线程共享相同的地址空间、文件描述符、堆栈和其他与进程相关的属性。由于进程的线程共享相同的内存,同步进程内共享数据的访问将获得前所未有的效果重要性