透过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理念运用到内核中。

在实际开发过程中,进行无锁设计时,首先进行场景分析,因为每种无锁方案都有特定的应用场景,接着根据场景分析进行数据结构的初步设计,然后根据先前的分析结果进行并发模型建模,最后在调整数据结构的设计,以便达到最优。

1 2 3 4

关键词: 编程 内核 Linux 透过

加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW

或用微信扫描左侧二维码

相关文章

查看电脑版