• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 透過Linux內核看無鎖編程

    透過Linux內核看無鎖編程

    作者: 時間:2012-05-21 來源:網絡 收藏

    */

    unsignedint__kfifo_put(structkfifo*fifo,

    unsignedchar*buffer,unsignedintlen)

    {

    unsignedintl;

    len=min(len,fifo->size-fifo->in+fifo->out);

    /*firstputthedatastartingfromfifo->intobufferend*/

    l=min(len,fifo->size-(fifo->in(fifo->size-1)));

    memcpy(fifo->buffer+(fifo->in(fifo->size-1)),buffer,l);

    /*thenputtherest(ifany)atthebeginningofthebuffer*/

    memcpy(fifo->buffer,buffer+l,len-l);

    fifo->in+=len;

    returnlen;

    }

    /*

    *__kfifo_get-getssomedatafromtheFIFO,nolockingversion

    *Notethatwithonlyoneconcurrentreaderandoneconcurrent

    *writer,youdon'tneedextralockingtousethesefunctions。

    */

    unsignedint__kfifo_get(structkfifo*fifo,

    unsignedchar*buffer,unsignedintlen)

    {

    unsignedintl;

    len=min(len,fifo->in-fifo->out);

    /*firstgetthedatafromfifo->outuntiltheendofthebuffer*/

    l=min(len,fifo->size-(fifo->out(fifo->size-1)));

    memcpy(buffer,fifo->buffer+(fifo->out(fifo->size-1)),l);

    /*thengettherest(ifany)fromthebeginningofthebuffer*/

    memcpy(buffer+l,fifo->buffer,len-l);

    fifo->out+=len;

    returnlen;

    }

    以上代碼摘自2。6。10,通過代碼的注釋(斜體部分)可以看出,當只有一個消費者和一個生產者時,可以不用添加任何額外的鎖,就能達到對共享數據的訪問。

    總結

    通過對比2。4和2。6代碼,不得不佩服開發者的智慧,為了提高內核性能,一直不斷的進行各種優化,并將業界最新的lock-free理念運用到內核中。

    在實際開發過程中,進行無鎖設計時,首先進行場景分析,因為每種無鎖方案都有特定的應用場景,接著根據場景分析進行數據結構的初步設計,然后根據先前的分析結果進行并發模型建模,最后在調整數據結構的設計,以便達到最優。

    linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

    linux相關文章:linux教程



    上一頁 1 2 3 4 下一頁

    關鍵詞: 編程 內核 Linux 透過

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 梁河县| 岳阳市| 高唐县| 丰都县| 吴旗县| 邢台县| 宜春市| 鄢陵县| 万山特区| 廊坊市| 阳泉市| 鹤山市| 新邵县| 平原县| 保定市| 景泰县| 济源市| 曲松县| 七台河市| 江津市| 维西| 东乌| 称多县| 读书| 青冈县| 阿拉善左旗| 七台河市| 丰都县| 浦北县| 古丈县| 廊坊市| 香港 | 龙川县| 沁水县| 巴东县| 宁化县| 碌曲县| 治多县| 西安市| 庆阳市| 江华|