免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: zylthinking
打印 上一主题 下一主题

[CPU及多核] spin_lock 能否起到内存屏障作用? [复制链接]

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
11 [报告]
发表于 2013-02-01 13:17 |只看该作者
spin_lock和spin_unlock都隐含有屏障,并且都是mb,因为锁本身保证读写。

对于CPU1来说,当获得spin_lock之后,自己队列里面必然会有两个inv请求,此时,spin_lock里面的mb执行时,就会强行inv掉两个请求。

等到执行a b读的时候,都是从新获取的值。这里,在mb的过程中,inv请求在没有完全inv之前,肯定不会执行任何一个a b读请求的。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
12 [报告]
发表于 2013-02-01 13:21 |只看该作者
liuiang 发表于 2013-02-01 13:17
spin_lock和spin_unlock都隐含有屏障,并且都是mb,因为锁本身保证读写。

对于CPU1来说,当获得spin_loc ...


spinlock 若这样说, 我还有点信, 取决于 lock 总线到底是不是还做了 flush 那个什么 queue 的逻辑; 若说 spin_unlock 包含屏障, 你解释解释:
96#define __raw_spin_unlock_string \
  97        "movb $1,%0" \
  98                :"+m" (lock->slock) : : "memory"
  99
100
101static inline void __raw_spin_unlock(raw_spinlock_t *lock)
102{
103        __asm__ __volatile__(
104                __raw_spin_unlock_string
105        );
106}

屏障在哪里?

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
13 [报告]
发表于 2013-02-01 13:33 |只看该作者
看ARM或者mips的spinlock实现,这些体系上屏障的使用很明显,理论和实际严格一致。
x86上,晦涩,繁琐,超级不利于理解体系结构。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
14 [报告]
发表于 2013-02-01 13:39 |只看该作者
塑料袋 发表于 2013-02-01 13:33
看ARM或者mips的spinlock实现,这些体系上屏障的使用很明显,理论和实际严格一致。
x86上,晦涩,繁琐,超 ...


嗯, 看看 arm 确实看到了 spinlock 的第一句话就是 smp_mb,  另问一句, rmb 的语意是不是 flush 那个什么 queue? 还是什么

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
15 [报告]
发表于 2013-02-01 13:45 |只看该作者
本帖最后由 zylthinking 于 2013-02-01 13:46 编辑

终于又明白点为什么锁的写法一般是:

加锁:
操作锁变量
mb();

a = 0;

解锁:
mb();
操作锁变量
的原因了;

这个 mb  的目的是 操作锁变量的语句 和锁内的 a = 0 做同步。

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
16 [报告]
发表于 2013-02-01 13:46 |只看该作者
回复 14# zylthinking


    以我现在的理解,rmb过程中,flush/drain那个inv队列是必须的。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
17 [报告]
发表于 2013-02-01 13:51 |只看该作者
liuiang 发表于 2013-02-01 13:46
回复 14# zylthinking


貌似是的, 现在正在逐渐加深理解中, 从塑料袋第一次讲解相关内容 http://bbs.chinaunix.net/thread-3593865-1-1.html 到现在, 已经一年多了, 总算越来越接近真相了

论坛徽章:
4
天秤座
日期:2013-10-18 13:58:33金牛座
日期:2013-11-28 16:17:01辰龙
日期:2014-01-14 09:54:32戌狗
日期:2014-01-24 09:23:27
18 [报告]
发表于 2013-02-01 13:55 |只看该作者
这东西复杂度确实高,一年半载很正常,我也是研究了一两年了,现在一些问题无法完全连贯起来,更别提自己写程序了。

论坛徽章:
0
19 [报告]
发表于 2014-06-01 21:24 |只看该作者
本帖最后由 yiifburj 于 2014-06-01 21:26 编辑

linux内核文档 Documentation/memory-barriers.txt

锁暗含内存屏障, 和 smp_rmb smp_wmb不同
lock     //lock之后的内存操作一定在lock之后开始,lock之前的内存操作可能在lock之后提交或完成

unlock  //unlock之前的内存操作要在unlock之前完成,unlock之后的内存操作可能在unlock之前提交或完成

unlock 后面带一个 lock 相当于完全内存屏障的作用。smp_mb
lock  code unlock 相当于限制code中的内存操作在lock后开始,unlock前完成,副作用,lock之前的内存操作在unlock之前一定会完成,只能越过lock不会越过unlock, unlock之后的内存操作一定在lock之后完成,只能越过unlock不能越过lock

所以对于锁保护的区间, 不需要内存屏障。
以上仅是个人理解,不保证正确性,内核文档可以好好读读。

我们公司的同事基本都是加锁,很少有人研究内存屏障, 实践表明应该是没有问题的, 忘记加锁,倒是出现过问题,就是一个添加链表,另一个恰好遍历到那个地方, 如果加了内存屏障,不加锁也不会出问题。不过这也是小概率时间,很不容易遇到。

论坛徽章:
0
20 [报告]
发表于 2014-06-03 14:46 |只看该作者
unlock 後面帶一個 lock 相當於完全內存屏障的作用。smp_mb
lock  code unlock 相當於限制code中的內存操作在lock後開始,unlock前完成,副作用,lock之前的內存操作在unlock之前一定會完成,只能越過lock不會越過unlock, unlock之後的內存操作一定在lock之後完成,只能越過unlock不能越過lock


好文,記錄一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP