原子交换原语:将寄存器中的一个值和存储器中的一个值相互交换。
采用指令对的方法实现单个的原子存储器操作。这一指令对包括链接取数指令和条件存数指令。
链接取数指令:返回锁单元的原始值。
示例:
ll $s1,20($s2) 含义:$s1=Memory[$s2+20]
条件存数指令:保存寄存器的值,如果执行成功将寄存器的值修改为1,否则修改为0。
示例:
sc $s1,20($s2) 含义:Memory[$s2+20]=$s1,($s1=0或1)
顺序地使用这两条指令,如果ll指令所指定的锁单元的内容在sc指令执行前已经被改变,sc指令执行失败
实现存储器单元的原子交换的指令序列:(存储器单元的地址由$s1中的值指出,寄存器$s4)
again: add $t0,$zero,$s4
ll $t1,0($s1)
sc $t0,0($s1)
beq $t0,$zero,again
add $s4,$zero,$t1
解析:执行第一行:寄存器s4中保存的值赋值给寄存器t0中
执行第二行:t1中保存锁单元原始内容A
执行第三行:执行sc指令,如果在ll和sc之间任何时候有处理器插入,并修改了锁单元的值,t0置为0,条件存数指令执行失败,否则条件存数指令执行成功,t0置为1,保存$s4中的值在锁单元之中
如果t0=1
跳过第四行执行第五行,将A保存在寄存器$s4中,从而实现了寄存器$s4中的值和存储器中的值A的互相交换。
如果t0为0,引起指令序列重新执行。