并发编程中的互斥与自旋互斥异同

       在现在多处理器多核模式架构的CPU下,多线程并发编程是系统编程程序员必须要掌握的技能。在数据同步中,用得比较多的就有互斥。
       在早期的系统中,只有互斥,后来增加了自旋互斥,那么这个互斥和自旋互斥有什么区别呢,到底怎么选择二者呢?
       提到互斥,不得不提到线程的上下文切换,线程上下文切换是有代价的,需要进入内核模式,要保存线程的相关数据与状态,以及寄存器数据,程序计数器等内容。
       互斥的实现基础,是基于硬件提供的compare-and-swap 指令,或者类似的指令。其本质是锁住内存地址总线,禁止短时间的中断来实现的。所以互斥的实现是由硬件提供直接基础的,不是纯由系统软件实现。
       基于互斥的实现基础,互斥适合于快速获得和释放的场景。
       现在流行的做法,是把互斥分成两类:阻塞和非阻塞。
       其中,非阻塞的互斥又称为自旋,因为自旋互斥如果没有获取它需要的锁,它会一直不断循环检测,直到取得互斥锁为止,
自旋互斥在运行期间,底层cpu禁止中断,不然会引入死锁。
       阻塞互斥与自旋互斥的区别在于:
       阻塞互斥如果没有获得锁,会进入睡眠状态,从而可能进行上下文切换,代价会大一些。
       自旋互斥如果没有获得锁,会不断循环检测,不会进入上下文切换,直到获得请求的锁,代价小一些,但是可能浪费CPU时间。

你可能感兴趣的:(操作系统)