免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1919 | 回复: 6

[CPU及多核] kfifo的问题 [复制链接]

论坛徽章:
0
发表于 2015-04-24 22:33 |显示全部楼层
unsigned int __kfifo_put(struct kfifo *fifo,
120                          unsigned char *buffer, unsigned int len)
121 {
122         unsigned int l;
123
124         len = min(len, fifo->size - fifo->in + fifo->out);

131         smp_mb();
134         l = min(len, fifo->size - (fifo->in & (fifo->size - 1)));
135         memcpy(fifo->buffer + (fifo->in & (fifo->size - 1)), buffer, l);
136
137         /* then put the rest (if any) at the beginning of the buffer */
138         memcpy(fifo->buffer, buffer + l, len - l);
139
145         smp_wmb();
146
147         fifo->in += len;
148
149         return len;
150 }

165 unsigned int __kfifo_get(struct kfifo *fifo,
166                          unsigned char *buffer, unsigned int len)
167 {
168         unsigned int l;
169
170         len = min(len, fifo->in - fifo->out);

177         smp_rmb();
178
180         l = min(len, fifo->size - (fifo->out & (fifo->size - 1)));
181         memcpy(buffer, fifo->buffer + (fifo->out & (fifo->size - 1)), l);
184         memcpy(buffer + l, fifo->buffer, len - l);
191         smp_mb();
192
193         fifo->out += len;

195         return len;
196 }

对kfifo有一个疑问想请教一下:
如果存在两个线程A和B运行在不同的CPU上,A调用__kfifo_put,B调用__kfifo_get,在A调用完成后fifo->in 的值还存在A对应CPU的缓冲上,B调用的时候获得的fifo->in 的值还是没有更新的值,会不会出现这样的情况,如果出现会不会影响效率

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2015-04-27 12:46 |显示全部楼层
对共享变量的修改,差不多都会有这种(效率)问题吧。

论坛徽章:
0
发表于 2015-04-27 21:06 |显示全部楼层
回复 2# nswcfd
如果换成原子操作呢?

   

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2015-04-28 09:46 |显示全部楼层
应该是一样的吧(不过通常情况下应该不是主要瓶颈所在吧?)。

并且由于不存在并发修改的情况(外层有spin_lock),没有必要引入原子操作(有额外的LOCK总线的开销)。

论坛徽章:
0
发表于 2015-04-28 21:02 |显示全部楼层
回复 4# nswcfd
fifo对一个读一个写的情况是无锁的吧

   

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
发表于 2015-04-28 21:28 |显示全部楼层
嗯,是的。

关于lock free的ring/fifo的设计,可以参考 A Lock-Free Cache-Efficient Multi-Core Synchronization Mechanism for Line-Rate Network Traffic Monitoring

论坛徽章:
0
发表于 2015-04-29 20:51 |显示全部楼层
回复 6# nswcfd
谢谢了


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP