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


            自旋鎖
            ------------------------------------------------------
                自旋鎖是專為防止多處理器并發(fā)而引入的一種鎖,它在內(nèi)核中大量應(yīng)用于中斷處理等部分(對(duì)于單處理器來說,防止中斷處理中的并發(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í)間過長(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)核搶占的開關(guān)。如果內(nèi)核搶占也不存在,那么自旋鎖會(huì)在編譯時(shí)被完全剔除出內(nèi)核。
                簡(jiǎn)單的說,自旋鎖在內(nèi)核中主要用來防止多處理器中并發(fā)訪問臨界區(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ù)都無法獲得所需要的資源,無法繼續(xù)運(yùn)行,這便意味著死鎖發(fā)生了。自死瑣是說自己占有了某個(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)來到,睡眠的任務(wù)被喚醒
                //臨界區(qū)
            up(&mr_sem);


            信號(hào)量和自旋鎖區(qū)別
            ------------------------------------------------------
                雖然聽起來兩者之間的使用條件復(fù)雜,其實(shí)在實(shí)際使用中信號(hào)量和自旋鎖并不易混淆。注意以下原則:
                如果代碼需要睡眠——這往往是發(fā)生在和用戶空間同步時(shí)——使用信號(hào)量是唯一的選擇。由于不受睡眠的限制,使用信號(hào)量通常來說更加簡(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í)間帶來負(fù)面影響。


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

            低開銷加鎖               優(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 閱讀(483) 評(píng)論(0)  編輯 收藏 引用 所屬分類: OS
            <2010年5月>
            2526272829301
            2345678
            9101112131415
            16171819202122
            23242526272829
            303112345

            常用鏈接

            留言簿(10)

            隨筆分類(307)

            隨筆檔案(297)

            algorithm

            Books_Free_Online

            C++

            database

            Linux

            Linux shell

            linux socket

            misce

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

            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高清无码| 久久人人爽人人人人爽AV| 国产亚洲色婷婷久久99精品| 99久久精品国内| 久久亚洲高清综合| 久久综合88熟人妻| 久久精品国产福利国产琪琪| 色综合久久久久综合体桃花网| 久久婷婷久久一区二区三区| 久久久久久伊人高潮影院| 午夜不卡888久久| 人妻精品久久久久中文字幕一冢本| 亚洲国产精品人久久| 久久免费的精品国产V∧| 亚洲日本va午夜中文字幕久久| 精品午夜久久福利大片| 久久久久久曰本AV免费免费| 久久九九久精品国产| 久久久91精品国产一区二区三区| 久久精品国产久精国产果冻传媒| 国产综合成人久久大片91| 国产精品18久久久久久vr| 久久久久亚洲AV成人片| 国产69精品久久久久观看软件| 久久久久国产一级毛片高清板| 久久久久久a亚洲欧洲aⅴ| 精品久久8x国产免费观看| 色偷偷88888欧美精品久久久| 中文精品99久久国产| 一本一本久久a久久精品综合麻豆| 国产精品热久久毛片| 91精品观看91久久久久久| 2020久久精品国产免费| 精品久久久噜噜噜久久久| 久久人妻少妇嫩草AV无码专区| 亚洲精品无码成人片久久| 色88久久久久高潮综合影院| 久久香蕉超碰97国产精品| 色偷偷88888欧美精品久久久| 久久久久人妻精品一区二区三区| 久久综合综合久久综合|