五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

一文讀懂|內(nèi)核順序鎖

2023-09-05 15:40 作者:補給站Linux內(nèi)核  | 我要投稿

Linux 內(nèi)核有非常多的鎖機制,如:自旋鎖、讀寫鎖、信號量和 RCU 鎖等。本文介紹一種和讀寫鎖比較相似的鎖機制:順序鎖(seqlock)。

順序鎖與讀寫鎖一樣,都是針對多讀少寫且快速處理的鎖機制。而順序鎖和讀寫鎖的區(qū)別就在于:讀寫鎖的讀鎖會阻塞寫鎖,而順序鎖的讀鎖不會阻塞寫鎖。

讀鎖原理

為了讓讀鎖不阻塞寫鎖,讀鎖并不會真正進行上鎖操作。那么讀鎖是如何避免在讀取臨界區(qū)數(shù)據(jù)時,數(shù)據(jù)被其他進程修改了?

為了解決這個問題,順序鎖使用了一種類似于版本號的機制:序號。序號是一個只增不減的計數(shù)器,可以從順序鎖對象的定義看出,如下代碼所示:

在讀取臨界區(qū)數(shù)據(jù)前,首先需要調(diào)用?read_seqbegin()?函數(shù)來獲取讀鎖,read_seqbegin()?函數(shù)的核心邏輯是讀取順序鎖的序號。代碼如下所示:

從上面的代碼可以看出,read_seqbegin()?函數(shù)只獲取順序鎖的序號,并不會進行上鎖操作,所以讀鎖并不會阻塞寫鎖。

注意:序號是單數(shù)時需要重新獲取的原因,會在分析寫鎖實現(xiàn)原理時說明。

既然讀鎖并不會進行上鎖操作,如果在讀取臨界區(qū)數(shù)據(jù)時,數(shù)據(jù)被修改了怎么辦呢?答案就是:在退出臨界區(qū)時,比較一下當前順序鎖的序號跟之前讀取的序號是否一致。如果一致表示數(shù)據(jù)沒有被修改,否則說明數(shù)據(jù)已經(jīng)被修改。如果數(shù)據(jù)被修改了,那么需要重新讀取臨界區(qū)的數(shù)據(jù)。

比較序號是否一致可以使用?read_seqretry()?函數(shù),所以讀鎖的正確用法如下代碼所示:

read_seqretry()?函數(shù)的實現(xiàn)非常簡單,如下所示:

從上面代碼可以看出,read_seqretry()?函數(shù)只是簡單比較當前序號與之前讀取到的序號是否一致。


【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【749907784】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ? ?



寫鎖原理

從上面的分析可知,讀鎖是通過對比前后序號是否一致來判斷數(shù)據(jù)是否被修改的。那么序號在什么時候被修改呢?答案就是:獲取寫鎖時。

獲取寫鎖是通過?write_seqlock()?函數(shù)來實現(xiàn)的,其實現(xiàn)也比較簡單,代碼如下所示:

write_seqlock()?函數(shù)首先會獲取自旋鎖(所以寫鎖與寫鎖之間是互斥的),然后對序號進行加一操作。所以,在修改臨界區(qū)數(shù)據(jù)前,寫鎖先會增加序號的值,這樣就會導(dǎo)致讀鎖前后兩次獲取的序號不一致。我們可以用下圖來說明這種情況:

seqlock原理

可以看出,當在讀臨界區(qū)前后獲取的序號值不一致時,就表示數(shù)據(jù)已經(jīng)被修改,這時就需要重新讀取被修改后的數(shù)據(jù)。

寫鎖解鎖也很簡單,代碼如下:

解鎖也需要對序號進行加一操作,然后釋放自旋鎖。

由于?write_seqlock()?函數(shù)與?write_sequnlock()?函數(shù)都會對序號進行加一操作,所以解鎖后,序號的值必定為雙數(shù)。

我們在分析讀鎖時看到,如果序號是單數(shù)時會重新獲取序號,直到序號為雙數(shù)為止。這是因為序號單數(shù)時,表示正在更新數(shù)據(jù)。此時讀取臨界區(qū)的值是沒有意義的,所以需要等到更新完畢再讀取。

原文作者:Linux內(nèi)核那些事




一文讀懂|內(nèi)核順序鎖的評論 (共 條)

分享到微博請遵守國家法律
沙坪坝区| 蒙自县| 健康| 东城区| 浦东新区| 阳城县| 宁武县| 溧水县| 青铜峡市| 石首市| 彰化县| 卓尼县| 察雅县| 弥渡县| 绥宁县| 岱山县| 舞阳县| 安达市| 克山县| 如东县| 静安区| 湖州市| 哈尔滨市| 乌审旗| 波密县| 休宁县| 江都市| 瑞安市| 文安县| 儋州市| 扎兰屯市| 精河县| 东至县| 张北县| 两当县| 邳州市| 和田县| 加查县| 大宁县| 开封县| 巴中市|