透過Linux內(nèi)核看無鎖編程
*/
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內(nèi)核,通過代碼的注釋(斜體部分)可以看出,當只有一個消費者和一個生產(chǎn)者時,可以不用添加任何額外的鎖,就能達到對共享數(shù)據(jù)的訪問。
總結(jié)
通過對比2。4和2。6內(nèi)核代碼,不得不佩服內(nèi)核開發(fā)者的智慧,為了提高內(nèi)核性能,一直不斷的進行各種優(yōu)化,并將業(yè)界最新的lock-free理念運用到內(nèi)核中。
在實際開發(fā)過程中,進行無鎖設(shè)計時,首先進行場景分析,因為每種無鎖方案都有特定的應(yīng)用場景,接著根據(jù)場景分析進行數(shù)據(jù)結(jié)構(gòu)的初步設(shè)計,然后根據(jù)先前的分析結(jié)果進行并發(fā)模型建模,最后在調(diào)整數(shù)據(jù)結(jié)構(gòu)的設(shè)計,以便達到最優(yōu)。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)linux相關(guān)文章:linux教程
評論