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

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

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.

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

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

从维基百科:

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

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

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


当前回答

以下是来自雅虎的回答:

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

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

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

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

其他回答

我将使用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)的和。

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

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

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

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

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

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

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

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

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

我想需要理解的关键是:

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

线程是一组可以被执行的(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()

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