Skip to main content

多线程

多线程,台湾惯用术语为作多执行绪,港澳惯用术语为作多线程(英语:Multithreading),是指从软件或者硬件上实现多个线程迸发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个执行绪,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。

软件多线程。即便处理器只能运行一个线程,操作系统也可以通过快速的在不同线程之间进行切换,由于时间间隔很小,来给用户造成一种多个线程同时运行的假象。这样的程序运行机制被称为软件多线程。如微软的Windows作业系统和Linux就是在各个不同的执行绪间来回切换,被称为单人多任务作业系统。而DOS这类文字接口作业系统在一个时间只能处理一项工作,被视为单人单工作业系统。

除此之外,许多系统及处理器也支持硬件多线程技术。对称多处理机(SMP)系统具有多个处理器,所以具有真正的同时执行多个线程的能力;CMP技术通过在一块芯片上集成多个核心(Core)也具有真正的多线程能力;CMT技术则稍有不同,有的是依靠硬件执行线程切换来获得多线程能力,操作系统不再负责线程切换,因而这部分开销可以减少甚至消除,这方面典型的例子是Sun的UltraSPARC T1,它同时综合了CMP和CMT。微软的Windows 2000以后的操作系统皆支持多线程与超线程技术。
目录

    1 概观
    2 粗粒度交替多线程
        2.1 概念
        2.2 硬件成本
        2.3 示例
    3 细粒度交替式多线程
        3.1 概念
        3.2 硬件成本
        3.3 示例
    4 同步多线程
        4.1 概念
        4.2 硬件成本
        4.3 示例
    5 实现
    6 参见
    7 外部链接

概观

由于程序代码中存在的数据及控制依赖关系,单线程中所能发掘的指令并行潜力是有限的。为了发掘有限的指令级并行潜力而一味强化乱序执行和分支预测,以至于处理器复杂度和功耗急剧上升,有时候是得不偿失的。因此,现代微处理器多采用硬件多线程技术来发掘线程之间的线程级并行潜力。这样子允许在接口转换的专业领域之运算能力大幅提升:

    既使这样做对于提升单一程序或是线程的性能相当困难,但是目前多数的系统都是使用多任务的方式作业。
    能够明显的提升整体系统运算能力,总体吞吐量获得提升。

有两种提升运算能力的主要技术分别是多进程与多线程。

不过有些对多线程的批评如下:

    当共享硬件资源(像是高速缓存或是TLB)时多线程会造成干预。
    单线程的运行时间可能不会因为多线程而变短。硬件侦测技术有可能改变这一状况。
    多线程的硬件支持会牵涉到软件支持,如此程序与操作系统就需要比多过程化更大幅度的修改。

粗粒度交替多线程
概念

一个线程持续运行,直到该线程被一个事件挡住而制造出长时间的延迟(可能是内存load/store操作,或者程序分支操作)。该延迟通常是因高速缓存失败而从核心外的内存读写,而这动作会使用到几百个CPU周期才能将数据回传。与其要等待延迟的时间,线程化处理器会切换运行到另一个已就绪的线程。只要当之前线程中的数据送达后,上一个线程就会变成已就绪的线程。这种方法来自各个线程的指令交替执行,可以有效的掩盖内存访问时延,填补流水线空洞。

举例来说:

    周期 i :接收线程 A 的指令 j
    周期 i+1:接收线程 A 的指令 j+1
    周期 i+2:接收线程 A 的指令 j+2,而这指令高速缓存失败
    周期 i+3:线程调度程序介入,切换到线程 B
    周期 i+4:接收线程 B 的指令 k
    周期 i+5:接收线程 B 的指令 k+1

在概念上,它与实时操作系统中使用的合作式多任务类似,在该任务需要为一个事件等待一段时间的时候会主动放弃运行时段。
硬件成本

此种多线程硬件支持的目标,是允许在挡住的线程与已就绪的线程中快速切换。为了要达成这个目标,硬件成本将复制程序看得见的暂存器与一些处理器控制暂存器(像是程序计算器)。从一个线程切换到另一个线程对硬件来讲意谓著从一个暂存器复制到另一个。

这些新增功能的硬件有这些优势:

    线程切换能够在一个 CPU 周期内完成(实际上可以没有开销,上个周期在运行线程A,下个周期就已在运行线程B)。
    这样子看起来像是每个线程是独自运行的,没有其他线程与目前共享硬件资源。对操作系统来说,通常每个虚拟线程都被视做一个处理器。这样就不需要很大的软件变更(像是特别写支持多线程的操作系统)。

为了要在各个现行中的线程有效率的切换,每个现行中的线程需要有自己的暂存设置(register set)。像是为了能在两个线程中快速切换,硬件的暂存器需要两次例示(instantiated)。
示例

    许多单片机与嵌入式处理器有多重的暂存器列,就能够在中断时快速环境切换。这样架构可以视为程序的线程与中断线程之间的块状多线程处理。

细粒度交替式多线程
参见:桶形处理器
概念

另一种更高性能的多线程做法是将所有 CPU 周期轮流切换至不同的线程,来自各线程的指令按顺序交替执行。执行过程很像桶形处理器(Barrel Processor)就像这样:

    周期 i :接收线程 A 的一个指令
    周期 i+1:接收线程 B 的一个指令
    周期 i+2:接收线程 C 的一个指令

这种线程的效果是会将所有从运行管线中的数据从属(data dependency)关系移除掉。因为每个线程是相对独立,管线中的一个指令层次结构需要从已跑完管线中的较旧指令代入输出的机会就相对的变小了。

而在概念上,这种多线程与操作系统的核心先占多任务(pre-exemptive multitasking)相似。
硬件成本

除了讨论块状多线程的硬件成本,交错式多线程也因每层管线需要追踪运行中指令的线程代码而增加硬件成本。而且,当越来越多的线程同时在管线中运行,像是高速缓存与 TLB 等共享资源也要加大来避免不同线程之间的冲突。
示例

    Denelcor Heterogeneous Element 处理器 (HEP)
    Intel Super-threading
    升阳 UltraSPARC T1
    Lexra NetVortex
    搭载 Multi-Threaded ASE 的 MIPS 34K 核心
    Raza Microelectronics Inc XLR

同步多线程
参见:同步多线程
概念

目前最先进的多线程技术是应用在超标量处理器上。超标量处理器内在每个CPU周期中,单独一个线程会发布众多的指令。套用同步多线程(SMT)之后,超标量处理器就可以在每个CPU周期中,从多个线程中发布指令。辨识到任何一个单一线程拥有有限数量的指令平行处理,这种类型的多线程是试着利用并行的方式跨越多线程,以减少浪费与闲置的资源。 举例来说:

    周期 i:线程 A 的 j 指令 与 j+1 指令,还有 B 线程的指令 k 同时发布
    周期 i+1:线程 A 的 j+2 指令、线程 B 的 k+1指令,与线程 C 的 m 指令同时发布
    周期 i+2:线程 A 的 j+3 指令,与线程 C 的 m+1 与 m+2 指令同时发布

硬件成本

交错式多线程如果不计硬件成本,SMT在每个管线层次结构的追踪线程指令会有多余的花费。而且,像是高速缓存与TLB这类共享的资源可能会因为多出来的线程而变得更大。
示例

    Alpha AXP EV8 (未完成)
    Intel 超线程
    IBM Power5
    Cell 微处理器 内的 Power 运算对象件
    升阳 UltraSPARC T2
    升阳 Rock微处理器
    AMD Bulldozer

实现

在大多数研究领域内是要求线程调度程序要能够快速选择其中一个已就绪线程去运行,而不是一个一个运行而降低效率。所以要让调度程序去分辨线程的优先级是很重要的。而线程调度程序可能是以硬件、软件,或是软硬件并存的形式存在。

而另一个研究领域则是要研究何种事件(高速缓存失败、内部运行续连系、使用DMA等)会造成线程切换。

如果多线程的方案会复制所有软件可见的状态,包括特许的控制登录、TLB 等,那就能够让虚拟机去创造各式线程。这样子就允许在相同的处理器中每个线程跑各自的操作系统。换句话说,如果只有存储了用户模式的状态,就能够让相同的裸晶大小的芯片在一段时间内处理更多的线程。

Comments

Popular posts from this blog

CKA Simulator Kubernetes 1.22

  https://killer.sh Pre Setup Once you've gained access to your terminal it might be wise to spend ~1 minute to setup your environment. You could set these: alias k = kubectl                         # will already be pre-configured export do = "--dry-run=client -o yaml"     # k get pod x $do export now = "--force --grace-period 0"   # k delete pod x $now Vim To make vim use 2 spaces for a tab edit ~/.vimrc to contain: set tabstop=2 set expandtab set shiftwidth=2 More setup suggestions are in the tips section .     Question 1 | Contexts Task weight: 1%   You have access to multiple clusters from your main terminal through kubectl contexts. Write all those context names into /opt/course/1/contexts . Next write a command to display the current context into /opt/course/1/context_default_kubectl.sh , the command should use kubectl . Finally write a second command doing the same thing into ...

OWASP Top 10 Threats and Mitigations Exam - Single Select

Last updated 4 Aug 11 Course Title: OWASP Top 10 Threats and Mitigation Exam Questions - Single Select 1) Which of the following consequences is most likely to occur due to an injection attack? Spoofing Cross-site request forgery Denial of service   Correct Insecure direct object references 2) Your application is created using a language that does not support a clear distinction between code and data. Which vulnerability is most likely to occur in your application? Injection   Correct Insecure direct object references Failure to restrict URL access Insufficient transport layer protection 3) Which of the following scenarios is most likely to cause an injection attack? Unvalidated input is embedded in an instruction stream.   Correct Unvalidated input can be distinguished from valid instructions. A Web application does not validate a client’s access to a resource. A Web action performs an operation on behalf of the user without checkin...