本篇內(nèi)容介紹了“l(fā)inux seqlock和rwlock有什么作用”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
創(chuàng)新互聯(lián)長期為上千家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為萊西企業(yè)提供專業(yè)的網(wǎng)站設(shè)計制作、網(wǎng)站設(shè)計,萊西網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
在讀寫頻率不對等的情況下,使用普通的互斥鎖顯然并不是一個好主意。
由于讀取內(nèi)存中的數(shù)據(jù)并不會產(chǎn)生副作用(嵌入式除外),因此在數(shù)據(jù)不改變的情況下,多個讀操作可以并發(fā)執(zhí)行。
在讀頻率遠大于寫頻率時,如果僅僅將寫操作與讀操作互斥,讀與讀之間并發(fā)執(zhí)行,顯然可以大幅提高程序的性能。
所以在這個時候,讀寫鎖應(yīng)運而生。使用讀寫鎖時,多個讀操作可以并發(fā)進行,但是只要有讀操作在進行,寫操作就必須等待。
其實現(xiàn)原理并不復(fù)雜。
獲取讀鎖前檢查是否寫鎖已經(jīng)被獲取,如果獲取則等待。如果寫鎖沒有被獲取,則對讀者數(shù)加一。釋放讀鎖時對讀者數(shù)減一即可。
獲取寫鎖時,直到讀者數(shù)為0才可以將寫鎖置為獲取狀態(tài)。
以前也寫過一個類似的rwlock, 并在此基礎(chǔ)上增加了寫與寫互斥和寫操作防餓死機制(為了支持多線程并發(fā)寫)。
從讀寫鎖的實現(xiàn)上來看,讀寫鎖對讀比較優(yōu)待,只要有讀操作就寫操作就必須等待。
如果某塊內(nèi)存僅有一個線程很頻繁的寫,其他線程只是偶爾讀一下,并且要對寫非常優(yōu)待,即有線程的寫操作不能被打斷。
這時候seqlock就派上用場了。
seqlock的實現(xiàn)更為簡單。
每一個seqlock維護一個index索引值,每次向seqlock獲取寫鎖時總能成功,并把seqlock的index自增。
每次讀操作前后都獲取一下seqlock的index索引值,如果前后獲取的index值并不相同,則重新讀取數(shù)據(jù)。
從上面機制可以看出,與rwlock相似都是對某一頻繁操作進行優(yōu)待,但與rwlock不同的是,seqlock是對寫操作優(yōu)待。
“l(fā)inux seqlock和rwlock有什么作用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!