• <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
            內(nèi)核同步措施

                為了避免并發(fā),防止競(jìng)爭(zhēng)。內(nèi)核提供了一組同步方法來(lái)提供對(duì)共享數(shù)據(jù)的保護(hù)。 我們的重點(diǎn)不是介紹這些方法的詳細(xì)用法,而是強(qiáng)調(diào)為什么使用這些方法和它們之間的差別。
                Linux 使用的同步機(jī)制可以說(shuō)從2.0到2.6以來(lái)不斷發(fā)展完善。從最初的原子操作,到后來(lái)的信號(hào)量,從大內(nèi)核鎖到今天的自旋鎖。這些同步機(jī)制的發(fā)展伴隨 Linux從單處理器到對(duì)稱多處理器的過(guò)度;伴隨著從非搶占內(nèi)核到搶占內(nèi)核的過(guò)度。鎖機(jī)制越來(lái)越有效,也越來(lái)越復(fù)雜。
                目前來(lái)說(shuō)內(nèi)核中原子操作多用來(lái)做計(jì)數(shù)使用,其它情況最常用的是兩種鎖以及它們的變種:一個(gè)是自旋鎖,另一個(gè)是信號(hào)量。我們下面就來(lái)著重介紹一下這兩種鎖機(jī) 制。


            自旋鎖
            ------------------------------------------------------
                自旋鎖是專為防止多處理器并發(fā)而引入的一種鎖,它在內(nèi)核中大量應(yīng)用于中斷處理等部分(對(duì)于單處理器來(lái)說(shuō),防止中斷處理中的并發(fā)可簡(jiǎn)單采用關(guān)閉中斷的方式, 不需要自旋鎖)。
                自旋鎖最多只能被一個(gè)內(nèi)核任務(wù)持有,如果一個(gè)內(nèi)核任務(wù)試圖請(qǐng)求一個(gè)已被爭(zhēng)用(已經(jīng)被持有)的自旋鎖,那么這個(gè)任務(wù)就會(huì)一直進(jìn)行忙循環(huán)——旋轉(zhuǎn)——等待鎖重 新可用。
            要是鎖未被爭(zhēng)用,請(qǐng)求它的內(nèi)核任務(wù)便能立刻得到它并且繼續(xù)進(jìn)行。自旋鎖可以在任何時(shí)刻防止多于一個(gè)的內(nèi)核任務(wù)同 時(shí)進(jìn)入臨界區(qū),因此這種鎖可有效地避免多處理器上并發(fā)運(yùn)行的內(nèi)核任務(wù)競(jìng)爭(zhēng)共享資源。
                事實(shí)上,自旋鎖的初衷就是:在短期間內(nèi)進(jìn)行輕量級(jí)的鎖定。一個(gè)被爭(zhēng)用的自旋鎖使得請(qǐng)求它的線程在等待鎖重新可用的期間進(jìn)行自旋(特別浪費(fèi)處理器時(shí)間),所 以自旋鎖不應(yīng)該被持有時(shí)間過(guò)長(zhǎng)。如果需要長(zhǎng)時(shí)間鎖定的話, 最好使用信號(hào)量。
            自旋鎖的基本形式如下:
                spin_lock(&mr_lock);
                //臨界區(qū)
                spin_unlock(&mr_lock);

                因?yàn)樽孕i在同一時(shí)刻只能被最多一個(gè)內(nèi)核任務(wù)持有,所以一個(gè)時(shí)刻只有一個(gè)線程允許存在于臨界區(qū)中。這點(diǎn)很好地滿足了對(duì)稱多處理機(jī)器需要的鎖定服務(wù)。在單處 理器上,自旋鎖僅僅當(dāng)作一個(gè)設(shè)置內(nèi)核搶占的開(kāi)關(guān)。如果內(nèi)核搶占也不存在,那么自旋鎖會(huì)在編譯時(shí)被完全剔除出內(nèi)核。
                簡(jiǎn)單的說(shuō),自旋鎖在內(nèi)核中主要用來(lái)防止多處理器中并發(fā)訪問(wèn)臨界區(qū),防止 內(nèi)核搶占造成的競(jìng)爭(zhēng)。另外自旋鎖不允許任務(wù)睡眠(持有自旋鎖的任務(wù)睡眠會(huì)造成自死鎖——因?yàn)樗哂锌赡茉斐沙钟墟i的內(nèi)核 任務(wù)被重新調(diào)度,而再次申請(qǐng)自己已持有的鎖),它能夠在中斷上下文中使用。
                死鎖:假設(shè)有一個(gè)或多個(gè)內(nèi)核任務(wù)和一個(gè)或多個(gè)資源,每個(gè)內(nèi)核都在等待其中的一個(gè)資源,但所有的資源都已經(jīng)被占用了。這便會(huì)發(fā)生所有內(nèi)核任務(wù)都在相互等待, 但它們永遠(yuǎn)不會(huì)釋放已經(jīng)占有的資源,于是任何內(nèi)核任務(wù)都無(wú)法獲得所需要的資源,無(wú)法繼續(xù)運(yùn)行,這便意味著死鎖發(fā)生了。自死瑣是說(shuō)自己占有了某個(gè)資源,然后 自己又申請(qǐng)自己已占有的資源,顯然不可能再獲得該資源,因此就自縛手腳了。


            信號(hào)量
            ------------------------------------------------------
                Linux中的信號(hào)量是一種睡眠鎖。如果有一個(gè)任務(wù)試圖獲得一個(gè)已被持有的信號(hào)量時(shí),信號(hào)量會(huì)將其推入等待隊(duì)列,然后讓其睡眠。這時(shí)處理器獲得自由去執(zhí)行 其它代碼。當(dāng)持有信號(hào)量的進(jìn)程將信號(hào)量釋放后,在等待隊(duì)列中的一個(gè)任務(wù)將被喚醒,從而便可以獲得這個(gè)信號(hào)量。
                信號(hào)量的睡眠特性,使得信號(hào)量適用于鎖會(huì)被長(zhǎng)時(shí)間持有的情況;只能在進(jìn)程上下文中使用,因?yàn)橹袛嗌舷挛闹惺遣荒鼙徽{(diào)度的;另外當(dāng)代碼持有信號(hào)量時(shí),不可以 再持有自旋鎖。

            信號(hào)量基本使用形式為:
            static DECLARE_MUTEX(mr_sem);//聲明互斥信號(hào)量
            if(down_interruptible(&mr_sem))
                //可被中斷的睡眠,當(dāng)信號(hào)來(lái)到,睡眠的任務(wù)被喚醒
                //臨界區(qū)
            up(&mr_sem);


            信號(hào)量和自旋鎖區(qū)別
            ------------------------------------------------------
                雖然聽(tīng)起來(lái)兩者之間的使用條件復(fù)雜,其實(shí)在實(shí)際使用中信號(hào)量和自旋鎖并不易混淆。注意以下原則:
                如果代碼需要睡眠——這往往是發(fā)生在和用戶空間同步時(shí)——使用信號(hào)量是唯一的選擇。由于不受睡眠的限制,使用信號(hào)量通常來(lái)說(shuō)更加簡(jiǎn)單一些。如果需要在自旋 鎖和信號(hào)量中作選擇,應(yīng)該取決于鎖被持有的時(shí)間長(zhǎng)短。理想情況是所有的鎖都應(yīng)該盡可能短的被持有,但是如果鎖的持有時(shí)間較長(zhǎng)的話,使用信號(hào)量是更好的選 擇。另外,信號(hào)量不同于自旋鎖,它不會(huì)關(guān)閉內(nèi)核搶占,所以持有信號(hào)量的代碼可以被搶占。這意味者信號(hào)量不會(huì)對(duì)影響調(diào)度反應(yīng)時(shí)間帶來(lái)負(fù)面影響。


            自旋鎖對(duì)信號(hào)量
            ------------------------------------------------------
            需求                     建議的加鎖方法

            低開(kāi)銷加鎖               優(yōu)先使用自旋鎖
            短期鎖定                 優(yōu)先使用自旋鎖
            長(zhǎng)期加鎖                 優(yōu)先使用信號(hào)量
            中斷上下文中加鎖          使用自旋鎖
            持有鎖是需要睡眠、調(diào)度     使用信號(hào)量

            from:
            http://blog.chinaunix.net/u1/38576/showart_367985.html

            posted on 2010-04-01 11:50 chatler 閱讀(476) 評(píng)論(0)  編輯 收藏 引用 所屬分類: OS
            <2009年5月>
            262728293012
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

            • cloudward
            • 感覺(jué)這個(gè)博客還是不錯(cuò),雖然做的東西和我不大相關(guān),覺(jué)得看看還是有好處的

            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

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久人人爽人人爽人人片AV麻豆| 久久成人国产精品一区二区| 欧美一级久久久久久久大片| 色偷偷888欧美精品久久久| 国内精品伊人久久久久AV影院| 久久亚洲AV无码精品色午夜麻豆| 日本久久久久久久久久| 亚洲综合精品香蕉久久网97 | 国产精品久久久久久久午夜片 | 欧美久久久久久精选9999| 久久精品一区二区三区不卡| 97热久久免费频精品99| 久久66热人妻偷产精品9| 99久久免费国产精精品| 国产精品岛国久久久久| 亚洲国产精品婷婷久久| 色综合久久天天综合| 国内精品久久久久国产盗摄| 久久青青草原精品国产软件| 欧美日韩中文字幕久久久不卡| 亚洲人成网站999久久久综合 | 一本色道久久综合| 99久久国产综合精品女同图片| 久久久久亚洲AV片无码下载蜜桃| 久久亚洲日韩精品一区二区三区| 精品久久久久久久| 国产精品99久久精品爆乳| 四虎国产精品免费久久| 一本色道久久99一综合| 久久超碰97人人做人人爱| 精品国产91久久久久久久| 久久精品成人欧美大片| 久久人人爽人人爽人人片AV高清| 蜜臀av性久久久久蜜臀aⅴ| 久久99国产亚洲高清观看首页| 久久综合伊人77777| 无码AV波多野结衣久久| 天天久久狠狠色综合| 国内精品久久久久影院老司| 久久精品中文字幕无码绿巨人 | 亚洲国产成人精品无码久久久久久综合 |