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

Multithreading “a”是什么;“线程”;(真的)?,multithreading,process,definition,Multithreading,Process,Definition,我一直在试图找到一个好的定义,并理解线程到底是什么 看起来我肯定错过了一些明显的东西,但每次我读到线程是什么时,它几乎是一个循环定义,“线程是一个执行线程”或“一种划分运行任务的方法”。嗯。嗯 从我所读到的内容来看,线程并不像进程那样是具体的东西。事实上,这只是一个概念。根据我对其工作方式的理解,处理器为一个程序执行一些命令(被称为执行线程),然后当它需要为另一个程序切换处理一段时间时,它会将当前正在执行的程序的状态存储在某个地方(线程本地存储)然后开始执行另一个程序的指令。来来回回。因此,线程

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

看起来我肯定错过了一些明显的东西,但每次我读到线程是什么时,它几乎是一个循环定义,“线程是一个执行线程”或“一种划分运行任务的方法”。嗯。嗯

从我所读到的内容来看,线程并不像进程那样是具体的东西。事实上,这只是一个概念。根据我对其工作方式的理解,处理器为一个程序执行一些命令(被称为执行线程),然后当它需要为另一个程序切换处理一段时间时,它会将当前正在执行的程序的状态存储在某个地方(线程本地存储)然后开始执行另一个程序的指令。来来回回。因此,线程实际上只是当前正在运行的程序的“执行路径之一”的概念

不同于一个过程,它是一个真正的东西——它是一个资源的集合体,等等

作为一个对我帮助不大的定义的例子

发件人:

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

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


编辑:显然,线程也有自己的调用堆栈,因此这是一件具体的事情。

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


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

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


实际上,指令指针的值和存储在该位置的指令足以确定指令指针的新值。对于大多数指令来说,这只是根据指令的大小提升IP,但控制流指令会以其他可预测的方式更改IP。IP所采用的值序列形成了一条贯穿程序代码的执行路径,从而产生了“线程”的名称。

这是从Yahoo的回答中得出的:

线程是一种编码结构 不受建筑的影响 应用单一过程 通常可能包含多个 线程。线程也可以直接 互相交流,因为他们 共享相同的变量

进程是独立执行的 有自己国家的单位 信息。他们也用自己的 地址空间,只能进行交互 通过其他流程 进程间通信机制

然而,简单地说,线程就像不同的“任务”。所以想想你在做什么,比如你在一张纸上写下一个公式。这可以看作是一个线程。然后另一个线索是你在另一张纸上写了别的东西。这就是多任务处理的用武之地

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


我不确定线程是如何处理的。我确实记得听说处理器在他们之间来回移动,但我不是100%确定这一点,希望其他人能够回答。

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

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

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

我想需要了解的关键是:

  • 进程和线程都可以“同时运行”
  • 进程不共享内存(默认情况下),但线程与同一进程中的其他线程共享其所有内存
  • 进程中的每个线程都有自己的堆栈和指令指针
答案在不同的系统和不同的实现中差异很大,但最重要的部分是:

  • 一个线程有一个独立的执行线程(即,您可以从它切换上下文,然后再切换回来,它将恢复运行)
    (1 + 3) + (4 + 5)
    
    if  x = 0
        compute_this()
    else
        compute_that()