题 进程和线程有什么区别?


进程和线程之间的技术差异是什么?

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


1231
2017-10-14 09:13


起源


有关: stackoverflow.com/questions/32294367/... - zxq9


答案:


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

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

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


1116
2017-10-14 09:15



它可能是HyperThreading(tm)的参考? - RobS
硬件线程可能是指核心内的多个线程上下文(例如HyperThreading,SMT,Sun的Niagara / Rock)。这意味着重复的寄存器文件,通过流水线传送的额外位,以及更复杂的旁路/转发逻辑等。 - Matt J
@JeshwanthKumarNK:创建一个新线程为新堆栈分配至少足够的内存。该进程由操作系统在进程A中分配。 - Greg Hewgill
这个答案似乎错了。如果进程和线程都是独立的执行序列,那么包含两个线程的进程必须有三个执行序列,而这可能不对。只有一个线程是一个执行序列 - 一个进程是一个可以容纳一个或多个执行序列的容器。 - David Schwartz
“硬件线程”是给予单独硬件资源(单独的核心,处理器或超线程)的线程。 “软件线程”是必须竞争相同处理能力的线程。 - jpmc26


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

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


在MSDN上找到这个:
关于进程和线程 

Microsoft Windows支持抢占式多任务处理,它可以创建从多个进程同时执行多个线程的效果。在多处理器计算机上,系统可以同时执行与计算机上的处理器一样多的线程。


637
2017-10-14 09:43



对于想知道为什么你不能同时格式化软盘的人: stackoverflow.com/questions/20708707/... - Computernerd
@LuisVasconcellos - 如果没有线程,那么该过程将不会执行任何操作。该过程只会将一些代码和程序状态加载到内存中。这没用多少。这就像是一条没有车辆行驶的道路。 - Scott Langham
@LuisVasconcellos - 很好。是的,您可以将线程视为在流程代码中移动并执行该代码中的指令的内容。 - Scott Langham
这个答案比接受的答案更好,因为它谈到了答案 理想 流程和线程:它们应该是单独的事物,需要单独关注。事实上,大多数操作系统的历史都比线程的发明更远,因此,在大多数操作系统中,这些问题仍然有些纠结,即使它们随着时间的推移逐渐改善。 - james large
@BKSpurgeon无论您给出的每一个解释,您都必须将您的读者从一个层次的理解带到下一个层次。不幸的是,我不能为每个读者量身定制答案,因此必须承担一定的知识水平。对于那些不知道的人,他们可以进一步搜索我使用他们不理解的术语,不能他们,直到他们达到他们理解的基点。我打算建议你提供自己的答案,但很高兴看到你已经有了。 - Scott Langham


处理:

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

线:

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

我借用了上面的信息 知识任务!博客


218
2018-03-19 14:17



Kumar:据我所知,线程不共享相同的堆栈。否则,就无法在每个代码上运行不同的代码。 - Mihai Neacsu
是的,我认为@MihaiNeacsu是对的。线程共享“代码,数据和文件”并拥有自己的“寄存器和堆栈”。从我的OS课程中滑动: i.imgur.com/Iq1Qprv.png - Shehaaz
这非常有用,因为它扩展了线程和进程以及它们之间的关系。我建议添加一个Thread的例子,特别是因为有一个用于Process。好东西! - Smithers
Kquest.co.cc链接已经死了。 - Elijah Lynn


首先,让我们看一下理论方面。您需要了解流程在概念上是什么,以理解流程和线程之间的差异以及它们之间共享的内容。

我们从章节中得到以下内容 2.2.2经典线程模型 在 现代操作系统3e 作者:Tanenbaum:

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

他继续:

查看流程的一种方式是它是一种方法   将相关资源组合在一起进程具有地址空间   包含程序文本和数据,以及其他资源。这些   资源可能包括打开的文件,子进程,待处理的警报,   信号处理程序,会计信息等。通过把他们   通过流程的形式,可以更轻松地管理它们。   流程的另一个概念通常是执行的线程   缩短到只是线程。该线程有一个程序计数器保持   跟踪下一步执行的指令。它有寄存器,哪个   保持其当前的工作变量。它有一个堆栈,其中包含   执行历史记录,每个程序调用一帧但不调用   然而从...返回。虽然一个线程必须在某个进程中执行,但是   线程及其过程是不同的概念,可以处理   分开。流程用于将资源组合在一起;线程   是计划在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 +寄存器),以便另一个线程(可能在同一个进程中,可能在不同的进程中)可以在另一个线程在主内存上等待时完成工作。这个概念有多个名称和实现,例如HyperThreading和 同时多线程 (简称SMT)。

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

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

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

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

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

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


90
2017-10-22 12:42



出色的答案!它打破了许多行话和假设。这确实让这条线显得笨拙,但是:“所以有人有想法基本上有两组线程状态(PC +寄存器)” - 这里提到的“PC”是什么? - Smithers
@Smithers PC是程序计数器或指令指针,它给出了下一条要执行的指令的地址: en.wikipedia.org/wiki/Program_counter - Robert S. Barnes
我看到你在那里做了什么。 stackoverflow.com/questions/1762418/process-vs-thread/... - Alexander Gonchiy
为什么“Stack”未列在“Per process items”下?进程和线程都有自己的堆栈。 - stackoverflowuser2010
@ stackoverflowuser2010不仅线程有堆栈。你称之为进程的是一个具有单个执行线程的进程,它是具有堆栈而不是进程的线程。 - Robert S. Barnes


解释有关并发编程的更多信息

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

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

记住普通人,

在您的计算机上,打开Microsoft Word和Web浏览器。我们称之为这两个 流程

在Microsoft Word中,您键入一些内容并自动保存。现在,你会发现编辑和保存并行发生 - 在一个线程上编辑并保存在另一个线程上。


58
2017-12-24 07:04



出色的答案,它保持简单,并提供每个用户甚至查看问题可以涉及的示例。 - Smithers
编辑/保存是进程内多个线程的一个很好的例子!


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

偷了 这里


40
2017-10-14 09:16



在其他操作系统(例如Linux)上,除了线程通常与父进程共享相同的内存空间之外,两者在操作系统级别上没有实际差异。 (因此我的downvote) - Arafangion
很好的答案(特别是有记录),因为它显示了两者之间的关系,并将其分成了一个容易预期的“下一个问题”(关于纤维)。 - Smithers


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


22
2017-10-14 09:30