11.5.2 内存管理系统调用

Win32 API包含了大量的函数来支持一个进程显式地管理它自己的虚拟内存,其中最重要的函数如图11-31所示。它们都是在包含一个单独的页或一个由两个或多个在虚拟地址空间中连续页的序列的区域上进行操作的。

前四个API函数是用来分配、释放、保护和查询虚拟地址空间中的区域的。被分配的区域总是从64KB的边界开始,以尽量减少移植到将来的体系结构的问题(因为将来的体系结构可能使用比当前使用的页更大的页)。实际分配的地址空间可以小于64KB,但是必须是一个页大小的整数倍。接下来的两个API给一个进程把页面固定到内存中以防止它们被替换到外存以及撤销这一性质的功能。举例来说,一个实时程序可能需要它的页面具有这样的性质以防止在关键操作上发生页面失效。操作系统强加了一个限制来防止一个进程过于“贪婪”:这些页面能够移出内存,但是仅仅在整个进程被替换出内存的时候才能这么做。当该进程被重新装入内存时,所有之前被指定固定到内存中的页面会在任何线程开始运行之前被重新装入内存。尽管没有从图11-31中体现出来,Windows Vista还包含一些原生API函数来允许一个进程访问其他进程的虚拟内存。前提是该进程被给予了控制权,即它拥有一个相应的句柄。

阅读 ‧ 电子书库
图 11-31 Windows中用来管理虚拟内存的主要的Win32 API函数

列出的最后四个API函数是用来管理内存映射文件的。为了映射一个文件,首先必须通过调用CreateFileMapping来创建一个文件映射对象(见图11-23)。这个函数返回一个文件映射对象(即一个内存区对象)的句柄,并且可以选择是否为该操作添加一个名字到Win32地址空间中,从而其他的进程也能够使用它。接下来的两个函数从一个进程的虚拟地址空间中映射或取消映射内存区对象之上的视图。最后一个API能被一个进程用来映射其他进程通过调用CreateFileMapping创建并共享出来的映射,这样的映射通常是为了映射匿名内存而建立的。通过这样的方式,两个或多个进程能够共享它们地址空间中的区域。这一技术允许它们写内容到相互的虚拟内存的受限的区域中。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元