什么是流程和线程?

时间:2010-02-23 16:39:16

标签: c++ multithreading process operating-system

是的,我读过许多与操作系统相关的资料。我还在读书。但似乎所有这些都是以“抽象”的方式描述过程和线程,这使得他们的行为和逻辑组织得到了很多高层次的阐述。 我想知道他们物理是什么?在我看来,它们只是一些内存中的“数据结构”,它们由内核代码维护和使用,以方便执行的计划。例如,操作系统使用某些过程数据结构(PCB)来描述为某个程序分配的过程的各个方面,例如其优先级,地址空间等。这样可以吗?

22 个答案:

答案 0 :(得分:29)

首先要了解流程和线程之间的区别,事实上,流程不会运行,线程会

那么,什么是线程?最接近我可以解释它是一个执行状态,如:CPU寄存器,堆栈,批次的组合。您可以通过在任何给定时刻打破调试器来查看该证明。你看到了什么?一个调用堆栈,一组寄存器。这就是它。这就是主题。

现在,什么是流程。好吧,它就像一个用于运行线程的抽象“容器”实体。就操作系统的第一个近似而言,它是一个实体操作系统分配一些虚拟机,分配一些系统资源(如文件句柄,网络套接字),& c。

他们如何一起工作?操作系统通过为其保留一些资源并启动“主”线程来创建“进程”。然后该线程可以产生更多线程。这些是一个过程中的线程。他们或多或少可以以这种或那种方式共享这些资源(比如说,他们可能需要锁定以免破坏其他人的乐趣)。从那时起,OS通常负责维护那些线程“内部”VM(检测并阻止尝试访问不属于该进程的内存),提供某种类型的线程调度,以便它们可以运行“一后另一个和 - 未只是酮全的时间”。

答案 1 :(得分:28)

通常,当您运行像notepad.exe这样的可执行文件时,会创建一个进程。这些进程可能会产生其他进程,但在大多数情况下,您运行的每个可执行文件都有一个进程。在这个过程中,可以有很多线程。通常起初有一个线程,通常从程序“入口点”开始,通常是main函数。指令按顺序逐个执行,就像只有一只手的人一样,一个线程在进入下一个之前一次只能做一件事。

第一个线程可以创建其他线程。每个附加线程都有自己的入口点,通常用函数定义。该过程就像是在其中生成的所有线程的容器。

这是一个非常简单的解释。我可以详细介绍,但可能与您在教科书中找到的内容重叠。

编辑:你会注意到我的解释中有很多“通常”的东西,因为偶尔有一些罕见的程序会做出截然不同的事情。

答案 2 :(得分:10)

答案 3 :(得分:7)

请查看我之前在SO上提供的详细答案。它深入了解了负责维护进程和线程的玩具内核结构......

希望这有帮助, 最好的祝福, 汤姆。

答案 4 :(得分:7)

我会说:

进程有一个内存空间,打开的文件,......和一个或多个线程。

线程是可以由系统在处理器上调度的指令流。

答案 5 :(得分:5)

我们已经多次讨论过这个问题。也许你会在这里找到一些有用的信息:

What is the difference between a process and a thread

Process vs Thread

Thread and Process

答案 6 :(得分:4)

进程是执行程序时使用的一组资源的容器。

流程包括以下内容:

  • 私人虚拟地址空间
  • 一个程序。
  • 句柄列表。
  • 访问令牌。
  • 唯一的进程ID。
  • 至少有一个帖子。
  • 指向父进程的指针,无论进程是否仍然存在。

话虽如此,一个进程可以包含多个线程。

进程本身可以分组为作业,作为进程的容器并作为单个单元执行。

线程是Windows用来计划CPU上指令执行的内容。每个流程至少有一个。

我的维基上有几页你可以看一下:

Process

Thread

答案 7 :(得分:3)

正如您所说,线程是操作系统调度程序中的内存结构。线程指向内存中某些指令的开始,并在调度程序决定它们时处理这些指令。线程正在执行时,硬件计时器将运行。一旦达到所需的时间,就会调用一个中断。在此之后,硬件将停止执行当前程序,并将调用已注册的中断处理程序函数,该函数将成为调度程序的一部分,以通知当前线程已完成执行。

答案 8 :(得分:3)

物理:

  • 进程是一种维护拥有凭据,线程列表和打开句柄列表的结构

  • Thread是一个包含 context 的结构(即保存的寄存器集+要执行的位置),一组PTE描述哪些页面映射到进程的虚拟地址空间,和一个所有者。

这当然是一个非常简化的解释,但它得到了重要的一点。 Linux和Windows上的基本执行单元是Thread - 内核调度程序并不关心进程(很多)。这就是为什么在Linux上,线程只是一个恰好与另一个进程共享PTE的进程。

答案 9 :(得分:2)

很难给出一个简短的答案来解决这个问题的正义。

冒着让这个可怕的错误和简单的事情的风险,你可以说线程&流程是操作系统/平台的概念;在引擎盖下,您可以通过

定义单线程进程
  • 低级CPU指令(又名程序)。
  • 执行状态 - 表示指令指针(实际上是特殊寄存器),寄存器值和堆栈
  • 堆(又名通用内存)。

在现代操作系统中,每个进程都有自己的内存空间。除了共享内存(只​​有一些操作系统支持此操作),操作系统禁止一个进程写入另一个进程的内存空间。在Windows中,如果进程尝试,您将看到一般性保护错误。

所以你可以说多线程进程是整个包。每个线程基本上只不过是执行状态。

因此当一个线程抢占另一个线程时(例如,在单处理器系统上),所有操作系统原则上都必须保存线程的执行状态(不确定是否必须这样做)任何特殊的堆栈)和加载到另一个。

另一方面,抢占整个过程的成本更高,你可以想象。

编辑:这些想法也适用于像Java这样的抽象平台。

答案 10 :(得分:2)

进程是操作系统管理的内存区域,用于运行应用程序。线程是运行专用任务的进程内存中的一小块区域。

答案 11 :(得分:1)

如果这就是你所要求的,那么它们不是弦乐的物理片段。 ;)

据我了解,操作系统内部几乎所有内容都只是数据。现代操作系统依赖于一些硬件要求:虚拟内存地址转换,中断和内存保护(在启动过程中会出现很多模糊的硬件/软件魔法,但我对这个过程并不是很熟悉)。一旦这些物理要求到位,其他一切都取决于操作系统设计者。这些都只是大块的数据。

答案 12 :(得分:1)

进程和线程是抽象 - 它们没有任何实际内容,也没有任何其他部分 操作系统就此而言。这就是我们称之为软件的原因。

如果您以物理方式查看计算机,最终会出现混乱 模仿Turing Machine所做的事情的电子产品。 尝试用原始的Truing Machine做任何有用的事情都会让你的大脑转向Jell-O 五分钟。避免 这种不愉快的经历,计算机人员开发了一套抽象来划分 计算的各个方面。这使您可以专注于抽象级别 感兴趣的你不必担心支持它的所有其他东西。 有些东西被投射到电路中(例如加法器等),这使得它们是物理的但是 我们合作的绝大部分内容都是基于一组抽象。作为一般规则,抽象 我们使用它们有某种形式的数学基础。这就是为什么堆栈, 队列和“国家”在计算中发挥着如此重要的作用 - 有一个有根据的 围绕这些抽象的数学集合让我们建立并推理 他们的操纵。

关键是要意识到软件总是基于a “事物”抽象模型的复合。那些“事物”并不总是与之相关 任何物理的东西,更可能与其他一些抽象有关。这就是为什么 你无法为进程和线程找到令人满意的“物理”基础 在教科书的任何地方。

其他几个人发布了有关线程和内容的链接和解释 过程是,它们都没有指向任何“物理”的东西。正如你猜测的那样,他们 实际上只是一组生活在更大范围内的数据结构和规则 操作系统的上下文(反过来只是更多的数据结构和规则......)

软件就像一个洋葱,层层叠层,一旦你剥离了所有层 离开(抽象),没有多少剩下!但洋葱仍然非常真实。

答案 13 :(得分:1)

它们仅以抽象方式提及的原因是它们是概念,而它们将作为数据结构实现,没有必须如何实施的通用规则。
对于线程/进程来说,这至少是正确的,如果没有调度程序和中断计时器,它们就不会有很多好处。
调度程序是操作系统选择下一个线程运行有限时间的算法,中断计时器是一个硬件,它周期性地中断当前线程的执行并将控制权交还给调度程序。

忘记了一些事情:如果你只有合作线程,上面不是真的,合作线程必须主动控制下一个线程,这可能会因为一个线程轮询其他线程的结果而变得丑陋,等待第一个线程屈服 它们比其他线程更轻量级,因为它们不需要支持底层操作系统。

答案 14 :(得分:1)

我见过许多答案,但大多数答案对于初学者来说还不够明确。

在任何现代操作系统中,一个进程都有一个虚拟CPU,虚拟内存,虚拟I / O.

虚拟CPU:如果您有多个核心,则可能会为进程分配一个或多个核心以供调度程序处理。

虚拟I / O:I / O可能在各个进程之间共享。就像可以由多个进程共享的示例键盘一样。因此,当您键入记事本时,您会看到文本正在更改,而作为守护程序运行的键记录程序正在存储所有键击。因此,该过程正在共享I / O资源。

虚拟记忆:http://en.wikipedia.org/wiki/Virtual_memory您可以浏览链接。

因此,当一个进程从调度程序的执行状态中取出时,它的状态包含存储在寄存器中的值,它的堆栈和堆等等都会保存到数据结构中。

现在,当我们将进程与线程进行比较时,进程启动的线程共享分配给启动它的进程的虚拟I / O和虚拟内存,而不是虚拟CPU。 因此,可能有多个线程由一个进程启动,所有进程都共享相同的虚拟内存和虚拟I / O但具有不同的虚拟CPU。

因此,您了解锁定进程资源的必要性,即静态分配(堆栈)或动态分配(堆),因为虚拟内存空间在进程的线程之间共享。

此外,每个拥有自己的虚拟CPU的线程都可以在不同的内核中并行运行,并显着缩短进程的完成时间(只有在您明智地管理内存并且有多个内核时才能观察到减少)。

答案 15 :(得分:0)

使用Windows,至少一旦超过Win 3.1,操作系统(OS)包含多个进程,每个进程都有自己的内存空间,并且在没有操作系统的情况下无法与其他进程交互。

每个进程都有一个或多个共享相同内存空间但不需要操作系统与其他线程交互的线程。

答案 16 :(得分:0)

进程是线程的容器。

答案 17 :(得分:0)

线程由进程控制,进程由操作系统控制

答案 18 :(得分:0)

好吧,我还没有看到“他们身体健康”的答案。所以我试一试。

进程和线程不是物质上的。它们是操作系统的一项功能。通常,计算机的任何物理组件都不了解它们。 CPU仅处理顺序的操作码流。这些操作码可能属于一个线程。然后操作系统使用陷阱和中断重新获得控制权,决定执行哪个代码并切换到另一个线程。

答案 19 :(得分:0)

进程不会在彼此之间共享内存 - 因为它在所谓的“受保护的平面模型”中工作,另一方面,线程共享相同的内存。

答案 20 :(得分:0)

流程是一个完整的实体,例如和exe文件或一个jvm。可以存在父进程的子进程,其中exe文件在单独的空间中再次运行。线程是在同一进程中执行的单独路径,其中进程控制执行哪个线程,暂停等等。

答案 21 :(得分:0)

尝试回答有关Java世界的这个问题。

进程是程序的执行,但是线程是进程内的单个执行序列。进程可以包含多个线程。线程有时被称为轻量级进程

例如:

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

示例2: 程序可能无法通过读取击键来绘制图片。该程序必须充分注意键盘输入,并且缺乏一次处理多个事件的能力将导致麻烦。解决此问题的理想方法是同时无缝地执行程序的两个或多个部分。线程允许我们这样做。这里绘制图片是一个过程,阅读按键是子过程(线程)。