• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 297,  comments - 15,  trackbacks - 0

            一 semaphore機制

            古老的信號量機制,80年代初,從System V體系中產生,稱為System v信號量。90年代,Posix標準確立,其中的信號量稱為posix信號量。當前l(fā)inux系統(tǒng)支持這兩種信號量(man semget/ man sem_post)。System v信號量為有名信號量,可以用于多進程間的互斥同步。posix信號量分有名和無名兩種,當前l(fā)inux只支持無名信號量,可以用于多線程之間的互斥同步,通過共享內存也可以用于多進程之間。
            信號量屬于內核級別的互斥同步機制,相關調用總是陷入內核態(tài),屬于功能強大/重量級的實現。

               二 spinlock機制
            多核SMP的cpu流行后,出現的新的互斥同步機制。spinlock實現原理為用戶態(tài)循環(huán)嘗試機制,不陷入內核態(tài)進行線程切換。spinlock的原子性通過CAS(CompareAndSwap)原語實現。使用spinlock時,應該保證保護區(qū)間內代碼執(zhí)行迅速,不應該存在io等耗時操作。
            多核系統(tǒng)下,針對可快速執(zhí)行的保護區(qū)使用用戶態(tài)循環(huán)嘗試機制,可以保證執(zhí)行線程不需要引起上下文切換即可快速執(zhí)行通過,這種機制也被形象的稱為lock-free機制。我們可以這樣理解:lock-free機制即為循環(huán)嘗試,spinlock是它的具體實現。

            spinlock的實現有多種,常見的有pthread_spin_lock,該spinlock無限制循環(huán)嘗試,在多核環(huán)境下并且保護區(qū)代碼執(zhí)行迅速時,執(zhí)行線程很快可以拿到鎖,但當單核環(huán)境或者保護區(qū)代碼執(zhí)行慢速時,則會耗盡該線程擁有的時間片之后交出cpu,造成cpu的浪費。另一常見的spinlock是boost智能指針中的實現,進行3次無間斷的循環(huán)CAS原語判斷,之后若再次失敗,則調用sleep族函數,交出cpu執(zhí)行權,待再次分配到cpu時間片后繼續(xù)進行CAS原語判斷操作。


               三 mutex機制
            mutex屬于os之上的再次封裝實現。在linux2.6內核上,線程庫為nptl,其中的mutex基于futex機制實現,它的實現原理,簡單說就是spinlock+semaphore,首先使用spinlock嘗試,可以拿到鎖則直接向下執(zhí)行,拿不到鎖則執(zhí)行semaphore機制,陷入內核態(tài),進入線程切換。
            在多核環(huán)境下,當mutex保護的代碼段內無io操作,執(zhí)行很快時,大多數情況下通過spinlock都可拿到鎖,不需要陷入內核態(tài)。


              四 為智能指針正名(boost)
            智能指針的引用計數僅僅為一個整型變量的增減,屬于執(zhí)行迅速的典型,使用spinlock機制保護,最新boost版本中僅僅是spinlock,而非mutex。從性能角度說,使用智能指針的現象是cpu略微上升(循環(huán)嘗試導致),而并發(fā)量/單個請求的響應時間并無明顯影響。proactor機制實現的網絡層,智能指針基本無法繞過,刻意避免帶來的只能是丑陋的代碼和維護量的上升。但線程之間盡量避免傳遞指針(智能指針),通過傳遞id等代替。
            智能指針有它使用的場景,不能濫用,也不能刻意避免。

            from:

            http://m.shnenglu.com/CppExplore/archive/2010/08/28/125067.html

            posted on 2010-08-30 12:10 chatler 閱讀(389) 評論(0)  編輯 收藏 引用 所屬分類: Linux_Coding
            <2010年1月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺這個博客還是不錯,雖然做的東西和我不大相關,覺得看看還是有好處的

            network

            OSS

            • Google Android
            • Android is a software stack for mobile devices that includes an operating system, middleware and key applications. This early look at the Android SDK provides the tools and APIs necessary to begin developing applications on the Android platform using the Java programming language.
            • os161 file list

            overall

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            精品综合久久久久久97超人| 久久国产高潮流白浆免费观看| 久久天天躁狠狠躁夜夜2020老熟妇| 免费精品久久久久久中文字幕 | 日产久久强奸免费的看| 一本色道久久综合亚洲精品| 青青草国产精品久久久久| 久久久黄色大片| 国产成人AV综合久久| 无码国产69精品久久久久网站| 久久精品无码一区二区三区日韩| 一本一本久久a久久综合精品蜜桃| 久久精品国产一区二区三区不卡| 国产精品免费看久久久| 99久久国产综合精品五月天喷水| 久久精品中文字幕大胸| 久久久久无码精品国产app| 欧美精品一区二区精品久久| 亚洲午夜久久久久久噜噜噜| 久久亚洲天堂| 久久99精品久久久久久噜噜 | 精品国产日韩久久亚洲| 国内精品久久久久久久coent| 久久精品国产免费一区| 久久99国产精品久久久 | 国产福利电影一区二区三区久久老子无码午夜伦不 | 精品国产青草久久久久福利| 久久青青草原综合伊人| 久久精品中文字幕久久| 国产精品久久久久无码av| 97精品久久天干天天天按摩| 久久久亚洲欧洲日产国码aⅴ| 亚洲AV无一区二区三区久久 | 99久久夜色精品国产网站| 久久婷婷五月综合成人D啪 | 久久婷婷五月综合成人D啪| 精品久久久久久久久久久久久久久| 99久久精品国产毛片| 三级片免费观看久久| 99精品国产综合久久久久五月天| 久久亚洲中文字幕精品一区|