MMU笔记(3) 对堆I/O过程的多线程优化思路

发布于 2021-08-23  41 次阅读


背景

本文的讨论基于现代Windows操作系统堆管理API,不包含任何stdmem系列函数

正文

众所周知,Windows的堆分为默认堆和私有堆,而私有堆其实就是分配在默认堆上面的,换句话来说蛋糕不会变大,都是4GB空间

默认堆可以被直接使用,但是为了防止多线程之间对某一块内存doubleCheck,doubleFree等,所以对默认堆进行异步操作是非法的,如果同时有两个线程操作同一个默认堆,实际上程序效率是变低的,因为需要等待上下文

正确做法是分配私有堆,私有堆是预留的,受保护的

私有堆还有一个好处是

当我们发现进程A的程序逻辑偏离预期时,我们一般都会从A查起,但是其实这有可能是B对默认堆的误操作造成的:私有堆降低了维护难度

补充

请求新堆时的操作为:

(1)遍历已分配的和空闲的内存块的链接表。
(2)寻找一个空闲内存块的地址。
(3)通过将空闲内存块标记为“已分配”来分配新内存块。
(4)将新内存块添加给内存块链接表。

可以发现,如果线程A执行完 (1) (2) 后,系统切换到线程B执行 (1)(2),并且他们都找到了同一块内存,这样的后果是灾难性的,因此堆和堆链表的访问权是独占的,而私有堆则是专有的