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

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


当前回答

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

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

其他回答

示例1:JVM在单个进程中运行,JVM中的线程共享属于该进程的堆。这就是为什么多个线程可以访问同一个对象。线程共享堆并拥有自己的堆栈空间。这就是一个线程对方法及其局部变量的调用如何保持与其他线程的线程安全。但是堆不是线程安全的,必须同步以确保线程安全。

线程在共享内存空间中运行,但进程在单独的内存空间中线程是一个轻量级进程,但进程是一个重量级进程。线程是进程的一个子类型。

线程和进程都是OS资源分配的原子单元(即,有一个并发模型描述了CPU时间如何在它们之间分配,以及拥有其他OS资源的模型)。不同之处在于:

共享资源(根据定义,线程共享内存,除了堆栈和本地变量之外,它们不拥有任何东西;进程也可以共享内存,但这有一个单独的机制,由OS维护)分配空间(进程的内核空间与线程的用户空间)

格雷格·休吉尔(Greg Hewgill)对“进程”一词的Erlang含义是正确的,这里讨论了为什么Erlang可以实现轻量级进程。

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

过程

是一个正在执行的程序。它具有文本部分,即程序代码、当前活动(由程序计数器的值和处理器寄存器的内容表示)。它还包括包含临时数据(如函数参数、返回地址和局部变量)的进程堆栈和包含全局变量的数据部分。进程还可以包括堆,堆是在进程运行时动态分配的内存。

线

线程是CPU利用率的基本单位;它包括线程ID、程序计数器、寄存器集和堆栈。它与属于同一进程的其他线程共享其代码部分、数据部分和其他操作系统资源,例如打开的文件和信号。

--摘自Galvin的操作系统

进程是代码、内存、数据和其他资源的集合。线程是在进程范围内执行的一系列代码。您可以(通常)在同一进程中同时执行多个线程。