原子性
原子性這個概念初想是非常簡單的。它表示一個操作序列就像一個操作一樣不被打斷,而不像一個操作序列一樣中間容許被打斷。但是細想下來還是挺有點意思的。首先需要確定的就是什么是一個操作?而什么不是一個操作卻是一個操作序列?其次需要確定的是如何叫做像?怎么著就是不像了?另外,還有一個牽扯進來的概念就是原子性的范圍和其在什么程度上實施這種保證。或許我這兒說的有點形而上,那我們就形而下的舉出例子抓住原子性這個概念的直觀感覺。?
先舉一個CPU指令集中常見的一個指令:CAS。看到這個指令我就仿佛看到了大家臉上的某種意味的笑容。呵呵,是的,它完成兩個操作,一個比較,一個交換,后一個完不完成依賴于前一個操作的結果,從邏輯上說,它們是兩個操作,可是它們特意被實現為不可打斷的。這就是一個經典的原子指令。我們分析一下,這里面什么是我們前文提到的操作,什么是操作序列?什么是不容打斷性?其實現的范圍如何?其實現在什么程度上能保證不被打斷?比較和交換是上文提到的操作,它們的邏輯順序組合式操作序列,CPU在硬件級別實施了不容打斷性,由于CPU級別實現了這種不容打斷性,那么在整個計算機系統中其不容打斷性都得到了保證,也就是說,這種不容打斷性實現的范圍是全系統。只要計算機沒有斷電,器件正常而且正常運行,這種不容打斷性就是能夠保證的。顯然,計算機在執行該原子操作的一般的時候突然斷電,并不能保證原子性了。這就是該原子性的保證強度,可以說是比較強的。尤其是我們假設把計算機系統定義為run machine的時候,可以說在全系統的范圍都能得到強保證。?
看到這兒,我們總希望深入一步,CPU是如何實施這種保證的。雖說我并不想探討這個技術細節的問題(一般情況下,我更愿意探討概念而不是細節,原因是概念不變而物理實現細節恒變),但是還是有某些要求導致我需要探討物理實現。?
CPU 首先把這個操作序列實現為一條指令,然后采用某種措施保證該指令執行期間不會被打斷,一般情況下這種保證措施是總線的占據而不釋放。有時候有些人愿意把這個叫做總線鎖定。這就是實現方式,我不想更進一步的深入到如何鎖定總線而不釋放,如果有興趣知道,參見相關的硬件文檔。?
通常情況下,與我們而言,我們要求更高級更符合我們需求的原子性,而不是CPU級別實現的原子性。最明顯的例子就是信號量相關P、V操作。P、V操作要求是原子性的。也就是說,無論是P(一直等到有信號狀態,然后置成無信號狀態,用語言描述就是while (s == 0) {wait}; s = s - 1),還是V(置成有信號狀態s = s + 1),都要保證其過程不被打斷。這時候,我們就是依賴于CPU給我們提供的原子性保證,來實現我們這個相對來說更高級一點的原子性的操作序列。它是如何實現的并不是我們關注的焦點,我們還是想要分析一下這個所謂的P、V原子性操作序列的實現特質。我們分析一下,這里面什么是我們前文提到的操作,什么是操作序列?什么是不容打斷性?其實現的范圍如何?其實現在什么程度上能保證不被打斷?第一個個問題似乎跟具體實現有關系,我們不深入討論什么是其操作步驟了,操作序列顯然就是P或者V本身的所有操作。它們的實現不容被打斷。這沒什么可說的,但我們馬上就遇到了真正有趣的問題的,實現范圍!在什么范圍內起保證不被打斷?在整個計算機系統?在一個進程中?或者還有什么別的范圍?顯然,這是一個問題。這里我并不想給出一個具體的說法,因為顯然可以有很多說法。那么,其實現在什么程度上保證不被打斷呢?顯然,這個問題跟實現范圍的問題有所糾纏,如果其實現范圍是全系統,那么在整個計算機系統的任意時間內,P、V操作都保證不被打斷,而如果其實現范圍是進程,那么在該進程活動步驟中,P、V操作保證不被打斷,但并不保證進程不會在正在執行P或者V操作的時候被打斷而切換到另一個進程中。更不要說計算機系統因故停機對它們的打斷了。?
從上面的兩個形而下的例子中,我們是不是能比較清晰的給出一個關于“如何叫做像?怎么著就是不像了?”的一個答案了。?
最初我們的定義是其實現就是一個不容打斷的操作序列,現在我們看到,只要在某種范圍和程度上,看起來這個操作序列沒有被打斷就行了。這就使所謂的“像是沒有被打斷”的真實含義。?
下面我還想更進一步討論一下關于數據庫事務中的原子性問題。?
數據庫事務中的原子性,可以用要么全做,要么不做來概括。看出來了么?它其實是上面原子性的目的。所以我們把數據庫中的事務的這個特性叫做原子性是相當切題的。但是它似乎跟我們所說的原子性有點微妙的區別。這是真的么??
其實我們還可以用上面的范圍和程度等來分析數據庫事務中的原子性的特征。這兒我就把它當成一個練習留給讀者了。我想順帶提一下的是:對于分布式數據庫事務的兩階段提交這個非常出名和非常聰明的保持原子性的辦法,是(似乎是)Jim Cray提出來的,他現在在Microsoft工作,而Microsoft的DTC可以說是分布式事務實現的鼻祖。看來我們也不能太看扁了 Microsoft:)。?
現在我們是否可以回答原子性究竟是什么了呢?我打開門把你們迎接進來,卻沒有告訴你們正確的出口,這個答案得你們自己找。祝你們好運。
轉載于:https://www.cnblogs.com/Daniel-G/p/3190247.html
總結
- 上一篇: 一个一直没想通的问题:为什么印度的软件外
- 下一篇: Ruby on Rails 實戰聖經阅读