1.单处理器结构中的同步于互斥
各个进程在宏观上并性,微观上串行。在同一时间点上,只有一个进程正在运行,因此称为“并发”。保证进程间的同步与互斥是比较容易的。只要保证在对临界资源的操作中途不会发生进程调度,不会发生中断,或者即使发生了中断,也与操作对象无关,那也保证了操作的互斥性。只要对临界资源的操作能在单条指令中完成,那就保证了操作的互斥性,因为中断发生在指令之间,不会发生于一条指令的执行途中。
2.多处理器结构中的同步于互斥
多处理器的SMP结构相对于单处理器,“分辨率”会更高。
2.1 对于i386 CPU在执行期间,通过对总线加锁的方式实现互斥操作:
- 在汇编程序中一条指令之前面加前缀“LOCK”:CPU在执行这条指令时把引线LOCK的电位拉低,同一总线上别的CPU不能通过总线访问内存。
- 总线加锁特例:xchg指令,将一个内存单元中的内容与一个寄存器的内容对换,常用于内核信号量的操作。在执行xchg指令时,会自动锁住总线。例如:
2.2 “内存路障”(memory barrier)
高速缓存的使用可能会使实际的内存操作改变次序,在SMP结构中,这种次序的改变也可能影响到CPU间的同步与互斥。
从访问内存的角度看,这就使得CPU可能会有一些逻辑上已经完成,但物理上尚未实现的内存操作。如何解决这类问题?
通过“内存路障”(memory barrier)。
- 隐示memory barrier方式:所有对系统总线加锁的操作;一些特殊的指令和操作:iret,cpuid,sfense
- 显示memory barrier方式:mb()/rmb()/wmb()