什么是“线程”(真的)?

时间:2011-03-05 05:16:48

标签: multithreading process definition

我一直试图找到一个好的定义,并了解线程到底是什么。

似乎我必须遗漏一些明显的东西,但每当我读到一个线程是什么时,它几乎是一个循环定义,一个“线程是一个执行的线程”或“一种分成运行任务的方法”。呃呃。咦?

从我所读到的内容看来,一个线程实际上不是某些东西具体,就像一个过程一样。它实际上只是一个概念。根据我对其工作方式的理解,处理器为程序执行一些命令(已被称为执行线程),然后当需要切换到处理某个其他程序时bit,它存储当前正在某处执行的程序的 state (线程本地存储),然后开始执行其他程序的指令。而来回。这样,一个线程实际上只是当前正在运行的程序“执行路径之一”的概念。

与一个真正有效的过程不同 - 它是一个资源集合等。

作为定义的一个例子并没有真正帮助我。 。

来自Wikipedia

  

“计算机科学中的一个线程是执行线程的缩写。线程是程序将(称为”拆分“)本身划分为两个或多个同时(或伪同时)运行任务的一种方式。线程和进程从一个操作系统到另一个操作系统不同,但一般来说,一个线程包含在一个进程内,同一进程中的不同线程共享相同的资源,而同一个多任务操作系统中的不同进程则不共享。“

我是对的吗?错误?真的是什么线索?

编辑:显然一个线程也有自己的调用堆栈,所以这有点像具体的事物

14 个答案:

答案 0 :(得分:170)

线程是一个执行上下文,它是CPU执行指令流所需的所有信息。

假设你正在读一本书,而你现在想休息一下,但是你希望能够从你停下来的确切位置回来并继续阅读。实现这一目标的一种方法是记下页码,行号和字号。因此,阅读书籍的执行环境就是这三个数字。

如果你有一个室友,并且她使用相同的技巧,她可以在你不使用时拿走这本书,并从她停止的地方继续阅读。然后你可以把它拿回来,并从你原来的地方恢复。

线程以相同的方式工作。 CPU正在给你一种错觉,即它同时进行多次计算。它通过在每次计算上花费一点时间来做到这一点。它可以做到这一点,因为它有每个计算的执行上下文。就像您可以与朋友共享一本书一样,许多任务可以共享CPU。

在更技术层面上,执行上下文(因此是一个线程)由CPU寄存器的值组成。

最后:线程与进程不同。线程是执行的上下文,而进程是与计算相关联的一堆资源。一个进程可以有一个或多个线程。

澄清:与进程关联的资源包括内存页(进程中的所有线程具有相同的内存视图),文件描述符(例如,打开套接字)和安全凭证(例如,用户的ID)谁开始这个过程。)

答案 1 :(得分:129)

线程是处理器寄存器的独立值集(对于单个内核)。由于这包括指令指针(又名程序计数器),它控制以什么顺序执行的指令。它还包括堆栈指针,它最好指向每个线程的唯一内存区域,否则它们会相互干扰。

线程是受控制流(函数调用,循环,goto)影响的软件单元,因为这些指令在指令指针上运行,属于特定线程。线程通常根据某些优先级方案进行调度(尽管可以设计一个每个处理器核心有一个线程的系统,在这种情况下,每个线程始终在运行,不需要调度)。

实际上,指令指针的值和存储在该位置的指令足以确定指令指针的新值。对于大多数指令,这只是按指令的大小推进IP,但控制流指令以其他可预测的方式更改IP。 IP所采用的值序列形成了一条在程序代码中编织的执行路径,从而产生了名称“thread”。

答案 2 :(得分:41)

进程就像两个人使用两台不同的计算机,他们在必要时使用网络共享数据。线程就像两个人使用同一台计算机,他们不必明确地共享数据,但必须小心轮流。

从概念上讲,线程只是在同一地址空间中嗡嗡作响的多个工蜂。每个线程都有自己的堆栈,自己的程序计数器等,但进程中的所有线程共享相同的内存。想象一下两个程序同时运行,但它们都可以访问相同的对象。

将此与流程进行对比。每个进程都有自己的地址空间,这意味着一个进程中的指针不能用于引用另一个进程中的对象(除非您使用共享内存)。

我想要理解的关键事项是:

  • 进程和线程都可以“同时运行”。
  • 进程不共享内存(默认情况下),但线程与同一进程中的其他线程共享所有内存。
  • 进程中的每个线程都有自己的堆栈和自己的指令指针。

答案 3 :(得分:36)

为了正式定义一个线程,我们必须首先理解线程运行的边界。

当计算机程序从某个商店加载到计算机的内存中并开始执行时,它将成为进程。过程可以由处理器或一组处理器执行。存储器中的过程描述包含重要信息,例如程序计数器,其跟踪程序中的当前位置(即当前正在执行哪个指令),寄存器,变量存储,文件句柄,信号等。

线程是程序中的一系列此类指令,可以独立于其他代码执行。该图显示了这个概念: enter image description here

线程在同一个进程地址空间内,因此,进程的内存描述中存在的大部分信息可以跨线程共享。

无法复制某些信息,例如堆栈(每个线程指向不同内存区域的堆栈指针),寄存器和特定于线程的数据。 此信息足以允许线程独立调度 程序的主线程以及程序中的一个或多个其他线程。

运行多线程程序需要显式操作系统支持。幸运的是,大多数现代操作系统都支持Linux(通过NPTL),BSD变体,Mac OS X,Windows,Solaris,AIX,HP-UX等线程。操作系统可能使用不同的机制来实现多线程支持。

Here, graphically, the concept is rapresented.

Here,您可以找到有关该主题的更多信息。那也是我的信息来源。

答案 4 :(得分:24)

我将使用ABRAHAM SILBERSCHATZ,PETER BAER GALVIN和GREG GAGNE的“操作系统概念”一书中的大量文字以及我对事物的理解。

<强>过程

任何应用程序都以文本(或代码)的形式驻留在计算机中。

  

我们强调程序本身不是一个过程。一个程序是一个   被动实体,例如包含存储在磁盘上的指令列表的文件   (通常称为可执行文件)。

当我们启动应用程序时,我们创建一个执行实例。此执行实例称为进程。 编辑:(根据我的解释,类似于类和类的实例,类的实例是一个进程。)

流程示例是Google Chrome的流程。 当我们启动Google Chrome时,会产生3个进程:

  

浏览器进程负责管理用户界面   以及磁盘和网络I / O.创建新的浏览器进程时   Chrome已启动。仅创建一个浏览器进程。

     

渲染器进程包含用于呈现网页的逻辑。因此,他们   包含处理HTML,Javascript,图像等的逻辑。   作为一般规则,为每个网站创建一个新的渲染器进程   在新选项卡中打开,因此可能有多个渲染器进程处于活动状态   在同一时间。

     

•为每种类型的插件(例如Flash)创建插件进程   或QuickTime)正在使用中。插件进程包含代码   插件以及支持插件的其他代码   与关联的渲染器进程和浏览器进行通信   过程

<强>发

要回答这个问题,我想您应该首先了解处理器是什么。处理器是实际执行计算的硬件。 编辑:(计算如添加两个数字,排序数组,基本上执行已编写的代码)

现在转到线程的定义。

  

线程是 CPU利用率的基本单位;它包含一个线程ID,一个程序   计数器,寄存器组和堆栈。

编辑:来自英特尔网站的线程定义:

  

线程或执行线程是基本有序指令序列的软件术语,可以通过单个CPU核心传递或处理。

因此,如果Chrome应用程序中的渲染器进程对数组进行排序,则排序将在执行的线程/线程上进行。 (关于线程的语法似乎让我感到困惑)

我对事物的解释

进程是一个执行实例。线程是通过CPU访问执行计算的实际工作者。当为进程运行多个线程时,该进程提供公共内存。

编辑: 我认为有助于提供更多背景信息的其他信息

所有现代计算机都有多个线程。计算机中的线程数取决于计算机中的核心数。

并发计算

来自维基百科:

  

并发计算是一种计算形式,其中在重叠时间段期间执行多个计算 - 同时 - 而不是顺序执行(一个在下一个启动之前完成)。这是系统的属性 - 这可能是单个程序,计算机或网络 - 并且存在单独的执行点或控制线程&#34;对于每个计算(&#34;过程&#34;)。

所以,我可以写一个计算4个数字之和的程序:

(1 + 3) + (4 + 5)

在计算这个总和的程序中(这将是一个在执行的线程上运行的进程)我可以分叉另一个进程,它可以在不同的线程上运行来计算(4 + 5)并将结果返回给原始进程,而原始过程计算(1 + 3)的总和。

答案 5 :(得分:5)

不幸的是,线程确实存在。线程是有形的东西。你可以杀死一个,其他人仍然会运行。您可以生成新线程....虽然每个线程不是它自己的进程,但它们在进程内单独运行。在多核机器上,2个线程可以同时运行。

http://en.wikipedia.org/wiki/Simultaneous_multithreading

http://www.intel.com/intelpress/samples/mcp_samplech01.pdf

答案 6 :(得分:4)

答案在不同的系统和不同的实现中差异很大,但最重要的部分是:

  1. 一个线程有一个独立的执行线程(即你可以从它上下文切换,然后返回,它将恢复运行的地方)。
  2. 一个线程有一个生命周期(它可以由另一个线程创建,另一个线程可以等待它完成)。
  3. 它可能比“过程”更少附带行李。
  4. 除此之外:线程可以由语言运行时在单个进程中实现,线程可以是协同程序,线程可以通过线程库在单个进程中实现,或者线程可以是内核构造。

    在几个现代的Unix系统中,包括我最熟悉的Linux,所有都是线程 - 一个进程只是一个类型的线程,它的共享相对较少与其父级相关的东西(即它获取自己的内存映射,自己的文件表和权限等)阅读man 2 clone,特别是标志列表,在这里真的很有用。

答案 7 :(得分:3)

这取自雅虎答案:

  

线程是一种编码结构   不受建筑物的影响   应用。一个过程   经常可能包含多个   线程。线程也可以直接   因为他们彼此沟通   分享相同的变量。

     

进程是独立执行   有自己国家的单位   信息。他们也使用自己的   地址空间,只能互动   通过其他过程   进程间通信机制。

然而,简单来说,线程就像不同的“任务”。所以想想你什么时候做某事,比如你在一篇论文上写下一个公式。这可以被认为是一个线程。然后另一个线索是你在另一张纸上写下别的东西。这就是多任务处理的地方。

据说英特尔处理器具有“超线程”(AMD也有它),它本来可以更好地执行多个“线程”或多任务。

我不确定线程​​的处理方式。我确实记得听说处理器在它们之间来回传递,但我对此并不是100%肯定,希望其他人可以回答这个问题。

答案 8 :(得分:2)

一个线程只不过是一个内存上下文(或Tanenbaum如何更好地把它,资源分组)与执行规则。它是一个软件构造。 CPU不知道线程是什么(这里有一些例外,一些处理器有硬件线程),它只是执行指令。

内核引入了线程和流程概念,以有意义的方式管理内存和指令顺序。

答案 9 :(得分:2)

线程是可以执行的一组CPU)指令

但是为了更好地理解线程是什么,需要一些计算机架构知识。

计算机遵循指令并处理数据。 RAM 是保存指令和数据的地方,处理器使用这些指令对数据进行操作。 CPU 包含称为寄存器的内部存储单元。这些寄存器包含 CPU 对其执行简单数学运算的数字。示例如下:“将寄存器 #3 中的数字与寄存器 #1 中的数字相加。”。

CPU 可以执行的所有操作的集合称为指令集。指令集中的每个操作都被分配一个编号,该编号存储在 RAM 中,因此计算机代码本质上是一个代表 CPU 操作的数字序列。

CPU 工作在一个永无止境的循环中,总是从内存中获取和执行指令。这个循环的核心是PC 寄存器,或程序计数器。它是一个特殊的寄存器,用于存储下一条要执行的指令的内存地址。

CPU 将:

  1. 在PC给定的内存地址处获取指令,
  2. 将 PC 增加 1,
  3. 执行指令,
  4. 返回第 1 步。

可以指示 CPU 将新值写入 PC,从而导致执行分支或“跳转”到内存中的其他位置。这种分支可以是有条件的。例如,一条 CPU 指令可能会说:“如果寄存器 #1 为零,则将 PC 设置为地址 #200”。这允许计算机执行如下操作:

if  x = 0
    compute_this()
else
    compute_that()

Computer Science Distilled 使用的资源。

答案 10 :(得分:0)

线程

这里是关于线程的简单想法

  • 线程是进程中的单个序列流
  • 简单来说,线程是一个轻量级的过程
  • 每个线程拥有一个程序计数器,一个堆栈和一组寄存器 和线程ID
  • 每个线程仅属于一个进程,并且没有线程可以存在 流程之外
  • 传统的重量级流程只有一个线程 控制-一个程序计数器,以及一个序列 可以在任何给定时间执行的说明-Single- 线程过程
  • 多线程应用程序在一个线程中具有多个线程  单个进程,每个进程都有自己的程序计数器,堆栈 和一组寄存器,但共享通用代码,数据和 某些结构,例如打开的文件–多线程进程

答案 11 :(得分:-1)

I'm not really happy with any of those answers, so I'm going to add my own here :) A thread is a kernel abstraction for scheduling work on the processor, a thread is what the kernel gives you to manage the processor time and share work with others

答案 12 :(得分:-1)

让我先解释一下进程和线程之间的区别。

进程可以有{1..N}个线程数。 关于虚拟内存和虚拟处理器的一个小解释。

虚拟内存

用作交换空间,以便进程认为它位于主存储器上以供执行。

虚拟处理器

与虚拟内存相同的概念,除了这是针对处理器。对于一个进程,它看起来是唯一使用处理器的东西。

操作系统将负责将虚拟内存和虚拟处理器分配给进程并在进程之间执行交换并执行。

进程中的所有线程将共享相同的虚拟内存。但是,每个线程都会为其分配单独的虚拟处理器,以便它们可以单独执行。

从而节省内存并利用CPU发挥其潜力。

答案 13 :(得分:-3)

如果你想用英语回答,那就是当我问他时老师告诉我的事情:

“你知道当你运行java程序时,它从顶部运行程序吗?一个线程基本上是你解决这个问题的方法。比如一次打开两个文本框,或者运行一个计时器同时也是一堆其他东西。“

我发誓这几乎就是他所说的。