Windows内存管理机制及C++内存分配实例(三):虚拟内存
Windows核心编程-内存管理

使用虚拟内存
虚拟内存,最适合用来管理大型对象或 结构数组。 内存映射文件,最适合用来管理大型数 据流(通常来自文件)以及在单个计算 机上运行的多个进程之间共享数据。 内存堆栈,最适合用来管理大量的小对 象。
使用虚拟内存-VirtualAlloc
通过调用Vi r t u a l A l l o c函数,可以在进程的地址空间 中保留一个区域: LPVOID VirtualAlloc(
内存管理
当一个进程中的线程试图将数据写入一个共享内存块 时,系统就会进行干预,并执行下列操作步骤:
1) 系统查找R A M中的一个空闲内存页面。注意,当该模块 初次被映射到进程的地址空间时,该空闲页面将被页文件 中已分配的页面之一所映射。当该模块初次被映射时,由 于系统要分配所有可能需要的页文件,因此这一步不可能 运行失败。 2) 系统将试图被修改的页面内容拷贝到第一步中找到的页 面。该空闲页面将被赋予PA G E _ R E A D W R I T E或 PA G E _ E X E C U T E _ R E A D W R I T E保护属性。 原始页面的保护属性和数据不发生任何变化。 3) 然后系统更新进程的页面表,使得被访问的虚拟地址被 转换成新的R A M页面。
使用虚拟内存-提交
始终设法进行物理存储器的提交。每次调用Vi r t u a l A l l o c函数的时候,不要查看物理存储器是否已经映 射到地址空间区域的一个部分,而是让你的程序设法 进行内存的提交。系统首先查看内存是否已经被提交, 如果已经提交,那么就不要提交更多的物理存储器。 这种方法最容易操作,但是它的缺点是每次改变C E L L D ATA结构时要多进行一次函数的调用,这会使程 序运行得比较慢。 使用Vi r t u a l Q u e r y函数确定物理存储器是否已经 提交给包含C E L L D ATA结构的地址空间。如果已经 提交了,那么就不要进行任何别的操作。如果尚未提 交,则可以调用Vi r t u a l A l l o c函数以便提交内存。 这种方法实际上比第一种方法差,它既会增加代码的 长度,又会降低程序运行的速度(因为增加了对Vi r t u a l A l l o c函数的调用)。
操作系统实验实验报告 虚拟内存

操作系统实验实验报告虚拟内存一、实验目的本次操作系统实验的目的是深入理解虚拟内存的概念、原理和实现机制,通过实际操作和观察,掌握虚拟内存的相关技术,包括页面置换算法、内存分配策略等,并分析其对系统性能的影响。
二、实验环境操作系统:Windows 10 专业版开发工具:Visual Studio 2019编程语言:C++三、实验原理1、虚拟内存的概念虚拟内存是一种计算机系统内存管理技术,它使得应用程序认为自己拥有连续的可用内存(一个连续完整的地址空间),而实际上,这些内存可能是被分散存储在物理内存和外部存储设备(如硬盘)中的。
虚拟内存通过将程序使用的内存地址映射到物理内存地址,实现了内存的按需分配和管理。
2、页面置换算法当物理内存不足时,操作系统需要选择一些页面(内存中的固定大小的块)换出到外部存储设备,以腾出空间给新的页面。
常见的页面置换算法有先进先出(FIFO)算法、最近最少使用(LRU)算法、时钟(Clock)算法等。
3、内存分配策略操作系统在分配内存时,需要考虑如何有效地利用有限的物理内存资源。
常见的内存分配策略有连续分配、分页分配和分段分配等。
四、实验内容与步骤1、实现简单的虚拟内存系统使用 C++编写一个简单的虚拟内存模拟程序,包括内存页面的管理、地址映射、页面置换等功能。
2、测试不同的页面置换算法在虚拟内存系统中,分别实现 FIFO、LRU 和 Clock 算法,并对相同的访问序列进行测试,比较它们的页面置换次数和缺页率。
3、分析内存分配策略的影响分别采用连续分配、分页分配和分段分配策略,对不同大小和类型的程序进行内存分配,观察系统的性能(如内存利用率、执行时间等)。
具体步骤如下:(1)定义内存页面的结构,包括页面号、标志位(是否在内存中、是否被修改等)等。
(2)实现地址映射函数,将虚拟地址转换为物理地址。
(3)编写页面置换算法的函数,根据不同的算法选择要置换的页面。
(4)创建测试用例,生成随机的访问序列,对不同的算法和分配策略进行测试。
计算机操作系统中的内存管理和虚拟化技术

计算机操作系统中的内存管理和虚拟化技术计算机操作系统是现代计算机体系结构中不可分割的组成部分。
内存管理和虚拟化技术是计算机操作系统的重要功能之一,它们在保证计算机系统性能和安全性方面发挥着重要作用。
一、内存管理技术内存管理技术是操作系统中实现内存资源的高效利用和保护的重要手段。
计算机系统中的内存被划分为多个逻辑单元,各个逻辑单元之间进行切换和管理,以实现多个进程或任务的并发执行。
1. 内存的划分内存划分是内存管理的第一步。
一般情况下,计算机系统将内存划分为操作系统区域和用户区域。
操作系统区域用于存放操作系统内核和相关数据结构,而用户区域用于存放用户程序和数据。
2. 内存映射内存映射是将逻辑地址转换为物理地址的过程。
操作系统通过地址映射表或页表,将逻辑地址映射到实际的物理地址,以实现程序的正确执行和内存的动态管理。
3. 内存分配与回收内存分配与回收是内存管理的核心功能。
操作系统通过内存分配算法,为进程分配内存空间。
而当进程终止或释放内存时,操作系统需要回收这些空间以供其他进程使用。
4. 内存保护内存保护是防止进程之间互相干扰的重要手段。
通过设定访问权限和限制资源的使用,操作系统可以确保每个进程仅能访问自己被分配到的内存空间,从而保护进程的安全性和稳定性。
二、虚拟化技术虚拟化技术是一种将物理资源抽象为逻辑资源,并为不同的用户或应用程序提供独立的逻辑环境的技术。
在计算机操作系统中,虚拟化技术主要包括虚拟内存和虚拟机技术。
1. 虚拟内存虚拟内存是一种将主存和辅助存储器组合使用的技术。
它通过将物理内存的一部分作为虚拟内存空间,将进程的一部分内容从内存转移到硬盘上,以提高内存的利用率和系统的吞吐量。
2. 虚拟机虚拟机技术是将一个物理计算机虚拟为多个逻辑计算机的技术。
通过虚拟化软件的支持,可以在一台物理机上同时运行多个操作系统和应用程序,实现资源的共享和隔离,提高计算机系统的利用率和灵活性。
虚拟化技术在云计算和服务器虚拟化中得到了广泛应用,它极大地提升了计算机系统的效率和灵活性,降低了资源的成本和能源消耗。
操作系统中虚拟内存的管理

操作系统中虚拟内存的管理在使用操作系统时,我们经常会涉及到虚拟内存的概念。
虚拟内存是一种通过硬盘来扩展计算机的物理内存,让计算机看起来拥有更多的内存空间,从而提升计算机的运行效率。
虚拟内存的管理是操作系统中非常重要的一部分,下面就来介绍一下操作系统中虚拟内存的管理。
一、内存分页内存分页是指将整个物理内存分成多个大小相同的分页,每个分页的大小通常为4KB或8KB。
然后将每个进程的虚拟内存也分成多个相同大小的虚拟页面,每个虚拟页面映射到一个物理页面。
这样一来,进程就可以按照页面单位来管理内存。
当进程访问一个虚拟页面时,操作系统会根据虚拟页面的映射关系,将其转换为物理页面并读取其内容。
如果虚拟页面没有被映射到物理页面,那么操作系统就需要将一个空闲的物理页面映射到该虚拟页面上,并将其内容从硬盘中读取进来。
二、页面置换随着进程的运行,部分物理页面会被频繁使用,而另一部分页面则很少使用甚至没有使用过。
为了更好地利用内存空间,操作系统需要对页面进行置换。
页面置换算法的目标是在物理页面不足时,寻找最适合置换出去的物理页面,并将其替换成要使用的新页面。
常见的页面置换算法有FIFO、LRU、Clock和Random等。
其中,FIFO算法是按照物理页面被加载的时间顺序来置换的,即最先加载进来的页面最先被置换出去。
LRU算法则是按照物理页面最近被使用的时间顺序来置换的。
这样,被最少使用的页面就会被优先置换出去,从而留出更多的页面空间给新页面使用。
三、页面缓存为了提高读取速度,操作系统会将最近使用的物理页面缓存到内存缓存区中,以便下一次访问时能够更快地读取。
而当物理页面不足时,操作系统也会优先将内存缓存区中的页面置换出去,以腾出空间给其他页面使用。
四、页面共享有些进程可能会需要共享同一个物理页面,以节省内存空间并提高系统性能。
比如多个进程在同时运行相同的程序时,它们所使用的代码部分可以共享同一个物理页面,减少了内存开销。
操作系统内存管理

操作系统内存管理操作系统内存管理是计算机操作系统中非常重要的一部分。
它负责管理计算机系统中的内存资源,确保内存的合理分配和使用,以提高系统的性能和效率。
本文将从内存管理的基本概念、内存分配算法、内存保护和虚拟内存等方面进行论述。
一、内存管理的基本概念内存管理是指操作系统对内存资源进行有效管理的过程。
它主要包括内存分配、内存回收和内存保护等方面。
内存分配是指在程序执行过程中,将需要的内存分配给相应的进程;内存回收是指在程序执行结束后,将释放出来的内存重新纳入到可用的内存资源中;内存保护则是通过权限设置和地址转换等机制,保护每个进程的内存空间不被其他进程非法访问。
二、内存分配算法1.连续分配算法连续分配算法是最简单且最常用的内存分配算法之一。
它将内存划分为若干大小相等的分区,并根据进程的需求进行分配。
常见的连续分配算法有首次适应算法、最佳适应算法和最坏适应算法。
2.非连续分配算法非连续分配算法采用分段或分页的方式对内存进行分配。
分段是将程序分为多个独立的段,每个段可以是代码段、数据段或堆栈段;分页则是将程序分为固定大小的页面,每个页面大小相等。
常见的非连续分配算法有段式管理和页面管理。
三、内存保护内存保护是指为了防止进程之间相互干扰,操作系统对每个进程的内存空间进行保护和隔离。
常见的内存保护机制有地址空间隔离和权限设置。
地址空间隔离是通过将每个进程的地址空间映射到不同的物理内存区域,使得每个进程拥有独立的内存空间;权限设置则是通过设置不同的权限位,限制每个进程对内存的访问权限。
四、虚拟内存虚拟内存是操作系统提供给程序的一种抽象概念,它将物理内存抽象成一个高效且无限大的内存空间,从而使得程序能够使用比实际可用内存更大的内存空间。
虚拟内存通过缺页中断和页面置换算法实现内存的动态分配和调度,能够有效地提高系统的内存利用率和性能。
总结:操作系统内存管理是确保计算机系统正常运行的重要组成部分。
通过合理的内存管理可以提高系统的性能和效率,确保每个进程的内存空间得到保护和隔离。
计算机操作系统内存管理了解内存分配和回收的原理

计算机操作系统内存管理了解内存分配和回收的原理计算机操作系统内存管理是操作系统中极为重要的一部分,它负责管理计算机主存(内存)的分配和回收。
内存分配和回收的原理对于了解计算机系统的运行机制至关重要。
本文将从内存管理的基本概念开始,介绍内存的分配和回收原理。
一、内存管理基本概念内存管理是操作系统中的一个重要功能,其主要任务是将有限的内存资源分配给各个进程,并及时回收不再使用的内存。
内存管理的核心是虚拟内存技术,它将计算机的内存空间划分为若干个固定大小的页或块,每个进程都认为自己拥有整个内存空间。
二、内存分配原理1. 连续分配在早期的操作系统中,内存分配采用的是连续分配原理。
系统将内存分为固定大小的分区,并为每个进程分配连续的内存空间。
这种分配方法简单高效,但会导致内存碎片问题,进而影响系统性能。
2. 非连续分配为解决内存碎片问题,后来的操作系统引入了非连续分配原理。
非连续分配可以分为分页式和分段式两种方式。
- 分页式:将物理内存划分为固定大小的页框,逻辑地址空间也被划分为相同大小的页。
通过页表实现逻辑地址到物理地址的映射。
- 分段式:将逻辑地址空间划分为若干个段,每个段的大小可以不同。
通过段表实现逻辑地址到物理地址的映射。
三、内存回收原理内存回收是指在进程不再使用某块内存时,及时将其释放,使其成为可供其他进程使用的空闲内存。
内存回收涉及到的主要原理有以下几种:1. 清除位图操作系统通过使用一张位图,来记录内存中的空闲块和已分配块的状态。
当一个进程释放内存时,系统会将相应的位图标记为空闲,以便后续进程可以使用。
2. 空闲链表操作系统通过维护一个空闲链表来管理空闲内存块。
当一个进程释放内存时,系统会将该内存块插入空闲链表,使其成为可供其他进程分配的空闲内存。
3. 垃圾回收垃圾回收是指当进程释放内存后,操作系统自动检测并回收无法访问到的对象所占用的内存。
垃圾回收可以通过引用计数和标记清除等算法实现。
四、内存管理策略为了提高内存利用率和系统性能,操作系统采用了一系列内存管理策略:1. 内存分配策略- 最先适应算法:从空闲链表中选择第一个足够大的内存块分配给进程。
内存参数计算

内存参数计算在计算机科学和IT领域,内存是非常重要的一部分。
通过掌握内存的相关参数,可以更好地配置、优化和管理系统的性能。
内存参数包括物理内存、虚拟内存、页框和页面等等,下面就详细地介绍并计算相关内存参数。
1. 物理内存物理内存指的是计算机上实际安装的内存条的大小,一般以GB为单位来表示。
在使用计算机时,可以通过查看系统属性或使用Task Manager来了解自己电脑的物理内存大小。
确定物理内存大小可以帮助我们了解系统的硬件限制,并且在使用各种应用程序和操作系统时帮助调整内存使用。
2. 虚拟内存虚拟内存是一种操作系统机制,它可以通过使用硬盘上的空间模拟额外的内存。
虚拟内存空间大小是由操作系统自动管理的,并且可以配置。
在Windows系统中,可以从“控制面板”->“系统和安全”->“系统”->“高级系统设置”->“性能设置”中找到虚拟内存的选项。
虚拟内存的作用是增加操作系统的可用内存,以便更好地管理和运行大型应用程序或多个程序。
3. 页框页框是操作系统中用于管理物理内存空间的单位,一般大小为4KB。
在64位计算机中,页框的大小为8KB或16KB。
操作系统会将内存空间分成一系列的页框,每个页框都有一个内存地址,以便程序可以访问其内容。
操作系统利用页框来管理内存,确保一次只有一页框被加载到物理内存中,以减少内存碎片化。
4. 页面页面是指程序执行时所需的内存空间。
操作系统会将程序的每个页面映射到物理内存空间中的一个页框,以便程序可以访问这个页面。
页面的大小是固定的,一般为4KB或8KB。
程序中使用的页面通过页表进行管理,页表包含了程序所需的所有页面的信息,以便操作系统可以正确地将页面映射到页框中。
为了计算内存参数,我们需要了解以下几个关键概念:1. 可用内存:指计算机中空闲的可供使用的内存空间。
2. 内存使用率:指当前计算机使用的内存和总内存的比率。
3. 虚拟内存空间大小:指操作系统配置的虚拟内存空间大小。
虚拟内存的设置

虚拟内存的设置引言:在计算机系统中,虚拟内存是一种用于管理计算机内存的技术。
它将硬盘上的一部分空间用作内存的扩展,允许计算机运行更大的程序或处理更多的数据。
而虚拟内存的设置在计算机性能和系统稳定性方面起着至关重要的作用。
本文将探讨虚拟内存的设置原理、影响以及优化方法。
一、虚拟内存的设置原理虚拟内存是基于分页机制实现的。
操作系统将物理内存划分为固定大小的单元,称为页面。
当系统执行一个程序时,它将程序的一部分加载到物理内存中的页面上。
当程序需要更多的内存空间时,如果物理内存不足,系统会将不常用的页面置换到硬盘上的虚拟内存中,从而释放物理内存供其他程序使用。
这样,系统就可以运行比实际物理内存大小更大的程序了。
二、虚拟内存的设置影响正确设置虚拟内存的大小可以显著提升计算机性能和系统的稳定性。
以下是虚拟内存设置的几个关键因素:1. 初始大小:系统在启动时分配给虚拟内存的初始存储空间大小。
如果初始大小设置过小,系统可能不足以支持运行大型程序或处理大规模数据时的内存需求。
因此,合理设置初始大小非常重要。
2. 最大大小:虚拟内存的最大存储空间大小。
如果设置过小,在系统运行过程中可能会导致内存不足的情况,从而影响系统的正常运行。
而如果设置过大,会占用过多的硬盘空间。
因此,需要根据计算机具体配置和应用需求合理设置最大大小。
3. 页面大小:操作系统将物理内存划分为页面的大小。
页面大小的选择可能会影响程序的性能。
大页面大小有助于提高程序的访问速度,但也会消耗更多的物理内存。
小页面大小则可以提高页面的利用率。
选择页面大小需要权衡计算机硬件能力和应用场景。
三、优化虚拟内存的设置对于大多数用户来说,操作系统在安装时会自动设置虚拟内存的默认值,但用户仍然可以根据自己的需求进行优化。
1. 调整虚拟内存大小:根据计算机的实际应用需求,可以适当调整虚拟内存的初始大小和最大大小。
建议将初始大小设置为物理内存的1.5倍,并将最大大小设置为物理内存的3倍。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文背景:在编程中,很多Windows或C++的内存函数不知道有什么区别,更别谈有效使用;根本的原因是,没有清楚的理解操作系统的内存管理机制,本文企图通过简单的总结描述,结合实例来阐明这个机制。
本文目的:对Windows内存管理机制了解清楚,有效的利用C++内存函数管理和使用内存。
本文内容:3. 内存管理机制--虚拟内存 (VM)· 虚拟内存使用场合虚拟内存最适合用来管理大型对象或数据结构。
比如说,电子表格程序,有很多单元格,但是也许大多数的单元格是没有数据的,用不着分配空间。
也许,你会想到用动态链表,但是访问又没有数组快。
定义二维数组,就会浪费很多空间。
它的优点是同时具有数组的快速和链表的小空间的优点。
· 分配虚拟内存如果你程序需要大块内存,你可以先保留内存,需要的时候再提交物理存储器。
在需要的时候再提交才能有效的利用内存。
一般来说,如果需要内存大于1M,用虚拟内存比较好。
· 保留用以下Windows 函数保留内存块VirtualAlloc (PVOID 开始地址,SIZE_T 大小,DWORD 类型,DWORD 保护属性)一般情况下,你不需要指定“开始地址”,因为你不知道进程的那段空间是不是已经被占用了;所以你可以用NULL。
“大小”是你需要的内存字节;“类型”有MEM_RESERVE(保留)、MEM_RELEASE(释放)和MEM_COMMIT(提交)。
“保护属性”在前面章节有详细介绍,只能用前六种属性。
如果你要保留的是长久不会释放的内存区,就保留在较高的空间区域,这样不会产生碎片。
用这个类型标志可以达到:MEM_RESERVE|MEM_TOP_DOWN。
C++程序:保留1G的空间LPVOIDpV=VirtualAlloc(NULL,1000*1024*1024,MEM_RESERVE|MEM_TOP_DOWN,PAGE_READW if(pV==NULL)cout<<"没有那么多虚拟空间!"<<endl;MEMORYSTATUS memStatusVirtual1;GlobalMemoryStatus(&memStatusVirtual1);cout<<"虚拟内存分配:"<<endl;printf("指针地址=%x\n",pV);cout<<"减少物理内存="<<memStatusVirtual.dwAvailPhys-memStatusVirtual1.dwAvailPhys<<endl;cout<<"减少可用页文件="<<memStatusVirtual.dwAvailPageFile-memStatusVirtual1.dwAvailPageFile<<endl;cout<<"减少可用进程空间="<<memStatusVirtual.dwAvailVirtual-memStatusVirtual1.dwAvailVirtual<<endl<<endl;结果如下:可见,进程空间减少了1G;减少的物理内存和可用页文件用来管理页目和页表。
但是,现在访问空间的话,会出错的:int * iV=(int*)pV;//iV[0]=1;现在访问会出错,出现访问违规· 提交你必须提供一个初始地址和提交的大小。
提交的大小系统会变成页面的倍数,因为只能按页面提交。
指定类型是MEM_COMMIT。
保护属性最好跟区域的保护属性一致,这样可以提高系统管理的效率。
C++程序:提交100M的空间LPVOIDpP=VirtualAlloc(pV,100*1024*1024,MEM_COMMIT,PAGE_READWRITE); if(pP==NULL)cout<<"没有那么多物理空间!"<<endl;int * iP=(int*)pP;iP[0]=3;iP[100/sizeof(int)*1024*1024-1]=5;//这是能访问的最后一个地址 //iP[100/sizeof(int)*1024*1024]=5;访问出错· 保留&提交你可以用类型MEM_RESERVE|MEM_COMMIT一次全部提交。
但是这样的话,没有有效地利用内存,和使用一般的C++动态分配内存函数一样了。
· 更改保护属性更改已经提交的页面的保护属性,有时候会很有用处,假设你在访问数据后,不想别的函数再访问,或者出于防止指针乱指改变结构的目的,你可以更改数据所处的页面的属性,让别人无法访问。
VirtualProtect (PVOID 基地址,SIZE_T 大小,DWORD 新属性,DWORD 旧属性)“基地址”是你想改变的页面的地址,注意,不能跨区改变。
C++程序:更改一页的页面属性,改为只读,看看还能不能访问DWORD protect;iP[0]=8;VirtualProtect(pV,4096,PAGE_READONLY,&protect);int * iP=(int*)pV;iP[1024]=9;//可以访问,因为在那一页之外//iP[0]=9;不可以访问,只读//还原保护属性VirtualProtect(pV,4096,PAGE_READWRITE,&protect);cout<<"初始值="<<iP[0]<<endl;//可以访问· 清除物理存储器内容清除页面指的是,将页面清零,也就是说当作页面没有改变。
假设数据存在物理内存中,系统没有RAM页面后,会将这个页面暂时写进虚拟内存页文件中,这样来回的倒腾系统会很慢;如果那一页数据已经不需要的话,系统可以直接使用。
当程序需要它那一页时,系统会分配另一页给它。
VirtualAlloc (PVOID 开始地址,SIZE_T 大小,DWORD 类型,DWORD 保护属性)“大小”如果小于一个页面的话,函数会执行失败,因为系统使用四舍五入的方法;“类型”是MEM_RESET。
有人说,为什么需要清除呢,释放不就行了吗?你要知道,释放了后,程序就无法访问了。
现在只是因为不需要结构的内容了,顺便提高一下系统的性能;之后程序仍然需要访问这个结构的。
C++程序:清除1M的页面:PVOID re=VirtualAlloc(pV,1024*1024,MEM_RESET,PAGE_READWRITE);if(re==NULL)cout<<"清除失败!"<<endl;这时候,页面可能还没有被清零,因为如果系统没有RAM请求的话,页面内存保存不变的,为了看看被清零的效果,程序人为的请求大量页面:C++程序:VirtualAlloc((char*)pV+100*1024*1024+4096,memStatus.dwAvailPhys+10000000,MEM_没访问之前是不给物理内存的。
char* pp=(char*)pV+100*1024*1024+4096;for(int i=0;i<memStatus.dwAvailPhys+10000000;i++)pp[i]='V';//逼他使用物理内存,而不使用页文件GlobalMemoryStatus(&memStatus);cout<<"内存初始状态:"<<endl;cout<<"长度="<<memStatus.dwLength<<endl;cout<<"内存繁忙程度="<<memStatus.dwMemoryLoad<<endl;cout<<"总物理内存="<<memStatus.dwTotalPhys<<endl;cout<<"可用物理内存="<<memStatus.dwAvailPhys<<endl;cout<<"总页文件="<<memStatus.dwTotalPageFile<<endl;cout<<"可用页文件="<<memStatus.dwAvailPageFile<<endl;cout<<"总进程空间="<<memStatus.dwTotalVirtual<<endl;cout<<"可用进程空间="<<memStatus.dwAvailVirtual<<end;cout<<"清除后="<<iP[0]<<endl;结果如下:当内存所剩无几时,系统将刚清除的内存页面分配出去,同时不会把页面的内存写到虚拟页面文件中。
可以看见,原先是8的值现在是0了。
· 虚拟内存的关键之处虚拟内存存在的优点是,需要的时候才真正分配内存。
那么程序必须决定何时才提交内存。
如果访问没有提交内存的数据结构,系统会产生访问违规的错误。
提交的最好方法是,当你程序需要访问虚拟内存的数据结构时,假设它已经是分配内存的,然后异常处理可能出现的错误。
对于访问违规的错误,就提交这个地址的内存。
· 释放可以释放整个保留的空间,或者只释放分配的一些物理内存。
释放特定分配的物理内存:如果不想释放所有空间,可以只释放某些物理内存。
“开始地址”是页面的基地址,这个地址不一定是第一页的地址,一个窍门是提供一页中的某个地址就行了,因为系统会做页边界处理,取该页的首地址;“大小”是页面的要释放的字节数;“类型”是MEM_DECOMMIT。
C++程序://只释放物理内存VirtualFree((int*)pV+2000,50*1024*1024,MEM_DECOMMIT);int* a=(int*)pV;a[10]=2;//可以使用,没有释放这一页MEMORYSTATUS memStatusVirtual3;GlobalMemoryStatus(&memStatusVirtual3);cout<<"物理内存释放:"<<endl;cout<<"增加物理内存="<<memStatusVirtual3.dwAvailPhys-memStatusVirtual2.dwAvailPhys<<endl;cout<<"增加可用页文件="<<memStatusVirtual3.dwAvailPageFile-memStatusVirtual2.dwAvailPageFile<<endl;cout<<"增加可用进程空间="<<memStatusVirtual3.dwAvailVirtual-memStatusVirtual2.dwAvailVirtual<<endl<<endl;结果如下:可以看见,只释放物理内存,没有释放进程的空间。