《Windows核心编程》 可以说是每一位Windows平台程序员成长过程中必备和必读的书籍。其中的Part III主要讲解了Windows平台的内存管理机制。这部分内容可以说是本书比较有难度并且理论性内容比较多的一章。今天,就内存管理这部分说一说自己的一些理解。
- Reserve region。reserve基本上可以看做是一个打报告的行为,或者说是预约。通过调用VirtualAlloc配合MEM_RESERVE我们可以从虚拟地址空间分配出一块内存。这块内存称之为region。需要注意的是,此时虽然已经预约了一块内存空间,但事实上并没有真正分配。比较拗口。简单说就是,这个过程预订了一块虚拟地址空间,但是这一段连续的地址空间在物理存储器上找不到对应关系。
- Commit region。Commit过程才是真正分配空间的过程。这个时候通过VirtualAlloc配合参数MEM_COMMIT在物理存储器上分配出空间,并将对应的虚拟地址空间映射到这部分物理存储器地址上。
- Physical storage。所谓的物理存储器。需要和physical memory的概念区别开来。Physical memory指物理内存,或者说RAM。Physical storage还包括磁盘(paging file and memory-mapped file)。
- Memory-mapped file。内存映射文件。这个概念在原书第三部分第一次提到时,理解起来是很模糊的。要很好理解这个名词,必须要很好理解书本中经常出现的back这个词。back的概念事实上就是一种映射关系。分配出来的虚拟地址空间到底和Physical storage中的哪种东西存在对应关系。因此对于内存映射文件,其意思就是有一段虚拟地址空间,和它对应的物理地址空间并不存在在内存或者页面文件中,而是存在于磁盘空间。表格13-5 Memory Region Types很好的解释了back这个词的意思。比方说
- free type region:the region’s virtual addresses are not backed by any storage
- private type region:the region’s virtual addresses are backed by the system’s paging file
- image type region:the region’s virtual addresses were originally backed by a memory-mapped image file
- Working set。这个概念比较简单,对于一个进程,它驻留在内存中的那些pages就称之为working set。