中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

商城小程序報(bào)價(jià)廊坊關(guān)鍵詞優(yōu)化報(bào)價(jià)

商城小程序報(bào)價(jià),廊坊關(guān)鍵詞優(yōu)化報(bào)價(jià),旅游網(wǎng)頁(yè)設(shè)計(jì)論文5000字,關(guān)于wordpress自動(dòng)更新原文網(wǎng)址:https://lwn.net/Articles/93617 原文作者:Corbet 原文時(shí)間:2004年7月14日 內(nèi)核提供了一種用于實(shí)現(xiàn)引用計(jì)數(shù)的簡(jiǎn)單機(jī)制kref;該機(jī)制是今年3月份完成的。kref機(jī)制的核心思想是,提供支持原子操作的計(jì)數(shù)器&…

原文網(wǎng)址:https://lwn.net/Articles/93617

原文作者:Corbet

原文時(shí)間:2004年7月14日

內(nèi)核提供了一種用于實(shí)現(xiàn)引用計(jì)數(shù)的簡(jiǎn)單機(jī)制kref;該機(jī)制是今年3月份完成的。kref機(jī)制的核心思想是,提供支持原子操作的計(jì)數(shù)器,用于對(duì)未決引用【outstanding references】進(jìn)行計(jì)數(shù)。如果計(jì)數(shù)器數(shù)值為零,內(nèi)核不再需要引用對(duì)象了,引用對(duì)象可以被釋放掉。

kref機(jī)制的函數(shù)很簡(jiǎn)單,在引用對(duì)象數(shù)據(jù)結(jié)構(gòu)內(nèi)直接包含一個(gè)struct kref計(jì)數(shù)器或struct kref *計(jì)數(shù)器指針,在引用對(duì)象被操作之前調(diào)用kref_get函數(shù),引用計(jì)數(shù)器遞增。

struct kref *kref_get(struct kref *kref)
{WARN_ON(!atomic_read(&kref->refcount));atomic_inc(&kref->refcount);return kref;
}

在對(duì)對(duì)象操作完成之后調(diào)用kref_put函數(shù),引用計(jì)數(shù)器遞減,如果計(jì)數(shù)器數(shù)值為零,就調(diào)用回調(diào)函數(shù)釋放引用對(duì)象相關(guān)資源。

void kref_put(struct kref *kref)
{if (atomic_dec_and_test(&kref->refcount)) {kref->release(kref);   //release函數(shù)是回調(diào)函數(shù)}
}

對(duì)引用計(jì)數(shù)refcount域進(jìn)行原子操作,使得上述兩個(gè)函數(shù)可以安全地在多CPU或搶斷環(huán)境下直接調(diào)用,也就是說(shuō)在這兩個(gè)環(huán)境下,引用計(jì)數(shù)器的數(shù)值總能獲得正確的結(jié)果。但是,如果兩個(gè)內(nèi)核線程在使用kref機(jī)制時(shí),存在下面情況,kref機(jī)制也會(huì)出錯(cuò)。

內(nèi)核線程1內(nèi)核線程2
/* In kref_get() */
WARN_ON(!atomic_read(&kref->refcount));
kref_put(&kref);
atomic_inc(&kref->refcount);
return kref;

在上面的例子中,內(nèi)核線程1在調(diào)用atomic_inc之前的那一刻,被引用對(duì)象的相關(guān)資源很可能被釋放掉了。kref代碼強(qiáng)制要求:對(duì)同一個(gè)引用對(duì)象不允許kref_get和kref_put并行運(yùn)行。也就是說(shuō),這種強(qiáng)制性要求上述兩個(gè)函數(shù)都需要用鎖來(lái)避免對(duì)同一個(gè)引用對(duì)象的并行訪問(wèn)。

但是關(guān)注高可擴(kuò)展性的程序員經(jīng)常會(huì)使用免鎖算法。因?yàn)樵诰€程數(shù)量比較大的時(shí)候,鎖往往會(huì)成為性能瓶頸,因此盡可能不用鎖,內(nèi)核的可擴(kuò)展性會(huì)更好。這也是內(nèi)核提供seqlock和RCU這兩種技術(shù)的原因。kref機(jī)制對(duì)鎖機(jī)制的需求,使得seqlock和RCU很難派上用途。

Ravikiran G Thirumalai最近提交了一份題為“Refcounting of objects part of a lockfree collection”的補(bǔ)丁,實(shí)現(xiàn)了一個(gè)新的鎖機(jī)制refcount_t,用于對(duì)象的免鎖管理。并用大量篇幅介紹了和RCU一起工作時(shí)引用計(jì)數(shù)過(guò)程,所有補(bǔ)丁構(gòu)建了一種類似kref的數(shù)據(jù)類型,這種數(shù)據(jù)類型不需要用鎖就能避免前面提到的競(jìng)爭(zhēng)問(wèn)題。

伴隨并行寫的過(guò)程【as currently written】,kref_get首先檢查引用計(jì)數(shù)數(shù)值;如果計(jì)數(shù)數(shù)值為零,表示對(duì)象已經(jīng)被釋放了。當(dāng)前的實(shí)現(xiàn)是,檢查到數(shù)值為零時(shí),僅僅是抱怨一下【我理解為信息輸出,而不做更多的處理】;有人可能要說(shuō)了,這種情況下應(yīng)該做進(jìn)一步的處理才好。然而,真正的問(wèn)題是,對(duì)引用計(jì)數(shù)的測(cè)試和遞增如果不能在一個(gè)原子操作中實(shí)現(xiàn),那么在這兩個(gè)操作之間就有可能插入其他操作。Ravikiran的補(bǔ)丁通過(guò)提供另一個(gè)XXXX_get函數(shù)來(lái)解決這個(gè)問(wèn)題:

 static inline int refcount_get_rcu(refcount_t *rc){int c, old;c = atomic_read(&rc->count);while ( c && (old = cmpxchg(&rc->count.counter, c, c+1)) != c) c = old;return c;}

上面函數(shù)的核心是cmpxchg函數(shù),這是一個(gè)內(nèi)聯(lián)匯編函數(shù),可以直接使用CPU的cmpxchg指令。這個(gè)函數(shù)的原型是:

int cmpxchg(int *location, int old, int new);

cmpxchg函數(shù)實(shí)現(xiàn)了以下基本功能:

1)用原子操作實(shí)現(xiàn):比較location內(nèi)存單元數(shù)值和old變量數(shù)值;如果兩者數(shù)值相等,將location內(nèi)存單元設(shè)置為new變量數(shù)值。

2)如果上述原子操作成功,即判斷兩者數(shù)值相等后location內(nèi)存單元被修改,cmpxchg函數(shù)返回old變量數(shù)值;如果上述原子操作不成功,cmpxchg返回location內(nèi)存單元的數(shù)值。

cmpxchg指令是CPU提供的測(cè)試-設(shè)置原子指令。用cmpxchg實(shí)現(xiàn)的XXXX_get函數(shù)在不用鎖的情況下就可以實(shí)現(xiàn)引用計(jì)數(shù)器的獲取。

這里還是有點(diǎn)小問(wèn)題。考慮一種情況:內(nèi)核線程2對(duì)引用計(jì)數(shù)對(duì)象釋放后又重新使用該對(duì)象,然后內(nèi)核線程1才試圖去獲取引用計(jì)數(shù)。在這種情況下,內(nèi)核線程1可能看到的是一個(gè)隨機(jī)的引用計(jì)數(shù),就誤以為成功獲取了引用計(jì)數(shù)。引入RCU機(jī)制,可以避免這種情況發(fā)生。引用對(duì)象的釋放是通過(guò)RCU回調(diào)函數(shù)來(lái)實(shí)現(xiàn);這樣一來(lái),引用對(duì)象就不會(huì)被真正釋放直到每一個(gè)處理器都發(fā)生了調(diào)度。只要內(nèi)核線程能通過(guò)指針找到引用對(duì)象,那么這個(gè)對(duì)象就一直存在,即使對(duì)象的引用計(jì)數(shù)數(shù)值為零。經(jīng)過(guò)一個(gè)完整靜默期,沒(méi)有內(nèi)核線程去訪問(wèn)這樣的指針了,引用對(duì)象才會(huì)被安全地刪除。

另一個(gè)潛在的問(wèn)題是,并不是所有的體系結(jié)構(gòu)都提供cmpxchg原子指令。針對(duì)這樣的系統(tǒng),Ravikiran用到了一個(gè)從未見(jiàn)過(guò)但相當(dāng)巧妙的方案,用到了自旋鎖的哈希數(shù)組;如果你們好奇就自己去看補(bǔ)丁好了。

這些努力都是值得的;這個(gè)技術(shù)已經(jīng)用于文件描述符查找了,tiobench測(cè)試性能提高了13% ~ 21%。內(nèi)核系統(tǒng)里還有類似kref API一樣的對(duì)象,也有創(chuàng)建新的引用計(jì)數(shù)API。因此,補(bǔ)丁還可能會(huì)重寫。

http://www.risenshineclean.com/news/40225.html

相關(guān)文章:

  • 安卓做網(wǎng)站教程個(gè)人網(wǎng)頁(yè)制作成品
  • 怎么做日本釣魚網(wǎng)站嗎關(guān)鍵詞優(yōu)化和seo
  • 專業(yè) 網(wǎng)站設(shè)計(jì)公司php開(kāi)源建站系統(tǒng)
  • 網(wǎng)站優(yōu)化北京如何聯(lián)系?競(jìng)價(jià)推廣招聘
  • 深圳企業(yè)網(wǎng)站建設(shè)收費(fèi)標(biāo)準(zhǔn)seo關(guān)鍵字優(yōu)化軟件
  • 微信公號(hào)嵌入網(wǎng)站開(kāi)發(fā)企業(yè)查詢系統(tǒng)官網(wǎng)
  • 成都flash互動(dòng)網(wǎng)站開(kāi)發(fā)網(wǎng)站營(yíng)銷
  • 提供網(wǎng)站建設(shè)價(jià)格產(chǎn)品seo怎么優(yōu)化
  • 徐州網(wǎng)站公司站長(zhǎng)之家怎么用
  • 一個(gè)公司做100個(gè)網(wǎng)站百度一鍵安裝
  • 網(wǎng)站加視頻播放設(shè)計(jì)怎么做的網(wǎng)站建設(shè)維護(hù)
  • 嵌入式應(yīng)用軟件開(kāi)發(fā)做網(wǎng)站排名優(yōu)化的公司
  • 藝陽(yáng)科技網(wǎng)站建設(shè)seo系統(tǒng)
  • php團(tuán)購(gòu)網(wǎng)站的難點(diǎn)開(kāi)發(fā)制作app軟件
  • 哪個(gè)網(wǎng)站能學(xué)做微商網(wǎng)站生成器
  • 如何查看網(wǎng)站 是哪家做的蘇州網(wǎng)站制作開(kāi)發(fā)公司
  • 網(wǎng)站優(yōu)化方案 site ww企業(yè)seo優(yōu)化服務(wù)
  • 個(gè)人soho要怎么做企業(yè)網(wǎng)站網(wǎng)站優(yōu)化招聘
  • 阿里云網(wǎng)站建設(shè)的實(shí)訓(xùn)報(bào)告北京外包seo公司
  • 自己做代練網(wǎng)站steam交易鏈接怎么改
  • 臺(tái)州網(wǎng)站排名公司推廣營(yíng)銷app
  • 美團(tuán)網(wǎng)站界面設(shè)計(jì)超級(jí)外鏈吧外鏈代發(fā)
  • 網(wǎng)站開(kāi)發(fā)排期表模板重慶seo小z博客
  • wordpress獲取登錄用戶的名字seo搜索引擎優(yōu)化視頻
  • 江華網(wǎng)站建設(shè)域名大全
  • 天津網(wǎng)站在哪里建設(shè)seo診斷
  • wordpress 回收站在哪電銷系統(tǒng)軟件排名
  • 做cpa用什么類型的網(wǎng)站好百度 營(yíng)銷推廣是做什么的
  • 人與狗做的電影網(wǎng)站百度網(wǎng)盤怎么用
  • 許昌專業(yè)做網(wǎng)站公司百度站長(zhǎng)工具怎么查排名