作者ggg12345 (ggg)
看板ASM
标题Re: [问题] Lock的用法
时间Fri Jan 1 23:38:45 2010
※ 引述《ksmrt0123 (ksmrt)》之铭言:
: 查了一下「LOCK」的说明,. LOCK并不是一个指令, 它只是指令的
: prefix, 必需配合某些特定指令使用. 以达到让CPU跟BUS/Memory知道,
: 该指令之执行必需符合「Atomicity」要求 (即atomic instruction).
: Atomic instruction在shared memory multi-processor系统中是
: process synchronization (如 mutual exclusion)之基础.
=====
假设原 post 问的 lock 是 X86 组语里的 lock prefix.
以上 说明 完全正确.
: 最基本的
: atomic instruction是shared memory read/write. 但read/write
: 并不够powerful, 用read/write来实作synchronization一方面可能
: performance不够好, 一方面有些好的演算法特性用(如FIFO ordering)
: 已经证明只用read/write是无法作出来的.
memory read/write 指令当然不会是 atomic operation,
process-A process-B
read data-s
read data-s
modify to A
modify to B
write data-s write data-s
那 data-s 最终结果是那一个 ?
: 为了克服上述问题, 有些更强的指令被提出, 最有名即是许多演算法会
: 用到的 compare-and-swap. 这个指令可由CMPXCHG 加上 LOCK实作出来.
: 其它常见的类似指令还有 test-and-set, swap, fetch-and-store.
: 在x86都有相关指令可配合LOCK作这些指令来.
Intel 的 lock prefix 是配合 像swap 这个指令做的, 因为这个指令是由
--->代表 move data
1. memory --> temp
2. ACC --> memory
3. temp --> ACC
swap 是从指定的记忆体位址内容 跟 ACC register 内容做交换. 对memory
做 read 及 write 两个动作, 但必须同时做完, 不可被打断插队以致干扰
到 memory location 及 ACC 的内容. 所以, 用 lock 要求对 memory access
的 bus 锁住, 不会被插队进来.
: 问题是要达到atomic的功能, 虽然CPU有此指令, BUS(or interconnect)
: 及memory system等也都必需要能够配合, 这方面在multi-processor
: 系统并不容易实作, 实际上好像没有任何x86 shared-memory multi-
: processor system是有support LOCK prefix的.
Intel 以前自家公司的电脑使用 multi-bus , 8086 有一支脚会送出这个
lock 讯号告诉 bus controller 不能释放 bus 给其他 processor, 不能
打断这个 swap 的三个子动作
: 现在的CPU都是多核心, LOCK prefix是否仍适用在现在的多核处理器
: 我就不清楚了...
多处理机时代, memory bus 做成 request , result-reply 分离, 更需要
锁定 memory bus . 多核心问题依旧, 当然是在内部进共用的对外 memory
bus 就要 lock 住.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.115.4.12