看了一点分布式算法,个人理解分布式解决的本质的多进程修改数据时保持一致性的问题 联想到在操作系统内的类比场景,就是多 cpu 访问多内存,然后看了操作系统的书,都有讲多核调度,但是似乎都只是讲了 task 在多核的算力分配的场景 好奇难道不需要考虑多 cpu 写 mem 失败的场景吗(对操作系统不太熟悉) 比如:a=1 ; task A 是给 a+1 ; task B 是给 a+2 两个 task 同时在两个 cpu 上同时修改 a ,怎么保证一致性呢,操作系统的书里没有讲到这个东西,比较好奇
1
misdake 2022-07-26 22:55:51 +08:00
都学到操作系统了,前面 CSAPP 里学的信号量、PV 还有印象么
|
2
misdake 2022-07-26 23:23:55 +08:00
看你写的内容,感觉像是把两个问题揉在一起提问:
1. 你举的例子里,两个进程同时尝试读写同一个地址的时候,因为读写分别是原子操作但整体不是原子操作,可能会出现读读写写的错误情况,单核在上下文切换时也可能发生。这个要用信号量或等效的方法解决。资料 https://www.coursera.org/lecture/os-pku/xin-hao-liang-ji-pvcao-zuo-sbhMU 2. 两个核心同时访问同一个地址,一个写一个读,在硬件层面,CPU 是否提供多核间的数据一致性,一致性保证到一个什么程度,是用怎样的方法保证的。这个可以从 CPU 缓存开始学,一直学到缓存一致性协议。资料 https://mp.weixin.qq.com/s/PDUqwAIaUxNkbjvRfovaCg |
3
garyox64 OP @misdake 不好意思 原来正文这个格式没有排版
其实我说进程只是举例分布式的场景啦,其实想问的最终还是 多 cpu 写 mem 的一致性问题 多 cpu 读写缓存这个书上也有讲的,所以我主要想了解的还是 多 cpu 读写 mem 的时候的一致性问题,我看了微信的资料,似乎并没有相关的介绍 |
4
misdake 2022-07-27 00:07:52 +08:00
@garyox64 #3
如果是单机多进程分布的话,多 CPU 仍然是通过某种缓存一致的总线相连的,仍然能保证缓存一致性。读写 mem 其实就是在读写 cache ,所以这个天然就没问题。 如果指的是多机的分布的话。内存不在同一个空间里,没办法直接写,要写一些基础设施来通过某种网络共享内存,很可能没有硬件的直接支持。这种情况下多机同时读写同一块数据要通过软件的方法来规避,尽量保证同一时间数据只有一个地方能读写,然后使用某种基于网络的同步机制,大家一起读。(即同时间最多 1 个读写,或者多个只读) |
5
yumenawei 2022-07-27 08:53:19 +08:00
MESI 协议了解一下
|
6
garyox64 OP @misdake https://www.cnblogs.com/yanlong300/p/8986041.html 找了一个资料,原来 MESI 的写回是通过 store buffer 写回的但是仍然不能 100%保证一致性,所以最后引入了 内存屏障的概念
|