主要观点:常被问及内存映射文件为何比普通读写 I/O 调用更高效,以及共享内存是否比私有内存慢,Windows 内核中这些看似无关的机制有共同实现即“节对象”或“文件映射对象”。
关键信息:
- 映射文件时,内存管理器创建数据结构将进程地址空间的虚拟内存页区域映射到磁盘文件区域,访问映射的虚拟地址时处理器生成异常,内存管理器按需从文件读取到新分配物理页并重新映射。
- 内存映射文件比调用 read API 更高效有用,后续访问已从磁盘获取的页无需操作系统干预,无需额外分配和释放缓冲区,方便与直接操作内存地址的库配合。但也有缺点,如异步 I/O 与内存映射文件配合不佳。
- 节对象也用于进程间共享内存,一个进程命名节对象,另一个进程可通过相同名称打开句柄并映射区域,节对象可基于磁盘文件(即跨进程的内存映射文件)或不基于磁盘文件(纯粹的共享内存区域),从 CPU 视角,访问共享内存页和私有内存页相同,硬件不关心是否共享。
重要细节:文中提到可参考Windows Internals, 6th Edition了解节对象工作原理,还举例说明 Windows 图像加载器如何将 DLL 映射到内存等。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。