📜  操作系统中多线程架构的阶段

📅  最后修改于: 2022-05-13 01:56:11.581000             🧑  作者: Mango

操作系统中多线程架构的阶段

先决条件 - 多线程架构

多线程模型中线程的实现分为各个阶段,每个阶段执行一个独特的函数。

每个线程的各个执行阶段以及每个线程之间的关系如下图所示:

1. 延续阶段:

  • (i)一旦一个线程被它的前任(或前一个)线程启动,它就开始执行它的延续阶段。此阶段的重要函数是计算本质上具有重复性的变量。

    例如——移动下一个线程所需的循环索引变量。这些变量的值将在下一个线程被激活之前提前到下一个线程处理元素。



  • (ii)在 DO 循环的情况下,将计算索引变量,例如 x=x+1 或 y=y->next,然后转发到下一个线程元素(处理元素)。一个线程的延续阶段以发散(divide)指令结束,这是下一个线程启动的真正原因。

2. 目标-存储-地址-生成阶段:

  • (i)这些线程可以执行稍后在并发线程上执行的存储操作,并且可以依赖于数据。此阶段将存储操作并称为目标存储 (TS)。
  • (ii)此阶段的第二个最重要的工作是降低硬件复杂性,多线程模型的大多数实现不允许假设数据依赖性。为了使运行时数据依赖性检查更容易,需要尽快(尽快)计算这些目标存储的地址。

    TSAG(目标存储地址生成)阶段为这些目标存储执行地址计算。此外,这些地址将存储在每个线程处理元件的内存缓冲区中,然后转发到所有后续并发线程的内存缓冲区。

  • (iii)一旦线程完成 TSAG 阶段,则所有目标存储地址都已转发,然后它将 tsag-done 标志发送到后继线程。然后这个标志将通知下一个线程,该线程可以开始依赖于前一个线程的计算。但是在收到 tsag_done 标志之前,线程只能执行不依赖于其活动前驱线程的任何目标存储的计算。但是为了增加线程之间的重叠,目标-存储-地址-生成阶段可以进一步分为两部分。

    第一部分是让目标存储处理对早期线程没有任何数据依赖关系的代,这些代被快速计算然后转发到下一个线程。第二部分计算可能依赖于较早线程的数据的不安全目标存储地址。这些计算必须在开始之前等待来自前驱线程的 tsag_done 标志。

3. 计算阶段:

  • (i)此阶段执行称为计算阶段的线程的主要计算。如果加载操作的地址在此阶段与其内存缓冲区中的目标存储条目的地址匹配,则线程可以从条目中读取数据(如果可用),或者进一步等待,直到数据从更早的并发线程。

    而另一方面,如果在此阶段的实现过程中计算了目标存储的值,则线程需要将地址和数据转发到其所有并发后继线程的内存缓冲区。

  • (ii)线程的计算阶段以停止指令结束。

4. 回写阶段:

  • (i)如果在线程结束(或完成)其执行的计算阶段通过将存储在其内存缓冲区中的所有操作数据写入内存(实际上包括来自两个线程的数据)来完全清除控制依赖项有针对性的和正规的商店。
  • (ii)当来自存储操作的数据需要保留在内存缓冲区中直到此回写阶段以确保内存状态不会被假设的线程更改,该线程随后由于错误的控制假设而被较早的并发线程终止.
  • (iii)为了保持正确的内存状态,同时线程必须按照它们的本地顺序执行它们的写回阶段。这意味着线程在执行回写阶段之前必须等待来自其前一个线程的 wb_done 标志。在完成自己的回写阶段后,它还需要将 wb_done 标志转发给下一个线程。由于所有存储的数据都是逐线程提交的,因此在运行时不会发生先读后写和先写后写的威胁。