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

我一直在试图find一个好的定义,并理解一个线程究竟是什么。

看来我一定是错过了一些显而易见的东西,但是每当我读到一个线程是什么的时候,几乎就是一个循环定义,一个线程就是一个执行线程,或者说是一个分成运行任务的方式。 呃。 咦?

从我所读到的看来,线程并不是真正具体的东西 ,就像一个过程一样。 这实际上只是一个概念。 从我所了解的这种工作方式来看,一个处理器为一个程序执行一些命令(这​​个命令被称为执行线程 ),然后当它需要切换到某个其他程序处理一下时,它将存储它当前正在执行的程序(Thread Local Storage),然后开始执行其他程序的指令。 然后来回。 这样一个线程实际上只是一个正在运行的程序的“执行path之一”的概念。

不同于一个过程,其实是一些东西 – 它是一个资源的集合等等。

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

维基百科 :

“计算机科学中的一个线程是执行线程的简称,线程是程序将自身分成两个或多个同时(或伪同时)运行任务的一种方式,线程和进程不同于一个操作系统到另一个,但是一般来说,一个线程被包含在一个进程中,同一进程中的不同线程共享相同的资源,而在同一个多任务操作系统中的不同进程则不会。

所以我是对的? 错误? 什么是真正的线程?

编辑:显然一个线程也给自己的调用堆栈,所以这是一个具体的事情

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

线程是受控制stream(函数调用,循环,转到)影响的软件单元,因为这些指令在指令指针上运行,并且属于特定的线程。 线程通常按照一些优先级划分scheme进行调度(尽pipe可以devise一个系统,每个处理器内核有一个线程,在这种情况下,每个线程总是在运行,不需要调度)。

实际上,指令指针的值和存储在该位置的指令足以确定指令指针的新值。 对于大多数指令来说,这只是简单地按照指令大小来提前IP,但是控制stream程指令以其他可预测的方式来改变IP。 IP所采取的值的顺序形成了一个通过程序代码编织的path,产生了名称“线程”。

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

假设你正在读一本书,而你现在想rest一下,但是你希望能够从你停下的确切位置恢复阅读。 一种方法是通过记下页码,行号和字数。 所以你阅读一本书的执行环境就是这3个数字。

如果你有一个室友,而且她正在使用同样的技术,她可以拿着这本书,而不使用它,并从停止的地方恢复阅读。 那么你可以把它收回来,从你原来的地方恢复。

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

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

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

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

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

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

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

我想要了解的关键是:

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

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

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

线程是程序中的一系列指令,可以独立于其他代码执行。 该图显示了这个概念: 在这里输入图像说明

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

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

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

在这里,图形上,这个概念是呈现出来的。

在这里 ,您可以find有关该主题的更多信息。 那也是我的信息来源。

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

处理

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

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

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

stream程的一个例子就是Google Chrome。 当我们启动Google Chrome时,会产生3个进程:

浏览器进程负责pipe理用户界面以及磁盘和networkingI / O。 Chrome启动时会创build一个新的浏览器进程。 只有一个浏览器进程被创build。

渲染器进程包含渲染网页的逻辑。 因此,它们包含处理HTML,Javascript,图像等的逻辑。 通常,为在新选项卡中打开的每个网站创build一个新的渲染器进程,因此多个渲染器进程可能同时处于活动状态。

•为每种types的插件(如Flash或QuickTime)创build插件进程。 插件进程包含插件的代码以及使插件能够与相关的渲染器进程和浏览器进程进行通信的附加代码。

线

为了回答这个问题,我想你应该先知道一个处理器是什么。 处理器是实际执行计算的硬件。 编辑:(计算像添加两个数字,sorting数组,基本上执行已写入的代码)

现在转到线程的定义。

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

编辑:从英特尔的网站定义一个线程:

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

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

我对事物的解读

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

编辑: 其他信息,我觉得有用给更多的上下文

所有现代计算机都有不止一个线程。 计算机中的线程数取决于计算机中的内核数。

并行计算

维基百科:

并发计算是一种计算forms,其中在重叠的时间段内同时执行多个计算,而不是按顺序(在下一次开始之前完成一次)。 这是一个系统的属性 – 这可能是一个单独的程序,一台计算机或一个networking – 每个计算(“过程”)都有一个单独的执行点或“控制线程”。

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

(1 + 3) + (4 + 5) 

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

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

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

intelpress/samples/mcp_samplech01.html

这是从雅虎采取答案:

线程是不受应用程序体系结构影响的编码结构。 一个进程经常可能包含多个线程。 线程也可以直接相互通信,因为它们共享相同的variables。

进程是具有自己的状态信息的独立执行单元。 他们也使用自己的地址空间,只能通过进程间通信机制与其他进程交互。

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

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

我不清楚线程是如何处理的。 我记得有关处理器在它们之间来回的听闻,但我不是100%确定这一点,希望别人能回答这个问题。

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

  1. 一个线程有一个独立的执行线程(也就是说,你可以从上下文切换,然后返回,它会继续运行)。
  2. 一个线程有一个生命周期(可以由另一个线程创build,另一个线程可以等待它完成)。
  3. 它可能比“stream程”附带的行李更less。

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

在一些现代的Unix系统中,包括我最熟悉的Linux系统, 一切都是线程 – 一个进程只是一种线程,与父进程共享相对较less的东西(即它获得自己的内存映射,自己的文件表和权限等)阅读man 2 clone ,特别是标志列表,在这里真的很有启发性。

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

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

如果你想要一个英文的答案,我的老师告诉我,当我问他:

“当你运行一个java程序的时候,你知道怎么运行一个java程序,从头到尾运行程序呢?一个线程基本上是一种解决这个问题的方法,就像同时打开两个文本框或者同时运行一个定时器作为一堆其他的东西。“

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