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

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

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.

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

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

从维基百科:

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

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

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


当前回答

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

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

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

其他回答

我将使用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不知道线程是什么(有些例外,有些处理器有硬件线程),它只是执行指令。

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

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

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

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

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

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

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

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

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

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

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

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

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

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