原子操作和锁
一、原子操作
不可被中斷的一個或一系列操作。
二、處理器如何實現原子操作
32位處理器使用基于對緩存加鎖或總線加鎖的方式來實現多處理器之間的原子操作
(1)總線鎖:使用處理器提供一個LOCK#信號,當一個處理器在總線上輸出此信號的時候,其他處理器的請求將被阻塞,那么該處理器可以獨占使用共享內存。舉例:i=7,i++;兩個線程對i++進行操作,那我們最終期望的結果是9,但最終的結果可能是8,那么想要保證讀改寫共享變量的操作是原子操作的,就使用總線鎖,就是說cpu1讀改寫共享變量的時候,CPU2不能操作緩存了該共享變量內存地址的緩存。
總線鎖是把CPU和內存之間通信鎖住了,這使得鎖定期間,其他處理器不能操作其他內存地址的數據,所以總線鎖鎖定的開銷比較大。
(2)緩存鎖定:如果緩存在處理器緩存行中內存區域在LOCK操作期間被鎖定,當它執行鎖操作回寫內存時,處理器不在總線上聲言LOCK#信號,而是修改內部的內存地址,并允許它的緩存一致性機制來保證操作的原子性,因為緩存一致性機制會阻止同時修改被兩個以上處理器緩存的內存區域數據,當其他處理器回寫已被鎖定的緩存行的數據時會起緩存無效,在(1)中的例子,當CPU1修改緩存行中的i時,使用緩存鎖定,那么CPU2就不能同時緩存i的緩存行。
三、原子操作和加鎖機制。
在編寫代碼的時候,能使用原子操作時,就盡量不要使用復雜的加鎖機制。對多數體系結構來說,原子操作與更復雜的同步方法相比較,給系統帶來的開銷小,對高速緩存行的影響也小。但是,對于那些有高性能要求的代碼,對多種同步方法進行測試比較,也是一種明智的方法。
總結
- 上一篇: 如何看电影学英语
- 下一篇: MySQL 8.0.20 zip 免安装