本人最近在用C++进行并发编程,虽然之前都已经完成了6.824的lab,但对并发的很多细节还是知其然和不知其所以然,于是决定在此记录一下学习到的相关知识。首先声明,本人水平十分有限,而关于这类问题也有很多深度好文,在此记录的仅为简化的自己的理解。
cache line 与 false sharing
想必大家对缓存都有所了解,对于L1缓存来说,存取数据的最小单位是cache line, 而通常大小为 64 byte。所以即使没有用锁保护数据,如果两个变量内存位置邻近,在缓存中位于同一个cache line, 两个线程不能同时修改这两个变量。
因为缓存是专属于cpu的,必须将缓存中的数据写回主存,修改的数据才能可见。 然而写回单位也是cahce line, 所以如果擅自写回可能会影响其他线程修改的数据,从而导致错误。所以硬件会负责协调同步,防止在同一个cache line中的共享数据
互不影响。这也是false sharing 名字的来源:硬件会阻止对同一个cache line中数据的并发访问。代码看上去是并发的,也没有锁,但是并没有并发的性能。
现在回顾一下最简单的并发问题: count++
如果两个线程同时修改count,硬件如何处理这种情况?
对于硬件来说,false sharing阻止的是无意识的影响cache line中的数据,如果这个线程明确表示要修改count的内容,硬件认为这个操作是有效的,如果现在cache line未同步,硬件会把这个修改暂存起来,等到下一次同步的时候再写入。但下次同步的时候,count的值可能已经增加了,但硬件不可能重新计算,硬件负责的就是指令要求修改count位置的数据到某个值,硬件一定会将这个值成功写入,并且不影响其他内存位置的数据。至于值符不符合语义,那就是程序员的问题了。
本人才疏学浅,仅仅就逻辑上讨论了一下并发操作硬件要保证的数据行为, 不涉及buffer store等细节。如有错误请不吝赐教。
标签:count,硬件,缓存,cache,笔记,学习,并发,line From: https://www.cnblogs.com/nanlour/p/17787887.html