免费注册 查看新帖 |

Chinaunix

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

为什么用户空间程序不用考虑内存屏障? [复制链接]

论坛徽章:
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
11 [报告]
发表于 2011-10-14 12:05 |只看该作者
靠, 我自己想明白了。
多CPU, 则如五楼所引用, 没有出问题可能;
单CPU就更没有可能了; CPU 的读写依赖可是和线程无关的, 就算它转到其他线程, 照样是一个读写依赖, 这足够保证不出问题的了

论坛徽章:
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 [报告]
发表于 2011-10-14 12:27 |只看该作者
虽然有读写依赖, 但由于线程变了, CS:EIP被切换, 虽然有依赖但似乎已经无法继续执行前一个线程的写操作, 不过在这里应该是CPU考虑的问题, 估计CPU会做某些动作; 至少指令进入CPU是顺序进入的, 只是在内部乱而已, 那么就算CS:EIP变了, 写指令也在改变之前进入CPU了, CPU应该有足够能力保证这个读写依赖的顺利执行

论坛徽章:
0
13 [报告]
发表于 2011-10-14 12:39 |只看该作者
回复 11# zylthinking


    多CPU的问题,5楼的同学是断章取义了。塑料袋的帖子(http://bbs.chinaunix.net/viewthr ... ;page=1#pid21444816)可没有说现在的所有CPU都严格按照这两条“原理”来设计吧。如果是这样,那还需要内存屏障干什么?

    单CPU的问题,如何保证编译器不重排指令?如果指令不重排,貌似确实没什么问题。

论坛徽章:
0
14 [报告]
发表于 2011-10-14 12:42 |只看该作者
回复 11# zylthinking

搞不懂这个和线程切换有什么关系。假设多cpu,thread A 在cpu1, thread B在cpu 2, 如果cpu1 reorder了thread A的memory write,那么thread B在cpu2上就可能先看到enable的update,下面的memory copy就会有问题。

你的code在x86上没有关系,因为x86不会reorder memory write.

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
15 [报告]
发表于 2011-10-14 13:01 |只看该作者
回复 13# kouu

的确是我相当然了,感谢指出!

论坛徽章:
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
16 [报告]
发表于 2011-10-14 13:58 |只看该作者
回复  zylthinking


    多CPU的问题,5楼的同学是断章取义了。塑料袋的帖子()可没有说现在的所有CP ...
kouu 发表于 2011-10-14 12:39


多CPU如果不考虑这个原则, 那就真的对应用程序来说是灾难了, 问题是几乎没有内存屏障概念的用户空间代码似乎在这方面没有出现过太多的问题, 自然也有可能是现实中大部分是x86的, 或者其他平台也未必一定不遵守这个约定; 就我记忆, 似乎情景分析下册 smp 那一章提到过x86的什么机制来着, 反正就是多核心变量同步对程序员做到透明了, 至于这样, 为什么还需要mb, barrier这些东西写在源码里, 我还真没思考过, 连这个内存屏障的基本作用也是今天才弄清楚了一点点。

单cpu编译器优化导致的问题, 很有可能就是现实存在的, 听说过很多gcc O3 优化导致出问题的说法, 但一直没研究过

论坛徽章:
0
17 [报告]
发表于 2011-10-14 15:37 |只看该作者
回复 16# zylthinking


    原来是我的帖子新开出来的啊。
    其实我的文档里面写了,用户态多线程操作共享数据时都需要加锁的(类似于内核信号量),这应该是基本原则。我以前工作就是做linux用户态多线程服务器的,不加锁就等着段错把。

论坛徽章:
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
18 [报告]
发表于 2011-10-14 15:39 |只看该作者
回复  zylthinking


    原来是我的帖子新开出来的啊。
    其实我的文档里面写了,用户态多线程操作 ...
ruslin 发表于 2011-10-14 15:37


你没有仔细看我贴出的代码

论坛徽章:
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
19 [报告]
发表于 2011-10-14 16:09 |只看该作者
进程切换的时候,必然是需要一个同步点的,这是一个一般原则。

multipul processor memory consistency model (?好像是这个名字),又缩写为WRL-95-9的一篇文章里,专门有一章thread migration,谈了半天这个问题。

论坛徽章:
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
20 [报告]
发表于 2011-10-14 16:22 |只看该作者
进程切换的时候,必然是需要一个同步点的,这是一个一般原则。

multipul processor memory consistency  ...
塑料袋 发表于 2011-10-14 16:09


就等你呢, 那么现在一个基本问题: 缺乏 barrier 造成的代码重排, 可能导致
thread A:

ptr->buf = malloc();
ptr->flag = 1;

thread B:

if(ptr->flag == 1){
    memcpy(ptr->buf, ...)
}

会不会存在???

另一个问题:
CPU 乱序执行, 如果ptr->flag = 1先执行了, 但前一个还没有执行, 在X86 下, 很显然这个执行结果不会传出 CPU外, 那么同时CPU2 执行到 if(ptr->flag == 1), CPU2能不能即时得到 flag == 1 为 true 的消息???

第三个问题:
如果不是X86, 有没有可能 ptr->flag 能够先传出 CPU外而被 CPU2得知?

以上两种情况如果答案都是true, 都会导致memcpy(ptr->buf, ...), CPU如何防止这种结果
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP