什么是“线程”(真的)?
我一直在努力寻找一个好的定义,并理解一个线程究竟是什么。
看起来,我必须错过某些明显的东西,但每次我读到线程是什么的时候,它几乎都是一个循环定义,“线程是执行的线程”或“分成运行任务的一种方式”。 呃。 咦?
从我所读到的看来,线程并不是真正具体的东西,就像一个过程一样。 这实际上只是一个概念。 根据我所了解的这种工作方式,处理器为一个程序(它被称为执行线程)执行一些命令,然后当它需要切换到某个其他程序的某个位时,它将存储它当前正在执行的程序(Thread Local Storage),然后开始执行其他程序的指令。 然后来回。 因此,线程实际上只是当前正在运行的程序的“执行路径之一”的概念。
与流程不同,这真的是某种东西 - 它是资源的集合等等。
作为一个定义的例子并没有真正帮助我很多。 。 。
维基百科:
“计算机科学中的一个线程是执行线程的简称,线程是程序将自身划分为两个或多个同时(或伪同时)运行任务的一种方式。线程和进程不同于一个操作系统转移到另一个,但通常情况下,线程包含在一个进程中,并且同一进程中的不同线程共享相同的资源,而同一多任务操作系统中的不同进程则不共享这些资源。“
那我是对的吗? 错误? 什么是真的线程?
编辑:显然一个线程也被赋予了自己的调用堆栈,所以这是一个具体的事情。
线程是处理器寄存器的一组独立值(对于单个内核)。 由于这包括指令指针(又名程序计数器),它控制按什么顺序执行的操作。 它还包含堆栈指针,它指向每个线程的独特内存区域,否则它们将互相干扰。
线程是受控制流(函数调用,循环,转到)影响的软件单元,因为这些指令在指令指针上运行,并且属于特定的线程。 线程通常按照一些优先级划分方案进行调度(尽管可以设计一个系统,每个处理器内核有一个线程,在这种情况下,每个线程始终运行并且不需要调度)。
实际上,指令指针的值和存储在该位置的指令足以确定指令指针的新值。 对于大多数指令而言,这只是简单地按指令的大小推进IP,但控制流程指令会以其他可预测的方式更改IP。 IP采取的值序列形成了一个执行程序,通过程序代码编织,产生了名称“线程”。
线程是执行上下文,它是CPU执行指令流所需的全部信息。
假设你正在阅读一本书,并且你现在想休息一下,但是你希望能够从停止的确切位置回来并继续阅读。 一种实现这一点的方法是记下页码,行号和字数。 所以你阅读一本书的执行环境就是这3个数字。
如果你有一个室友,而且她使用的是同样的技巧,她可以在不使用的时候拿起这本书,然后从停止的地方继续阅读。 然后,您可以将它收回来,然后从您所在的位置恢复。
线程以相同的方式工作。 CPU给你的错觉是它正在同时进行多个计算。 它通过在每次计算上花费一点时间来做到这一点。 它可以这样做,因为它为每个计算都有一个执行上下文。 就像你可以和你的朋友分享一本书一样,许多任务可以共享一个CPU。
在更技术层面上,执行上下文(因此是一个线程)由CPU寄存器的值组成。
最后:线程与进程不同。 线程是执行的上下文,而进程是与计算相关的一堆资源。 一个进程可以有一个或多个线程。
说明:与进程相关的资源包括内存页面(进程中的所有线程都具有相同的内存视图),文件描述符(例如打开的套接字)和安全凭证(例如,启动处理)。
进程就像两个人使用两台不同的计算机,在必要时使用网络共享数据。 线程就像使用同一台计算机的两个人一样,他们不必明确地共享数据,但必须小心轮流。
从概念上讲,线程只是多个工蜂在同一地址空间中嗡嗡作响。 每个线程都有自己的堆栈,自己的程序计数器等,但进程中的所有线程共享相同的内存。 假设两个程序同时运行,但它们都可以访问相同的对象。
将其与流程进行对比。 每个进程都有自己的地址空间,这意味着一个进程中的指针不能用于引用另一个进程中的对象(除非使用共享内存)。
我猜想要理解的关键是:
上一篇: What is a "thread" (really)?
下一篇: Multithreading: What is the point of more threads than cores?