Linux核心開發之並發控制(二)

來源:互聯網
上載者:User

上集說到哪兒了呢?瞧這記性,什嗎?說到"天要下雨,娘要嫁人"那段。。

這是誰在答話,廢話,我當然知道講到這裡了,我是說驅動講到哪裡了。算了,不管了..

話說Linux開源社區的開發人員們做了什麼工作呢,很簡單:

利用spin_lock()/spin_unlock()作為自旋鎖的基礎,將它們和關中斷local_irq_disable()/開中斷local_irq_enable(),關底半部local_bh_disable()/開底半部local_

bh_enable(),關中斷並儲存狀態字local_irq_save()/開中斷並恢複狀態local_irq_restore()結合就完成了整套自旋鎖機制。

唉吆,我的天啊,不是我說你們開源社區的那些傢伙們,說個東西為啥要那麼費勁,就為了說完上面那些紅色的破話,差點沒喘過來,本來在上篇就想說你們的…

好人做到低,送你送到西,嘿嘿..我把上邊的關係再幫大家捋捋,免的看著費勁…

spin_lock_irq() = spin_lock() + local_irq_disable()spin_unlock_irq = spin_unlock() + local_irq_enable()spin_lock_irqsave() = spin_unlock() + local_irq_save()spin_unlock_irqrestore() = spin_unlock() + local_irq_restore()spin_lock_bh() = spin_lock() + local_bh_disable()spin_unlock_bh() = spin_unlock() +local_bh_enable()

又是一口氣,這是什麼年頭,掙點點擊率,怎麼就這麼難呢..不過也是沒辦法的事,上了Linux這條賊船,就要有犧牲我一個,幸福全中國的決心,不然微軟的又要囂張了,今天黑你一次屏,明天斷你一次網,就連去網吧,微軟還伸手到你面前說:對不起,你的系統是盜版…

好了,讓他們熱鬧去吧,說說咱們的事。作為Linux驅動程式工程師,你要在心裡刻下幾條戒律:

1)什麼叫自旋鎖,就是忙等待,當鎖不可用時,CPU除了在那兒拚命的執行"測試並設定"的傻瓜操作外什麼都不做,才不管電影中含情脈脈的你是她的誰,她是你的誰的這些事,任你兩情相約,也是執手相看淚眼,竟無語凝咽。可見,這是多麼的影響系統的效能。

2)what?你不懂愛情,不在乎第一條,我暈…那就給你來個狠的:處理不好自旋鎖可能導致系統死結(dead lock),系統癱瘓。呵呵怕不,等你哭著鬧著要上網而不能時,就怕了。那為啥會這樣了,很簡單,想想:如果我們不小心在一個遞迴中使用一個自旋鎖,說白了就是一個CPU,它已經獲得了這個自旋鎖,可還貪心地想第二次獲得這個自旋鎖,這時就死結了唄。另外,如果一個進程獲得自旋鎖之後再阻塞,也是很有可能導致死結的發生。

理論完了,給你來點代碼,就當是程式員點的一點交代吧:

int device_count = 0;  定義檔案開啟的次數計數static int device_open(struct inode *inode, struct file *filp){    ...    spinlock(&device_count);    if(device_count)  //已經開啟     {         spin_unlock(&device_count);         return -EBUSY;    }    device_count++;  //增加使用計數    spin_unlock(&device_count);    ...    return 0;}static int device_release(struct inode *inode, struct file *filp){    ...    spinlock(&device_count );    device_count--; //減少使用計數    spin_unlock(&device_count );    return 0;}
 

出招表四:讀寫自旋鎖(防寫不防讀)

"找你所說,上面的那招自旋鎖看似相當好啊.."

"那是,也不看看是誰教的.."

"那我就不明白了,接著你說的例子:你說我買票是吧,售票員看到一張票(讀)也沒錯啊,錯在與她把票賣出去的操作上(寫),你這可好,這樣一來,一旦一個鎖住,別人都別想看了,這也太傻瓜了吧.."小王不屑的鄙視我。

"耶呵,看不出來哈,你都知道用腦袋想問題了,以前不是都是要大腳趾計算的嗎..什麼時候升級換代的.."我吃驚的瞪著眼,"那好,不拿出點真貨你搞不定你了..請看新招之讀寫自旋鎖"
讀寫自旋鎖:它保留了自鎖的概念,但是它規定在讀方面同時可以有多個讀單元,在寫方面,只能最多有一個寫進程。當然,讀和寫也不能同時進行。

使用方法:1)初始化讀寫鎖的方法。

               rwlock_t x;//動態初始化                                            rwlock_t x=RW_LOCK_UNLOCKED;//動態初始化

               rwlock_init(&x);

             2)最基本的讀寫函數。

              void read_lock(rwlock_t *lock);//使用該宏獲得讀寫鎖,如果不能獲得,它將自旋,直到獲得該讀寫鎖

              void read_unlock(rwlock_t *lock);//使用該宏來釋放讀寫鎖lock

              void write_lock(rwlock_t *lock);//使用該宏獲得獲得讀寫鎖,如果不能獲得,它將自旋,直到獲得該讀寫鎖

              void write_unlock(rwlock_t *lock);//使用該宏來釋放讀寫鎖lock

             3)和自旋鎖中的spin_trylock(lock),讀寫鎖中分別為讀寫提供了嘗試擷取鎖,並立即返回的函數,如果獲得,就立即返回真,否則返回假:

              read_trylock(lock)和write_lock(lock);

             4)硬中斷安全的讀寫鎖函數:

             read_lock_irq(lock);//讀者擷取讀寫鎖,並禁止本地中斷

             read_unlock_irq(lock);//讀者釋放讀寫鎖,並使能本地中斷

             write_lock_irq(lock);//寫者擷取讀寫鎖,並禁止本地中斷

             write_unlock_irq(lock);//寫者釋放讀寫鎖,並使能本地中斷

             read_lock_irqsave(lock, flags);//讀者擷取讀寫鎖,同時儲存中斷標誌,並禁止本地中斷

             read_unlock_irqrestores(lock,flags);//讀者釋放讀寫鎖,同時恢複中斷標誌,並使能本地中斷

             write_lock_irqsave(lock,flags);//寫者擷取讀寫鎖,同時儲存中斷標誌,並禁止本地中斷

             write_unlock_irqstore(lock,flags);寫者釋放讀寫鎖,同時恢複中斷標誌,並使能本地中斷

             5)非強制中斷安全的讀寫函數:

             read_lock_bh(lock);//讀者擷取讀寫鎖,並禁止本地非強制中斷

             read_unlock_bh(lock);//讀者釋放讀寫鎖,並使能本地非強制中斷

             write_lock_bh(lock);//寫者擷取讀寫鎖,並禁止本地非強制中斷

             write_unlock_bh(lock);//寫者釋放讀寫鎖,並使能本地非強制中斷

呵呵,小王,看到沒有有了這第四招,你剛才的問題就沒有了,現在給你一個典型應用吧:

rwlock_t lock; //定義rwlock

rwlock_init(&lock);//初始化rwlock

 

//讀時擷取鎖

read_lock(&lock);

….//臨界資源

read_unlock(&lock);

 

//寫時擷取鎖

write_lock_irqsave(&lock, flags);

….//臨界資源

write_unlock_irqrestore(&lock, flags);

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.