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