由於cpu的讀寫速度遠遠大於記憶體的讀寫速度,所以為了解決cpu訪問主記憶體效率低下的問題,cpu引入了快取。這時因為主記憶體和快取都會存有資料,那麼勢必要保證快取中的資料和主記憶體資料的一致。特別是多執行緒情況下,如果兩個執行緒同時從cpu快取中讀取的值i為1,二者同時對i+1,然後寫回主記憶體,那麼i的值回變為2,但實際上i進行了2次+1的操作,實際值應該是3。這就是cpu快取不一致導致的問題。解決方法:
匯流排加鎖,由於cpu和其他元件都是通過匯流排(資料匯流排,控制匯流排,位址匯流排)來通訊,不過如果採用匯流排加鎖的方式,就只能有乙個cpu能夠獲取到匯流排鎖,從而訪問到記憶體中的變數,而其他的cpu都會被阻塞。這就類似於讀寫都序列化了,對效率的影響會很大。
快取一致性協議,在快取一致性協議中,最出名的就是intel的mesi協議,mesi的大致思想是,當cpu操作的變數是乙個共享變數時,注:cpu cache由很多個cache line構成,可以把cache line簡單的理解為cpu cache中的最小快取單位。目前主流的cpu cache的cache line大小都是64位元組。說明其他的cpu快取中也可能會存在副本,那麼這時候對該共享變數的讀操作不做限制,照常讀取資料,只是在寫入的時候,會發出訊號告訴其他的cpu將這個變數的cache
line設定為無效狀態,那麼其他的cpu在對該變數做讀取時,由於快取中的該變數已經失效,那麼就會重新到主記憶體中讀取。
十 資料庫與快取雙寫不一致性問題
我們在專案中大量使用快取,主要是利用其高併發和高效能特性,一般情況下,我們是這樣使用快取 快取的讀取操作 先判斷是否有快取,有快取之間返回給前端,無快取,從資料庫查詢資料,如果資料庫查詢結果為空,則直接返回給前端,如果資料庫查詢結果不為空,則將資料寫入快取再返回給前端 快取的更新操作 可以分為 1 ...
併發操作與資料的不一致性
最近做的 選修課系統 需要考慮這樣乙個問題 資料庫的併發操作帶來的資料庫資料不一致問題 因為是全校性選修課,同一時間點大批學生選課,那麼必然存在多名學生同時對同一資料進行操作 是的問題,如果這種併發操作不加以控制的話,必會造成資料的不一致。一直知道有這種問題,並且知道這種問題的解決方法 加鎖 但是有...
併發操作與資料的不一致性
最近做的 選修課系統 需要考慮這樣乙個問題 資料庫的併發操作帶來的資料庫資料不一致問題 因為是全校性選修課,同一時間點大批學生選課,那麼必然存在多名學生同時對同一資料進行操作 是的問題,如果這種併發操作不加以控制的話,必會造成資料的不一致。一直知道有這種問題,並且知道這種問題的解決方法 加鎖 但是有...