计算机组成和设计 - 原子操作

411 阅读3分钟

指令与并行性:同步

数据竞争: 来自两个不同的线程的访存请求访问同一个位置,至少有一个是写,且连续出现,那么这两次存储访问形成了数据竞争。

加锁和解锁同步操作的实现。加锁和解锁可直接用于创建只有单个处理器可以操作的区域,称为互斥区,以及实现更复杂的同步机制。

1 原子交换 用0表示锁变量可用,1表示锁变量被占用。

2 使用指令对,其中第二条指令返回一个值,该值表示指令对是否被原子执行,如果任何处理器执行的所有其他操作都发生在该对指令之前或之后,则该指令对实际上是原子的。因此当指令对实际是原子操作时,没有处理器可以在指令对之间改变值。

原子操作

在单处理器系统(UniProcessor)中,能够在单条指令中完成的操作都可以认为是" 原子操作",因为中断只能发生于指令之间。

多处理器(Symmetric Multi-Processor)结构中就不同了,由于系统中有多个处理器在独立地运行,即使能在单条指令中完成的操作也有可能受到干扰。

原子操作(atomic operation)意为“不可被中断的一个或一系列操作”。

在RISCV中,这对指令指的是一个称为保留加载双字的特殊加载指令和一个称为条件存储双字的特殊存储指令。

这些指令按顺序使用,如果加载指令指定的内存位置的内容在条件存储指令执行到同一地址之前发生了变化,则条件存储失败不会将值写入内存。

条件存储指令定义为将寄存器的值存储在内存中,如果成功则将一个寄存器的值更改为0,如果失败则更改为非零值。 sc.d定义了三个寄存器,一个保存地址,一个用于指示原子操作失败或成功,还有一个用于如果成功则将值存储在内存中。

x0寄存器

RISCV确保寄存器x0总是取0,当使用寄存器x0是时,它提供0. x0的值不可被修改。 寄存器x0用于创建汇编语言指令,将一个寄存器的内容复制到另一个寄存器。

RISCV汇编器将,mv(move)转换为addi指令。

翻译并启动程序

C程序 - 编译器(汇编语言程序)- 汇编器(目标模块:机器语言模块,目标库:库例程) - 链接器(可执行代码:机器语言程序)- 加载器(存储器)

链接器: 链接编译器。 是一个系统程序,将独立汇编的机器语言程序组合起来,并解析所有未定义的标签,最终生成可执行文件。

生成可执行文件。

加载器: 可执行文件在磁盘上,操作系统将其读取到内存并启动它。

动态链接库DLL,其库例程在程序运行之前不会被链接和加载。

RSICV指令系统,所有指令都保持单一长度。32个寄存器。

算术指令用于赋值语句

传输指令发生在数组或结构体等数据结构

条件分支用于if语句

无条件分支用于过程调用核返回case语句