一 臨界區和競爭條件數據結構
臨界區:訪問和操做共享數據的代碼段。併發
競爭條件:多個執行線程處於同一個臨界區中。性能
處於競爭條件:形成訪問的數據或者資源不一致狀態:大數據
對資源i的訪問:ProcessA和B訪問後獲得正確的結果應該是9:spa
進程是併發執行,有可能獲得的結果是:8線程
防止這種狀況的發生:保證對資源的訪問原子操做。設計
二 加鎖blog
鎖:採用原子操做實現,原子操做不存在競爭。進程
形成併發緣由:資源
l 中斷:隨時能夠打斷當前執行的進程代碼;
l 軟中斷和tasklet:任什麼時候刻能喚醒調度軟中斷和tasklet,打斷當前正在執行的代碼;
l 內核搶佔:當前任務被搶佔;
l 進程睡眠:喚醒調度程序,執行新的進程;
l 多處理器:同時執行代碼。
針對資源併發競爭條件的存在,須要對資源進行保護,保證資源的訪問操做是原子的。
須要弄清楚哪些數據須要被保護,要試圖弄清楚資源會不會被併發的訪問操做。
三 死鎖
多個執行線程互相等待被對方佔用的資源,但永遠不會釋放各自擁有的資源,致使衆線程永遠沒法獲得執行。
出現死鎖是件很危險的事情,預防死鎖:
l 加鎖順序保持一致;
l 防止發生飢餓措施;
l 不要重複請求同一個鎖;
l 複雜加鎖方案形成死鎖機率較大——設計鎖力求簡單;
四 鎖的粒度
加鎖粒度:描述加鎖保護的數據規模;
過粗的鎖:保護大塊數據,如子系統全部數據結構;
精細的鎖:保護小塊數據,一個大數據結構中的一個元素;
在粗糙與精細之間須要平衡:精細的鎖複雜開銷大,良好擴展性:從單核到多核,爲提升性能,鎖得機制變得更細。
保護數據不被併發的訪問,加鎖你的代碼。恰當的加鎖:知足不死鎖、可擴展、清晰簡潔。