來!拉一拉並發與鎖
首先哈早些年計算機出來程序作業只能一次一次的執行,手動裝載紙卡機,效率太低啊,因為人工做這個過程耗費大量的時間與CPU的速率不匹配,資源浪費。後來改進支持一批一批的把程序作業運行,這也就到了單道批處理的年代,單道批處理的好處有很多,如封閉性,可重復性等,效率低啊,I/O與CPU當然不匹配(後面通過三級內存來彌補)。單道批處理越來越滿足不了我們的時代需求,當時的工程師開動腦筋就整出來了多道批處理,多道面向的對象是進程,引用進程因為程序在多道不可再現性,失去了封閉性,因為程序要共享資源啊,那麽失去了程序的意義,進程引入了PCB塊概念可控制可描述狀態特征。
多道多道,並不是說同一時刻就可以處理兩個程序,這時候我們引入並發!進程並發在同一時間內,但是同一時刻一個處理機準確來說單核CPU運行的是一個程序,與並行一定要區分清楚!並行是同一時刻一起處理,SMP處理器之類的硬件也都越來越成熟,並行處理機制性能越來越好。
聊到這裏咱們大體的把幾個概念引入了一下單道、多道、程序、進程、並發、並行,雖然解釋不是特別專業的術語,但是大體明白了再去百度看專業術語會輕松很多。今天主要聊的是並發其余概念有興趣的朋友可以自行學習,那麽我們下面仔細描述並發和數據庫並發都是什麽東西,異曲同工。
上面咱們已經說了並發的基本概念,那麽在進程並發的時候就破壞了封閉性,共享資源,所以會帶來什麽後果呢
那麽並發與鎖啥關系呢?獨占資源怎樣做的呢?為什麽會有時候應用卡死,進程卡死呢(部分也是因為鎖)?下面我們一起來看一看
我們把兩個人比作並發的兩個進程或者線程,當同時訪問某一個資源,這個資源也叫臨界資源,臨界資源只能讓一個進程進去工作啊,不要說為什麽只能允許一個進程使用,請在回過頭讀上面的內容!這樣的話我們就要對這個資源進行一些特殊的手段,
對鎖我們也有大體的理解,就是保證臨界資源一種手段,在同步和通信很鎖重要,互斥鎖(mutex),statas,條件變量(死鎖機制)等等下面簡單的把條件變量(死鎖機制)做一下代碼區介紹
死鎖:當資源相互占用且無法釋放,就會出現死鎖現象,死鎖如A->C,B->D,A->F,B->F,意思為A,B個訪問一個不牽連的資源,因為需要訪問都去F,那麽都想去用它,誰都不給誰妥了那就直接死鎖!
條件變量:
LOCK Mutex
check data structures
while (resource busy)
wait (condition variable)
mark resource as busy;
UNLOCK mutex;
簡單介紹到這裏,我們主要說數據庫再來談談的悲觀鎖與樂觀鎖,也就是數據鎖定
悲觀鎖:
悲觀鎖就是破釜沈舟的感覺,直接在更改前鎖定行!註意悲觀鎖是行鎖定!
格式:
update t set sal = 30000 where name='als' for update;
解釋:
for update是關鍵字!用於對於name='als'的行鎖定,其余的行可以進行操作,後面可以根參數nowait來返回錯誤值!
樂觀鎖:
樂觀鎖其實更類似於多條件刪選,那麽我們通過where後指定刪選條件(多個!)and連接多個刪選條件來進行,註意雖然比較效率高但是可能會更新失敗!
兩個鎖的理念不同,悲觀是假定用戶一開始就鎖定資源,而後知是在執行直接更新未鎖定,悲觀鎖耗費資源會更多,所以我們盡量減少悲觀鎖的使用,有點當然安全性更好,樂觀將會設計更新失敗(並非失敗提示更新 0 rowa update),雖然已經把悲觀鎖變為行級別,但是在頻繁操作中會極大影響系統性能,樂觀鎖又有很大的風險,性能較好,悲觀鎖側重安全,樂觀鎖側重性能,那麽到底用哪一種請大家根據實際需求選擇
對於鎖咱們就聊到這裏其實以上都是本人根據以往的學習和實踐的體會,不一定非常正確,不喜勿噴,了解還不是特別深入,後續會持續更新,比如Oracle內核如理處理鎖機制,操作系統級別如何更細膩處理!
來!拉一拉並發與鎖