|
共享鎖(S鎖):如果事務(wù)T對數(shù)據(jù)A加上共享鎖后,則其他事務(wù)只能對A再加共享鎖,不能加排他鎖,直到已釋放所有共享鎖。獲準(zhǔn)共享鎖的事務(wù)只能讀數(shù)據(jù),不能修改數(shù)據(jù)。 linux 自旋鎖: 當(dāng)進(jìn)程進(jìn)入CPU運(yùn)行時,就會給它的代碼上鎖,以免別的CPU中的進(jìn)程修改里面的代碼(不排除CPU給別的CPU上鎖這樣的情況,以后會討論到。)。所謂子旋鎖就是這樣的一把鎖:進(jìn)程A進(jìn)入CPU,鎖上門運(yùn)行,進(jìn)程B來到CPU前,發(fā)現(xiàn)門被鎖上了,于是等待進(jìn)程A出來交出開鎖鑰匙。 正如每次我們談到“鎖”這個概念時,總會談到“死鎖”——是的,我們用鎖,就必須防止死鎖,死鎖是這樣產(chǎn)生的:進(jìn)程A進(jìn)入CPU運(yùn)行,上鎖,進(jìn)程B 來到CPU門前等待進(jìn)程A出來,可是糟糕的情況出現(xiàn)了:進(jìn)程A要想出來就必須獲取進(jìn)程B的幫助,于是進(jìn)程A開始等待進(jìn)程B的幫助,可是進(jìn)程B卻又一直等待進(jìn)程A出來!這樣的等待無法終止,最終成為死鎖。 再比如,進(jìn)程A要鎖上甲代碼段,然后想再去鎖乙代碼段,進(jìn)程B要鎖上乙代碼段,然后想再去鎖甲代碼段。第一步大家都沒問題,可是兩個進(jìn)程都要進(jìn)行下一步時,發(fā)現(xiàn)無法完成任務(wù)了:進(jìn)程A已經(jīng)鎖上甲代碼段,進(jìn)程B沒法再去操作它,同理進(jìn)程B已經(jīng)鎖上乙代碼段,進(jìn)程A也沒辦法操作它,于是兩個進(jìn)程等待對方釋放鎖,當(dāng)然,這樣的等待也是無止無休的。這就好象兩輛汽車在一座很榨的橋上相向行駛,兩車碰頭誰也不讓誰,都在等待對方讓路。 避免死鎖,必須使每次上鎖操作都是有順序的、原子的操作。有順序的,也就是說每次都按照可執(zhí)行隊(duì)列地址從低向高的順序上鎖——我們以后會很好的討論這個。 原子的,就是說每次上鎖必須執(zhí)行到底,否則不予執(zhí)行 |
|
|