資源描述:
《linux設(shè)備驅(qū)動(dòng)程序之并發(fā)控制》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫(kù)。
1、上集說(shuō)到哪兒了呢?瞧這記性,什么?說(shuō)到"天要下雨,娘要嫁人"那段。。這是誰(shuí)在答話,廢話,我當(dāng)然知道講到這里了,我是說(shuō)驅(qū)動(dòng)講到哪里了。算了,不管了..話說(shuō)Linux開(kāi)源社區(qū)的開(kāi)發(fā)者們做了什么工作呢,很簡(jiǎn)單:利用spin_lock()/spin_unlock()作為自旋鎖的基礎(chǔ),將它們和關(guān)中斷l(xiāng)ocal_irq_disable()/開(kāi)中斷l(xiāng)ocal_irq_enable(),關(guān)底半部local_bh_disable()/開(kāi)底半部local_bh_enable(),關(guān)中斷并保存狀態(tài)字local_irq_save()/開(kāi)中斷并恢復(fù)狀態(tài)local_irq_restore()結(jié)合就完成了整套
2、自旋鎖機(jī)制。唉吆,我的天啊,不是我說(shuō)你們開(kāi)源社區(qū)的那些家伙們,說(shuō)個(gè)東西為啥要那么費(fèi)勁,就為了說(shuō)完上面那些紅色的破話,差點(diǎn)沒(méi)喘過(guò)來(lái),本來(lái)在上篇就想說(shuō)你們的…好人做到低,送你送到西,嘿嘿..我把上邊的關(guān)系再幫大家捋捋,免的看著費(fèi)勁…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_unlo
3、ck()+local_irq_restore()spin_lock_bh()=spin_lock()+local_bh_disable()spin_unlock_bh()=spin_unlock()+local_bh_enable()又是一口氣,這是什么年頭,掙點(diǎn)點(diǎn)擊率,怎么就這么難呢..不過(guò)也是沒(méi)辦法的事,上了Linux這條賊船,就要有犧牲我一個(gè),幸福全中國(guó)的決心,不然微軟的又要囂張了,今天黑你一次屏,明天斷你一次網(wǎng),就連去網(wǎng)吧,微軟還伸手到你面前說(shuō):對(duì)不起,你的系統(tǒng)是盜版…好了,讓他們熱鬧去吧,說(shuō)說(shuō)咱們的事。作為L(zhǎng)inux驅(qū)動(dòng)程序工程師,你要在心里刻下幾條戒律:1)什么叫自旋
4、鎖,就是忙等待,當(dāng)鎖不可用時(shí),CPU除了在那兒拼命的執(zhí)行"測(cè)試并設(shè)置"的傻瓜操作外什么都不做,才不管電影中含情脈脈的你是她的誰(shuí),她是你的誰(shuí)的這些事,任你兩情相約,也是執(zhí)手相看淚眼,竟無(wú)語(yǔ)凝咽??梢?jiàn),這是多么的影響系統(tǒng)的性能。2)what?你不懂愛(ài)情,不在乎第一條,我暈…那就給你來(lái)個(gè)狠的:處理不好自旋鎖可能導(dǎo)致系統(tǒng)死鎖(deadlock),系統(tǒng)癱瘓。呵呵怕不,等你哭著鬧著要上網(wǎng)而不能時(shí),就怕了。那為啥會(huì)這樣了,很簡(jiǎn)單,想想:如果我們不小心在一個(gè)遞歸中使用一個(gè)自旋鎖,說(shuō)白了就是一個(gè)CPU,它已經(jīng)獲得了這個(gè)自旋鎖,可還貪心地想第二次獲得這個(gè)自旋鎖,這時(shí)就死鎖了唄。另外,如果一個(gè)進(jìn)程獲得
5、自旋鎖之后再阻塞,也是很有可能導(dǎo)致死鎖的發(fā)生。理論完了,給你來(lái)點(diǎn)代碼,就當(dāng)是程序員點(diǎn)的一點(diǎn)交代吧:intdevice_count=0;定義文件打開(kāi)的次數(shù)計(jì)數(shù)staticintdevice_open(structinode*inode,structfile*filp){...spinlock(&device_count);if(device_count)//已經(jīng)打開(kāi){spin_unlock(&device_count);return-EBUSY;}device_count++;//增加使用計(jì)數(shù)spin_unlock(&device_count);...return0;}static
6、intdevice_release(structinode*inode,structfile*filp){...spinlock(&device_count);device_count--;//減少使用計(jì)數(shù)spin_unlock(&device_count);return0;}出招表四:讀寫(xiě)自旋鎖(防寫(xiě)不防讀)"找你所說(shuō),上面的那招自旋鎖看似相當(dāng)好啊..""那是,也不看看是誰(shuí)教的..""那我就不明白了,接著你說(shuō)的例子:你說(shuō)我買票是吧,售票員看到一張票(讀)也沒(méi)錯(cuò)啊,錯(cuò)在與她把票賣出去的操作上(寫(xiě)),你這可好,這樣一來(lái),一旦一個(gè)鎖住,別人都別想看了,這也太傻瓜了吧.."小王不屑的鄙
7、視我。"耶呵,看不出來(lái)哈,你都知道用腦袋想問(wèn)題了,以前不是都是要大腳趾計(jì)算的嗎..什么時(shí)候升級(jí)換代的.."我吃驚的瞪著眼,"那好,不拿出點(diǎn)真貨你搞不定你了..請(qǐng)看新招之讀寫(xiě)自旋鎖"讀寫(xiě)自旋鎖:它保留了自鎖的概念,但是它規(guī)定在讀方面同時(shí)可以有多個(gè)讀單元,在寫(xiě)方面,只能最多有一個(gè)寫(xiě)進(jìn)程。當(dāng)然,讀和寫(xiě)也不能同時(shí)進(jìn)行。使用方法:1)初始化讀寫(xiě)鎖的方法。rwlock_tx;//動(dòng)態(tài)初始化rwlock_tx=RW_LOCK_UNLOCKED;//動(dòng)態(tài)初始化rwlock_init(&x);2)