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

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


当前回答

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

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

其他回答

流程:

进程基本上是一个正在执行的程序。它是一个活跃的实体。一些操作系统使用术语“任务”来指代正在执行的程序。进程总是存储在也称为主存储器或随机存取存储器的主存储器中。因此,流程被称为活动实体。如果重新启动机器,它将消失。多个进程可以与同一程序相关联。在多处理器系统上,可以并行执行多个进程。在单处理器系统上,虽然没有实现真正的并行性,但应用了进程调度算法,处理器被调度为每次执行一个进程,从而产生并发的错觉。示例:执行“计算器”程序的多个实例。每个实例都称为一个过程。

线程:

线程是进程的子集。它被称为“轻量级进程”,因为它类似于真实进程,但在进程的上下文中执行,并共享内核分配给进程的相同资源。通常,一个进程只有一个控制线程——一次执行一组机器指令。进程也可以由并发执行指令的多个执行线程组成。多个控制线程可以利用多处理器系统上可能的真正并行性。在单处理器系统上,应用线程调度算法,并调度处理器每次运行一个线程。进程中运行的所有线程共享相同的地址空间、文件描述符、堆栈和其他与进程相关的属性。由于进程的线程共享相同的内存,因此在进程内同步对共享数据的访问变得空前重要。

参考-https://practice.geeksforgeeks.org/problems/difference-between-process-and-thread

首先,让我们看看理论方面。您需要从概念上理解什么是进程,才能理解进程和线程之间的区别以及它们之间的共享。

Tanenbaum在第2.2.2节现代操作系统的经典线程模型3e中介绍了以下内容:

流程模型基于两个独立的概念:资源分组和执行。有时将它们分开是有用的;这是线程进入的地方。。。。

他继续说道:

看待过程的一种方式是将相关资源分组在一起。进程具有地址空间包含程序文本和数据以及其他资源。这些资源可以包括打开的文件、子进程、挂起的警报等,信号处理器、会计信息等。通过将它们以流程的形式结合在一起,可以更容易地管理它们。进程的另一个概念是执行线程,通常缩短为仅螺纹。线程有一个程序计数器跟踪下一步要执行的指令。它有寄存器保持其当前工作变量。它有一个堆栈,其中包含执行历史,每个过程调用一帧,但未调用但从返回。尽管线程必须在某些进程中执行线程及其进程是不同的概念分别地。流程用于将资源分组在一起;螺纹是计划在CPU上执行的实体。

接下来,他提供了下表:

Per process items             | Per thread items
------------------------------|-----------------
Address space                 | Program counter
Global variables              | Registers
Open files                    | Stack
Child processes               | State
Pending alarms                |
Signals and signal handlers   |
Accounting information        |

让我们来处理硬件多线程问题。传统上,CPU将支持单个执行线程,通过单个程序计数器(PC)和一组寄存器来维护线程的状态。但当缓存未命中时会发生什么?从主内存中获取数据需要很长时间,而当这发生时,CPU只是闲置在那里。所以有人想到了基本上有两组线程状态(PC+寄存器),这样另一个线程(可能在同一个进程中,也可能在不同的进程中)就可以在其他线程等待主内存时完成工作。这个概念有多种名称和实现,例如超线程和同时多线程(简称SMT)。

现在让我们看看软件方面。基本上有三种方法可以在软件端实现线程。

用户空间线程内核进程两者的结合

实现线程所需要的是保存CPU状态和维护多个堆栈的能力,这在许多情况下可以在用户空间中完成。用户空间线程的优点是超快速的线程切换,因为您不必陷入内核,也不必按照自己喜欢的方式调度线程。最大的缺点是无法阻止I/O(这会阻止整个进程及其所有用户线程),这是我们首先使用线程的主要原因之一。在许多情况下,使用线程阻止I/O大大简化了程序设计。

除了将所有调度问题留给操作系统之外,内核线程还具有能够使用阻塞I/O的优点。但每个线程切换都需要捕获内核,这可能会相对较慢。然而,如果由于I/O阻塞而切换线程,这实际上不是问题,因为I/O操作可能已经将您困在内核中。

另一种方法是将两者结合起来,多个内核线程每个都有多个用户线程。

因此,回到术语问题,您可以看到流程和执行线程是两个不同的概念,您选择使用哪个术语取决于您所谈论的内容。关于“轻量级过程”这一术语,我个人看不出其中的意义,因为它并没有像“执行线程”这一词那样真正传达出正在发生的事情。

以下是我从代码项目的一篇文章中得到的内容。我想它清楚地解释了所需的一切。

线程是另一种将工作负载拆分为单独的执行流。线程的重量比进程轻。这这意味着,它提供的灵活性不如全面流程,但可以启动速度更快,因为操作系统设置当程序由两个或多个线程组成时线程共享单个内存空间。进程被赋予单独的地址空间。所有线程共享一个堆。但每个线程都有自己的堆栈。

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

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

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