首页 文章

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

提问于
浏览
175

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

似乎我必须遗漏一些明显的东西,但每当我读到一个线程是什么时,它几乎是一个循环定义,一个“线程是一个执行线程”或“一种分为运行任务的方法” . 呃呃 . 咦?

从我所读到的看来,线程并不是真正具体的东西,就像进程一样 . 它实际上只是一个概念 . 根据我对其工作方式的理解,处理器为程序执行一些命令(已被称为执行线程),然后当需要切换到某个其他程序的处理时,它会存储状态该程序是's currently executing for somewhere (Thread Local Storage) and then starts executing the other program'的指示 . 而来回 . 这样,一个线程实际上只是当前正在运行的程序的"one of the paths of execution"的概念 .

与流程不同,流程确实是某种东西 - 它是资源的集合等 .

作为一个定义的例子并没有真正帮助我 . . .

来自Wikipedia

“计算机科学中的一个线程是执行线程的缩写 . 线程是程序将(称为”拆分“)本身划分为两个或多个同时(或伪同时)运行任务的一种方式 . 线程和进程不同于一个操作系统到另一个操作系统,但一般来说,一个线程包含在进程内,同一进程中的不同线程共享相同的资源,而同一个多任务操作系统中的不同进程则不共享 .

我是对的吗?错误?真的是什么线程?

Edit: 显然一个线程也有自己的调用堆栈,所以这有点具体 .

12 回答

  • 3

    我对这些答案都不满意,所以我要在这里添加自己的:)一个线程是用于在处理器上调度工作的内核抽象,一个线程是内核为你提供的管理处理器时间的东西并与他人分享工作

  • 113

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

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

    实际上,指令指针的值和存储在该位置的指令足以确定指令指针的新值 . 对于大多数指令,这只是按指令的大小推进IP,但控制流指令以其他可预测的方式更改IP . IP所采用的值序列形成了通过程序代码编织的执行路径,从而产生了名称“thread” .

  • 37

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

    假设你正在读一本书,而你现在想休息一下,但是你希望能够从你停下来的确切位置回来并继续阅读 . 实现这一目标的一种方法是记下页码,行号和字号 . 因此,阅读书籍的执行环境就是这三个数字 .

    如果你有一个室友,并且她使用相同的技术,她可以在你不使用时拿走这本书,并从她停下的地方继续阅读 . 然后你可以把它拿回来,并从你原来的地方恢复 .

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

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

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

    澄清:与进程相关联的资源包括内存页面(进程中的所有线程具有相同的内存视图),文件描述符(例如,打开套接字)和安全凭证(例如,启动该进程的用户的ID)处理) .

  • 4

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

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

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

    我想要理解的关键事项是:

    • 进程和线程都可以"run at the same time" .

    • 进程不共享内存(默认情况下),但线程与同一进程中的其他线程共享其所有内存 .

    • 进程中的每个线程都有自己的堆栈和自己的指令指针 .

  • 23

    为了正式定义一个线程,我们必须首先理解线程运行的边界 .

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

    thread 是程序中的一系列此类指令,可以独立于其他代码执行 . 该图显示了这个概念:
    enter image description here

    线程在同一个 process address space 内,因此,进程的内存描述中存在的大部分信息可以跨线程共享 .

    某些信息无法复制,例如堆栈(每个线程指向不同内存区域的堆栈指针),寄存器和特定于线程的数据 . This information suffices to allow threads to be scheduled independently 程序的主线程,可能是程序中的一个或多个其他线程 .

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

    Here, graphically, the concept is rapresented.

    Here,您可以找到有关该主题的更多信息 . 那也是我的信息来源 .

  • 5

    我将使用ABRAHAM SILBERSCHATZ,PETER BAER GALVIN和GREG GAGNE的“操作系统概念”一书中的大量文本以及我对事物的理解 .

    Process

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

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

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

    流程的一个示例是Google Chrome . 当我们启动Google Chrome时,会产生3个进程:

    •浏览器进程负责管理用户界面以及磁盘和网络I / O. Chrome启动时会创建一个新的浏览器流程 . 仅创建一个浏览器进程 . •渲染器进程包含用于呈现网页的逻辑 . 因此,它们包含处理HTML,Javascript,图像等的逻辑 . 作为一般规则,为在新选项卡中打开的每个网站创建新的渲染器进程,因此可以同时激活多个渲染器进程 . •为正在使用的每种类型的插件(如Flash或QuickTime)创建插件进程 . 插件进程包含插件的代码以及使插件能够与关联的渲染器进程和浏览器进程通信的其他代码 .

    Thread

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

    现在继续讨论线程的定义 .

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

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

    线程或执行线程是基本有序指令序列的软件术语,可以通过单个CPU内核传递或处理 .

    因此,如果Chrome应用程序中的渲染器进程对一组数字进行排序,则排序将在执行的线程/线程上进行 . (关于线程的语法似乎让我感到困惑)

    My Interpretation of Things

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

    编辑: Other Information that I found useful to give more context

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

    Concurrent Computing

    来自维基百科:

    并发计算是一种计算形式,其中在重叠期间执行多个计算时间段 - 同时 - 而不是顺序(一个在下一次开始之前完成) . 这是系统的属性 - 这可以是单个程序,计算机或网络 - 并且对于每个计算(“过程”)存在单独的执行点或“控制线程” .

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

    (1 + 3) + (4 + 5)
    

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

  • -1

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

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

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

  • 2

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

    • 一个线程有一个独立的执行线程(即你可以从它上下文切换,然后返回,它将恢复运行的位置) .

    • 一个线程有一个生命周期(它可以由另一个线程创建,另一个线程可以等待它完成) .

    • 它的 Baggage 附件可能比"process"少 .

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

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

  • 31

    这取自雅虎答案:

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

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

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

    我不确定如何处理线程的后勤 . 我确实记得听说处理器在它们之间来回传递,但我对此并不是100%肯定,希望其他人可以回答这个问题 .

  • 154

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

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

  • -3

    让我先解释一下进程和线程之间的区别 .

    一个进程可以有{1..N}个线程 . 关于虚拟内存和虚拟处理器的一个小解释 .

    Virtual memory

    用作交换空间,以便进程认为它位于主存储器上以便执行 .

    Virtual processor

    与虚拟内存相同的概念除了这个用于处理器 . 对于一个进程,它将是唯一使用处理器的东西 .

    操作系统将负责将虚拟内存和虚拟处理器分配给进程并执行进程之间的交换和执行 .

    进程中的所有线程将共享相同的虚拟内存 . 但是,每个线程都会为其分配各自的虚拟处理器,以便它们可以单独执行 .

    从而节省了内存以及利用CPU发挥其潜力 .

  • -1

    如果你想用英语回答,那就是我老师告诉我的时候我问他:

    “你知道当你运行java程序时,它从顶部运行程序吗?一个线程基本上是你解决这个问题的方法 . 就像打开两个文本一样一次打开盒子,或者让计时器与其他一些东西同时运行 . “

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

相关问题