进程和线程之间的技术区别是什么?

我感觉像“进程”这样的词被过度使用了,而且还有硬件和软件线程。像Erlang这样的语言中的轻量级进程怎么样?是否有明确的理由使用一个术语而不是另一个术语?


当前回答

进程和线程之间的差异如下:

进程是程序的执行实例,而线程是进程的最小单元。进程可以划分为多个线程,而线程不能划分。进程可以被认为是一个任务,而线程可以被看作是一个轻量级的任务。进程分配单独的内存空间,而线程分配共享内存空间。进程由操作系统维护,而线程由程序员维护。

其他回答

进程和线程都是独立的执行序列。典型的区别是(同一进程的)线程在共享内存空间中运行,而进程在单独的内存空间中。

我不确定你可能指的是什么“硬件”线程和“软件”线程。线程是一种操作环境特性,而不是CPU特性(尽管CPU通常具有使线程高效的操作)。

Erlang使用术语“进程”,因为它不公开共享内存多道程序模型。称它们为“线程”意味着它们共享内存。

应用程序由一个或多个进程组成。简单地说,进程是一个正在执行的程序。一个或多个线程在进程上下文中运行。线程是操作系统分配处理器时间的基本单元。一个线程可以执行过程代码的任何部分,包括当前由另一个线程执行的部分。光纤是必须由应用程序手动调度的执行单元。纤维在调度它们的线程的上下文中运行。

从这里偷来的。

在用Python(解释语言)构建包含多线程的算法时,我惊讶地发现,与我之前构建的顺序算法相比,执行时间并没有任何改善。为了理解导致这种结果的原因,我做了一些阅读,并相信我所学到的内容提供了一个有趣的背景,可以更好地理解多线程和多进程之间的差异。

多核系统可能会执行多个线程,因此Python应该支持多线程。但Python不是一种编译语言,而是一种解释语言1。这意味着必须对程序进行解释才能运行,并且在程序开始执行之前,解释器不知道程序。然而,它所知道的是Python的规则,然后动态地应用这些规则。Python中的优化必须主要是解释器本身的优化,而不是要运行的代码。这与C++等编译语言形成对比,并对Python中的多线程产生影响。具体来说,Python使用全局解释器锁来管理多线程。

另一方面,编译语言是编译的。程序被“完全”处理,首先根据其语法定义进行解释,然后映射到语言不可知的中间表示,最后链接到可执行代码中。这个过程允许代码得到高度优化,因为在编译时所有代码都可用。在创建可执行文件时定义了各种程序交互和关系,可以做出关于优化的稳健决策。

在现代环境中,Python的解释器必须允许多线程,这必须既安全又高效。这就是解释语言与编译语言的区别所在。解释器必须不干扰来自不同线程的内部共享数据,同时优化处理器的计算使用。

如前几篇文章所述,进程和线程都是独立的顺序执行,主要区别在于内存在进程的多个线程之间共享,而进程隔离了它们的内存空间。

在Python中,全局解释器锁防止不同线程同时访问数据。它要求在任何Python程序中,任何时候只能执行一个线程。另一方面,可以运行多个进程,因为每个进程的内存都与任何其他进程隔离,并且进程可以在多个内核上运行。


唐纳德·克努思在《计算机编程的艺术:基本算法》中对解释例程有很好的解释。

流程:

过程是一个沉重的过程。进程是一个单独的程序,具有单独的内存、数据、资源等。进程是使用fork()方法创建的。进程之间的上下文切换非常耗时。

例子:比如,打开任何浏览器(mozilla、Chrome、IE)。此时,新流程将开始执行。

线程:

线程是轻量级进程。线程被捆绑在进程内部。线程具有共享内存、数据、资源、文件等。线程是使用clone()方法创建的。线程之间的上下文切换不像Process那样耗时。

线程和进程之间的区别?

进程是应用程序的执行实例,线程是进程内的执行路径。此外,一个进程可以包含多个线程。需要注意的是,一个线程可以做一个进程所能做的任何事情。但是,由于一个进程可由多个线程组成,因此可以将一个线程视为“轻量级”进程。因此,线程和进程之间的本质区别在于每个线程用来完成的工作。线程用于小型任务,而进程用于更“重量级”的任务——基本上是应用程序的执行。

线程和进程之间的另一个区别是,同一进程中的线程共享相同的地址空间,而不同的进程不共享。这允许线程读取和写入相同的数据结构和变量,也方便了线程之间的通信。进程之间的通信(也称为IPC或进程间通信)非常困难,而且资源密集。

这里总结了线程和进程之间的区别:

线程比进程更容易创建,因为它们不需要单独的地址空间。多线程需要仔细编程,因为线程共享只能由一个线程修改的数据结构一次。与线程不同,进程不共享相同的地址空间。线程被认为是轻量级的,因为它们使用资源少于流程。流程彼此独立。线程,因为它们共享同一地址空间是相互依赖的,因此请谨慎必须采取措施,以使不同的线程不会相互踩踏。这真的是另一种方式来说明上面的#2。一个进程可以由多个线程组成。