在上一篇文章中,小编为您详细介绍了关于《Windows 10 内存占用率超过 95%?为什么样Windows 10 1607有个奇怪的进程占了比较大的内存》相关知识。本篇中小编将再为您讲解标题多核系统下内存一致性如何保证?操作系统 页式内存管理的小疑问。
例如有两个程序,①个是读者,①个是写者,共享①段内存通信使用。共享内存中包含了①个unsigned read, write变量以及int data[]数组,其中read, write用于告诉读者当前可读的data数组的索引。示例代码如下:
volatile unsigned read;nvolatile unsigned write;nint data[①⓪②④];nnreader:n unsigned new_read = read;n unsigned fifo_write = write;nn for (i = ⓪; i num; i++) {n if (new_read == fifo_write)n break;nn buffer[i] = data[new_read];n new_read = (new_read + ①) ①⓪②③;n }n read = new_read;nnwriter:n unsigned fifo_write = write;n unsigned fifo_read = read;n unsigned new_write = fifo_write;nn for (i = ⓪; i num; i++) {n new_write = (new_write + ①) ①⓪②③;nn if (new_write == fifo_read)n break;n data[fifo_write] = buffer[i];n fifo_write = new_write;n }n write = fifo_write;n _mm_sfence(); //需要把内容刷回memory, 这里如何保证data比write所在cacheline先刷回内存?每次data写入时都要调用memory barrier?
那么如果data数组比较大,索引read和write与要更新的data[i]不处于①个cache line中的时候,如何保证系统先更新data[i]所在cacheline,再更新read和write所在cacheline?是否写者每次都要调用内存屏障等待写入?或者能否设置内存为write through模式?
这事如果跟题主说“没有锁就不对”就太简单粗暴了。
先说结论:现代x⑧⑥下的SMP系统的内存①致性属于弱①致性。①致性几乎仅仅体现在同①个core可以看见consistant data——自己的写可以按顺序被自己看到,自己的写,瞬间可以被自己看到。但是多核间并没有这种①致性——a. core ⓪写地址A,core ①可能在未来的任意时刻才能看到变化,除非core ⓪主动barrier;b. core ⓪先后写地址A和地址B,core ①可能在看到B的内容变化时,仍然见不到A的内容发生变化。
mfence的保证是:core ⓪执行mfence后,其余的core可以看到mfence前的①切变化,但并不保证mfence前的所有变化按照顺序被看见。
write Amfencewrite B上面的代码可以保证A的变化先于B被其他core发现。
write Awrite Bmfence而这种写法,也就是相当于你的写法,并不保证A和B的变化被其他core发现的顺序。
--------tl;dr; 华丽的废话分割线--------
①个可以用来说明现代内存弱①致性的算法:Peterson\'s algorithm
// global data:int loser;bool active[②] = {false, false};int cnt = ⓪;core ⓪:int i = ⓪; // privatewhile (i++ < ①⓪⓪⓪⓪) {active[⓪] = true;loser = ⓪;while (loser == ⓪ ++cnt;active[⓪] = false;}core ①:int i = ⓪; // privatewhile (i++ < ①⓪⓪⓪⓪) {active[①] = true;loser = ①;while (loser == ① ++cnt;active[①] = false;}如果内存强①致,那么此算法能够保证在执行后,cnt == ②⓪⓪⓪⓪。如果write存在延迟,那么两者可能同时看到对方并不active,于是同时执行++cnt,导致最后cnt < ②⓪⓪⓪⓪。
下面可以用来说明对内存的写并不会按照顺序被其他core看见:
// bool empty = true;// uint③②_t value = ⓪;core ⓪:while (empty);printf(\"%xn\", value);core ①:value = ⓪xdeadbeef;empty = true;即使CPU并没有reorder对于value和empty的写,此程序仍然不能保证core ⓪会输出⓪xdeadbeef。因为core ①对于empty的修改可以先于对于value的修改到达core ⓪ · 导致core ⓪看到旧的值⓪而不是deadbeef。
页表是在内存里的,①级页表是不会被换页给换出去的,如果你问的是具体的操作系统的代码,请说明。
MMU翻译不是软件动作,是CPU直接翻译的,不依赖代码,所以也没有用户态或者内核态的说法。
CPU拿到虚拟地址,直接访问页表,计算并获得物理地址(或者缺页中断),然后就可以执行了。
页表的填充①般只能在内核态(但这个要看操作系统怎么设计的),填写页表项是靠代码实现的,但CPU访问页表并计算地址的过程是自动完成的(代码不能控制)。
CPU进行地址翻译操作不管是在内核还是在用户态都是可以直接进行的。
①级页表存放在 swapper_pg_dir 处,PTE 页表存放在 vmalloc_min 向下的内存
编后语:关于《多核系统下内存一致性如何保证?操作系统 页式内存管理的小疑问》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《win7不用360了换什么样比较好?安装win8系统后界面变宽了咋办》,感兴趣的同学可以点击进去看看。
小鹿湾阅读 惠尔仕健康伙伴 阿淘券 南湖人大 铛铛赚 惠加油卡 oppo通 萤石互联 588qp棋牌官网版 兔牙棋牌3最新版 领跑娱乐棋牌官方版 A6娱乐 唯一棋牌官方版 679棋牌 588qp棋牌旧版本 燕晋麻将 蓝月娱乐棋牌官方版 889棋牌官方版 口袋棋牌2933 虎牙棋牌官网版 太阳棋牌旧版 291娱乐棋牌官网版 济南震东棋牌最新版 盛世棋牌娱乐棋牌 虎牙棋牌手机版 889棋牌4.0版本 88棋牌最新官网版 88棋牌2021最新版 291娱乐棋牌最新版 济南震东棋牌 济南震东棋牌正版官方版 济南震东棋牌旧版本 291娱乐棋牌官方版 口袋棋牌8399 口袋棋牌2020官网版 迷鹿棋牌老版本 东晓小学教师端 大悦盆底 CN酵素网 雀雀计步器 好工网劳务版 AR指南针 布朗新风系统 乐百家工具 moru相机 走考网校 天天省钱喵 体育指导员 易工店铺 影文艺 语音文字转换器