进程和线程之间有什么区别?

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

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

答案

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

我不确定您可能指的是 “硬件” 还是 “软件” 线程。线程是操作环境功能,而不是 CPU 功能(尽管 CPU 通常具有使线程有效的操作)。

Erlang 使用术语 “过程”,因为它没有公开共享内存的多程序模型。将它们称为 “线程” 将暗示它们具有共享内存。

处理
每个过程都提供执行程序所需的资源。进程具有虚拟地址空间,可执行代码,系统对象的打开句柄,安全上下文,唯一进程标识符,环境变量,优先级类别,最小和最大工作集大小以及至少一个执行线程。每个进程都从单个线程(通常称为主线程)开始,但是可以从其任何线程中创建其他线程。

线
线程是流程中可以安排执行的实体。进程的所有线程共享其虚拟地址空间和系统资源。另外,每个线程维护异常处理程序,调度优先级,线程本地存储,唯一的线程标识符以及系统将用于保存线程上下文直到被调度的一组结构。线程上下文包括线程进程的地址空间中的线程的计算机寄存器集,内核堆栈,线程环境块和用户堆栈。线程也可以具有自己的安全上下文,可用于模拟客户端。


在 MSDN 上找到了此:
关于进程和线程

Microsoft Windows 支持抢占式多任务处理,这可以同时执行来自多个进程的多个线程。在多处理器计算机上,系统可以同时执行与计算机上处理器数量一样多的线程。

处理:

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

线:

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

我从知识探索中借用了以上信息!博客

首先,让我们看一下理论方面。您需要了解流程在概念上的含义,以了解流程与线程之间的区别以及它们之间的共享。

Tanenbaum 在2.2.2 现代操作系统中 的经典线程模型”中有以下内容:

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

他继续:

查看流程的一种方式是将相关资源组合在一起。进程的地址空间包含程序文本和数据以及其他资源。这些资源可能包括打开的文件,子进程,挂起的警报,信号处理程序,记帐信息等。通过以流程的形式将它们放在一起,可以更轻松地对其进行管理。进程具有的另一个概念是执行线程,通常简称为线程。该线程具有程序计数器,该计数器跟踪接下来要执行的指令。它具有寄存器,用于保存其当前的工作变量。它有一个堆栈,其中包含执行历史记录,每个调用但尚未返回的过程都有一帧。尽管线程必须在某个进程中执行,但是线程及其进程是不同的概念,可以单独处理。流程用于将资源分组在一起;线程是计划在 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 将支持单个执行线程,并通过单个程序计数器和寄存器集维护线程的状态。但是,如果出现缓存未命中怎么办?从主内存中获取数据需要花费很长时间,而在这种情况下,CPU 只是闲置在那里。因此,有人想到了基本具有两组线程状态(PC + 寄存器)的想法,以便另一个线程(也许在同一进程中,也许在另一个进程中)可以在另一个线程正在等待主内存的同时完成工作。此概念有多种名称和实现,例如超线程和同步多线程 (简称 SMT)。

现在让我们看一下软件方面。基本上可以通过三种方式在软件端实现线程。

  1. 用户空间线程
  2. 内核线程
  3. 两者结合

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

内核线程的优势在于,除了将所有调度问题留给 OS 之外,还可以使用阻塞 I / O。但是每个线程切换都需要陷入内核,这可能相对较慢。但是,如果由于 I / O 阻塞而切换线程,这并不是真正的问题,因为 I / O 操作可能已经将您困在了内核中。

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

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

关于并发编程的更多解释

  1. 流程具有独立的执行环境。流程通常具有一套完整的私有基本运行时资源;特别是,每个进程都有自己的存储空间。

  2. 线程存在于一个进程中 - 每个进程至少有一个。线程共享进程的资源,包括内存和打开的文件。这样可以进行有效的通信,但可能会出现问题。

牢记普通人,

在计算机上,打开 Microsoft Word 和 Web 浏览器。我们称这两个过程

用 Microsoft Word,您输入一些东西,它将自动保存。现在,您将观察到编辑和保存是并行进行的 - 在一个线程上进行编辑,然后在另一个线程上进行保存。

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

这里被盗。

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

进程和线程的真实示例 这将为您提供有关线程和进程的基本概念 在此处输入图片说明

我从 Scott Langham 的 Answer 中借用了以上信息 - 谢谢

  • 每个进程都是一个线程(主线程)。
  • 但是每个线程都不是一个进程。它是过程的一部分。

处理:

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

例:
说,打开任何浏览器(mozilla,Chrome,IE)。此时,新过程将开始执行。

线程数:

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

例:
在浏览器中打开多个选项卡。