天天看點

新的排隊spin_lock--有序和無序

2.6.25核心實作了新的自旋鎖,叫做ticket spin_lock,ticket就是排隊的意思,就像看電影時拿着票有序入場一樣,新的自旋鎖不再是亂搶自旋鎖了,而是有序地獲得自旋鎖,這樣就消除了一些不必要的混亂。這樣做的初衷是什麼呢?首先看看自旋鎖的意義,它是一種十分高效的鎖,得不到鎖的時候不是睡眠而是自旋,自旋就是忙等,這樣就免去了睡 眠-切換-喚醒-切換的開銷,畢竟一個程序睡眠必然導緻一次硬切換,而喚醒仍然需要一次硬切換。但是在忙等期間,cpu實際上沒有做什麼有意義的事情,這 是一點小小的弊端,但是任何事必須圖一方面,和睡眠-切換-喚醒的開銷比起來,這麼做是十分有意義的。另外要明白的是,目前實作的自旋鎖的争搶實體實際上 是cpu,而不是程序,在單cpu的非搶占核心上,自旋鎖是不必要的,在單cpu的搶占核心,自旋鎖實際就是禁用了搶占而已,隻有在多cpu的環境下,自旋鎖作為鎖的意義才真正存在,是以我們說是cpu獲得了自旋鎖而不是别的。要了解新自旋鎖的意義還要了解老自旋鎖的實作。老的自旋鎖是一個整數,在cpu 企圖獲得鎖的時候要将此數減一,然後看看是否為0,如果為0,那麼就獲得了鎖,如果為負數就說明别的cpu比此cpu先獲得了鎖,然後此cpu進入忙等, 等待占有鎖的cpu釋放鎖進而将鎖置為1,然後它再次将其減一後與0比較。這麼實作可以看出,一個cpu企圖獲得鎖時所探測到的鎖的值是負數并且絕對值越大,那麼就有越多的cpu在争搶這個自旋鎖,這看起來沒有問題,就像踢足球一樣,那麼多人搶一個球,但是足球有個人技術,團隊合作在裡面,有輸有赢的結果,而自旋鎖就不一樣了,所有的cpu要公平競争,沒有團隊,沒有個人技術,但是這個實作真的就很公平嗎?如果不考慮硬體告訴緩存,那麼它可能還是比較公平的,但是幾乎每個cpu都有硬體高速緩存,如果一個cpu得到了自旋鎖那麼資訊就會被讀入該cpu的緩存行,後來它釋放了這個自旋鎖,但是馬上它又去争 搶同一個鎖,這樣這個cpu對于别的cpu就是不公平的,它再次得到自旋鎖的可能性要比别的cpu要大,是以,老的自旋鎖實作方案看似公平實際不公平,按道理應該讓等待時間最長的cpu獲得自旋鎖。要得到這樣的效果,改進點已經很明确了,就是增加一個隊列,這個隊列的元素按照等待時間排隊,資料結構也很簡單,增加一個list_head字段即可,如果這麼實作當然比較好,比較規則,比較規範,但是不是那麼藝術和高效,于是新的ticket自旋鎖由運而生。 

以上從理論角度闡述了老的自旋鎖的實作,下面看一下具體的代碼,主要是純粹的獲得鎖和釋放鎖的代碼,不再讨論開關搶占的内容:

#define spin_lock_string /

 本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1274038

繼續閱讀