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

似乎我一定遗漏了一些明显的东西,但每次我读到什么是线程,它几乎是一个循环的定义,比如“线程是执行的线程”或“一种划分运行任务的方法”。嗯嗯。嗯?

It seems from what I have read that a thread is not really something concrete, like a process is. It is in fact just a concept. From what I understand of the way this works, a processor executes some commands for a program (which has been termed a thread of execution), then when it needs to switch to processing for some other program for a bit, it stores the state of the program it's currently executing for somewhere (Thread Local Storage) and then starts executing the other program's instructions. And back and forth. Such that, a thread is really just a concept for "one of the paths of execution" of a program that is currently running.

不像一个过程,它是一个资源的集合,等等。

作为一个定义的例子,它并没有真正帮助到我…

从维基百科:

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

我说的对吗?错了吗?线程到底是什么?

编辑:显然,线程也有自己的调用堆栈,所以这是一个具体的东西。


当前回答

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

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

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

其他回答

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

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

计算机所做的就是按照指令操作数据。 RAM是保存指令和数据的地方,处理器使用这些指令对保存的数据执行操作。

CPU有一些内部存储单元,称为寄存器。它可以对存储在这些寄存器中的数字进行简单的数学运算。它还可以在RAM和这些寄存器之间移动数据。这些是CPU可以被指示执行的典型操作的例子:

将数据从内存位置#220复制到寄存器#3 将寄存器#3中的数字与寄存器#1中的数字相加。

CPU能做的所有操作的集合叫做指令集。指令集中的每个操作都被分配了一个编号。计算机代码本质上是表示CPU操作的数字序列。这些操作以数字的形式存储在RAM中。我们存储输入/输出数据、部分计算和计算机代码,所有这些都混合在RAM中。

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

CPU将:

从PC给出的内存地址处获取指令, PC加1, 执行指令, 回到步骤1。

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

if  x = 0
    compute_this()
else
    compute_that()

资源使用自计算机科学蒸馏。

以下是来自雅虎的回答:

线程是一种编码构造 的体系结构不受影响 应用程序。单个过程 通常可能包含多个 线程。线程也可以直接 彼此沟通,因为他们 共享相同的变量。 进程是独立执行的 单位有自己的状态 信息。他们也用自己的 地址空间和只能交互 通过其他过程 进程间通信机制。

然而,简单地说,线程就像不同的“任务”。想象一下,当你在做某事的时候,比如你在一张纸上写下一个公式。这可以看作是一个线程。然后另一个线程是你在另一张纸上写别的东西。这就是多任务处理的原因。

据说英特尔处理器有“超线程”(AMD也有),它意味着能够更好地执行多个“线程”或多任务。

我不确定如何处理线程的后勤。我确实记得听说过处理器在它们之间来回切换,但我不是100%确定,希望其他人能回答这个问题。

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

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

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

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

一个线程有一个独立的执行线程(也就是说,你可以从它的上下文切换,然后返回,它将继续运行在它原来的地方)。 一个线程有一个生命周期(它可以由另一个线程创建,另一个线程可以等待它完成)。 它可能比“过程”附带的包袱更少。

除此之外:线程可以由语言运行时在单个进程中实现,线程可以是协程,线程可以由线程库在单个进程中实现,或者线程可以是内核构造。

在一些现代Unix系统中,包括我最熟悉的Linux,一切都是线程——一个进程只是一种线程类型,它与其父线程共享相对较少的东西(例如,它有自己的内存映射,自己的文件表和权限等)。

为了正式地定义线程,我们必须首先了解线程操作的边界。

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

线程是程序中这样的指令序列,可以独立于其他代码执行。如图所示为概念:

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

有些信息不能复制,比如堆栈(每个线程指向不同内存区域的堆栈指针)、寄存器和特定于线程的数据。这些信息足以允许线程独立于程序的主线程和程序中的一个或多个其他线程进行调度。

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

在这里,你可以找到关于这个主题的更多信息。这也是我的信息来源。

让我补充一句来自Edward Lee和Seshia的《嵌入式系统导论》:

Threads are imperative programs that run concurrently and share a memory space. They can access each others’ variables. Many practitioners in the field use the term “threads” more narrowly to refer to particular ways of constructing programs that share memory, [others] to broadly refer to any mechanism where imperative programs run concurrently and share memory. In this broad sense, threads exist in the form of interrupts on almost all microprocessors, even without any operating system at all (bare iron).