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

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

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.

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

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

从维基百科:

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

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

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


当前回答

线程不过是一个具有执行规则的内存上下文(Tanenbaum更恰当的说法是资源分组)。这是一个软件结构。CPU不知道线程是什么(有些例外,有些处理器有硬件线程),它只是执行指令。

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

其他回答

我将使用ABRAHAM SILBERSCHATZ、PETER BAER GALVIN和GREG GAGNE所著的《操作系统概念》一书中的大量文本以及我自己对事物的理解。

过程

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

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

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

进程的一个例子是谷歌Chrome。 当我们启动谷歌Chrome, 3个进程被衍生:

• The browser process is responsible for managing the user interface as well as disk and network I/O. A new browser process is created when Chrome is started. Only one browser process is created. • Renderer processes contain logic for rendering web pages. Thus, they contain the logic for handling HTML, Javascript, images, and so forth. As a general rule, a new renderer process is created for each website opened in a new tab, and so several renderer processes may be active at the same time. • A plug-in process is created for each type of plug-in (such as Flash or QuickTime) in use. Plug-in processes contain the code for the plug-in as well as additional code that enables the plug-in to communicate with associated renderer processes and the browser process.

线程

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

现在开始讨论线程的定义。

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

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

线程(Thread)或执行线程(Thread of execution)是一个软件术语,指的是指令的基本有序序列,可以由单个CPU内核传递或处理。

因此,如果Chrome应用程序的Renderer进程对数字数组进行排序,排序将发生在执行的线程/线程上。(关于线程的语法让我感到困惑)

我对事物的解读

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

编辑: 其他我认为有用的信息,以提供更多的背景

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

并行计算:

从维基百科:

并发计算是一种计算形式,在这种计算中,多个计算在重叠的时间段内(并发地)执行,而不是按顺序执行(一个在下一个开始之前完成)。这是一个系统的属性——可能是一个单独的程序、一台计算机或一个网络——每个计算(“进程”)都有一个单独的执行点或“控制线程”。

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

(1 + 3) + (4 + 5)

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

以下是来自雅虎的回答:

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

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

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

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

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

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

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

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

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

运行多线程程序需要明确的操作系统支持。幸运的是,大多数现代操作系统都支持线程,如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).

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

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

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

我想需要理解的关键是:

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

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

假设你正在阅读一本书,你现在想休息一下,但你希望能够回到你停下来的地方继续阅读。实现这一目标的一个方法是记下页码、行号和字数。所以你读书的执行环境就是这3个数字。

如果你有一个室友,她也在用同样的方法,她可以在你不用的时候把书拿走,然后从她停下来的地方继续读。然后你可以把它拿回来,从你刚才的地方重新开始。

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

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

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

说明:与进程相关的资源包括内存页(进程中的所有线程都有相同的内存视图)、文件描述符(例如,打开的套接字)和安全凭证(例如,启动进程的用户ID)。