汇编实现临界区

网上的参考资料:
LOCK前缀
(翻译自:Intel指令LOCK)
LOCK前缀导致处理器在执行指令时会置上LOCK#信号,于是该指令就被作为一个原子指令(atomic instruction)执行。在多处理器环境下,置上LOCK#信号可以确保任何一个处理器能独占使用任何共享内存。
注意:后来的Intel64和IA32处理器(包括Pentium4,Intel Xeon, P6)有时即使没有置上LOCK#信号也会产生锁动作的。
LOCK前缀只能放在下列指令前面: ADD, ADC, AND, BTC,BTR,BTS,CMPXCHG, CMPXCH8B, DEC,INC, NEG,NOT, OR, SBB, SUB, XOR, XADD以及XCHG。如果LOCK指令用在了非上述指令前则会引发#UD异常(undefined opcode exception,未定义操作数异常);而且LCOK前缀的指令的目标操作数只能是内存寻址方式,否则也会引发#UD异常的.XCHG指令不管前面有无LOCK前缀都会置上LOCK#信号,即XCHG总是作为原子指令执行。
LOCK前缀常常放在BTS前,用来实现对一个共享内存的读-修改-写(read-modify-write)原子化操作。
内存是否地址对齐并不影响LOCK前缀的功能。实际上,内存锁定对任何非对齐内存地址都其作用的。
这个指令的操作在64位和非64位模式下是一致的。
BTS指令
(翻译自Intel指令)
BTS指令的第一个操作数称为位基址(bit base),亦称位串(bit string);第二个操作数为位偏移值(bit offset)。
进位标志CF(Carry Flag)
进位标志CF主要用来反映运算是否产生进位或借位。 如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。
BTS就是根据位偏移值从位串中取出一位放入CF中,然后将位串中的该位置成1。位基址可以为寄存器或内存寻址;位偏移值可以为寄存器或立即数:

1. 若位基址为寄存器,则BTS指令将位偏移值模(mod)16、32或者64(模值的大小根据模式和寄存器大小,64位操作数只能在64位模式中有效)。此时允许位串的任何一个位置被取出。

2. 若位基址为内存寻址,那么该操作数为位串在内存中的地址。位偏移值的范围大小由操作数的大小来决定。

有些汇编编译器当位基址为内存寻址,而位偏移量为立即数时,该立即数可以大于31。这种情况下,大于31的位偏移量的低3或5位(操作数为16位是低3位;操作数为32位是低5位)其实是真正的位偏移量(译注:其实我们看出偏移量最大还是31(2^5));其余的高位部分作为位基址的内存寻址方式中的位移量(displacement)。

BTS指令常常和LOCK前缀配合成为一个原子指令。

在64位模式中,BTS指令的缺省大小为32位。使用REX前缀的下面的格式REX.R可以访问附加的寄存器(R8—R15);REX前缀的下面的格式REX.W将提升操作数大小至64位。

PAUSE指令
(翻译自Intel指令)

PAUSE指令提升了自旋等待循环(spin-wait loop)的性能。当执行一个循环等待时,Intel P4或Intel Xeon处理器会因为检测到一个可能的内存顺序违规(memory order violation)而在退出循环时使性能大幅下降。PAUSE指令给处理器提了个醒:这段代码序列是个循环等待。处理器利用这个提示可以避免在大多数情况下的内存顺序违规,这将大幅提升性能。因为这个原因,所以推荐在循环等待中使用PAUSE指令。

PAUSE的另一个功能就是降低Intel P4在执行循环等待时的耗电量。Intel P4处理器在循环等待时会执行得非常快,这将导致处理器消耗大量的电力,而在循环中插入一个PAUSE指令会大幅降低处理器的电力消耗。

PAUSE指令虽然是在Intel P4处理器开始出现的,但是它可以向后与所有的IA32处理器兼容。在早期的IA32 CPU中,PAUSE就像NOP指令。Intel P4和Intel Xeon处理器将PAUSE实现成一个预定义的延迟(pre-defined delay)。这种延迟是有限的,而且一些处理器可以为0。PAUSE指令不改变处理器的架构状态(也就是说,它实际上只是执行了一个延迟——并不做任何其他事情——的操作)。
这个指令的操作在64位和非64位模式下是一致的。

JB是位转移指令,而JC是判进位标志CY的转移指令。JB=1,则转移,否则,顺序执行;JC=1,则转移,否则顺序执行。例如,JB P1.2,DELAY;当(P1.2)=1,则转移到DELAY,当(P1.2)=0时,顺序执行。

我的设计:

全局:

string(1)=0;

线程:1,2,。。。。N

begin:

lock

BTS string 1

jb  PauseAndWait

// 临界区开始 CriticalSection

..........

string(1)=0      //复位全局,下一个可进入临界区

// 临界区结束

// 非临界区  non-critical code section

.....

PauseAndWait:

   pause 

jmp   begin

其中高级语言可以提供一组函数给用户。系统预先分配一些标识,提供一些封装好的操作函数,不同的设计,结果也不一样,但原理是一样的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值