13、Windows API 内存管理(3)

简介: 二、堆管理     用户使用内存分配函数分配的内存都位于堆中,所以使用堆管理函数对内存进行分配、释放等是最为直接的方式。     Windows系统中,每个进程都有自己的堆,每个进程的堆的数量也有所不同。

二、堆管理<?xml:namespace prefix = o />

    用户使用内存分配函数分配的内存都位于堆中,所以使用堆管理函数对内存进行分配、释放等是最为直接的方式。

    Windows系统中,每个进程都有自己的堆,每个进程的堆的数量也有所不同。Windows系统中所谓的“堆”(Heap)并不是内存块,而是一种用于内存管理的对象,也是一种内存组织的形式。进程可以从属于自己的堆上分配内存和释放内存。堆包括有若干种属性,如堆的大小最大值可以是固定的、也可以是“可增长的”;堆上的数据内容是否可以作为代码可执行;堆是否可连接存取等。

三、全局和局部内存管理

    32位Windows系统中并没有区分全局堆和局部堆,Windows系统中之所以还存在着全局和局部函数的概念是为了和16位系统相兼容。GlobalAlloc、LocalAlloc函数所分配的内存没有什么区别,内存分配的效果与HeapAlloc函数类似。但是GlobalAlloc与LocalAlloc分配内存时比HeapAlloc要慢。

    因此更推荐使用Heap函数。

四、虚拟内存管理

    内存管理的原理都由系统的内存管理器实现,应用程序只能管理属性于自己的虚拟地址空间。

    进程的虚拟地址空间内存页面存在3种状态,分别为空闲的(free)、保留的(reserved)和提交的(Committed)。

wps_clip_image-31189

五、内存分配的比较

使用VirtualAlloc,VirtualFree等函数进行操作,其操作的基本单位是内存页面。

HeapAlloc、GlobalAlloc、LoaclAlloc在功能上没有大的区别,都是在堆中分配内存,分配的内存不需要进行页对齐,也不用关心分页机制、页面状态、页面属性等内容。HeapAlloc是程序在需要分配内存时最直接的方式。这些内容由堆管理器负责。

堆内存管理依赖于虚拟内存管理。在创建堆时,HeapCreate API函数会向系统请求虚拟内存分页,之后在这个堆上的内存分配实际上是在从虚拟内存管理中获取的内存分页上再分配大小任意的内存块,如果在建立堆时指定了固定了堆大小,那么在堆上分配内存块时,其范围不能超过设置的堆大小,堆大小一定是内存页大小的整数倍。如果在建立堆时不固定堆的大小,堆管理函数会根据分配的请求数量,动态地向虚拟内容管理函数请求内存分页。

VirtualAlloc的功能是对进程虚拟地址空间中内存分页的状态进行管理,属于虚拟内存管理(以内存页面为单位)的范围。当然内存的分配也是通过改变虚拟内存页面属性来实现的,所以VirtualAlloc间接达到了分配内存的目的。堆管理器也是依赖于虚拟内存管理的,在收到HeapAlloc的内存分配的请求时,堆管理器会根据情况决定是否使用虚拟内存管理机制分配新的页面,以及如何在页面上布局分配的内存块,从这个层次上讲VirtualAlloc更为底层

    实际上只要虚拟内存管理函数将页面属性设置为“已提交”后,就可以在之上进行读写等操作。

    堆管理函数为应用程序提供了一种更灵活、更简单的方式来管理这些“已提交”的内存。其好处一是分配更简单,二是可以分配任意大小的内存,三是不用直接与复制的内存分页机制打交道。

    标准C函数的内存分配函数则直接使用了HeapAlloc。

    HeapAlloc、GlobalAlloc、LoaclAlloc在32位系统上功能上是一致的,但是由于Globa]_Alloc、LoaclAlloc需要兼容16位系统,所需进行的判断和处理会更多,因此GlobalAlloc、LoaclAlloc较HeapAlloc效率低。当然标准C函数malloc也是调用HeapAlloc实现的,所以其效率也必然比HeapAlloc低。

    由于HeapAlloc与VirtualAlloc功能定位上的不同,所以在效率上没有可比性。从原理上讲,HeapAlloc在分配内存时,如果堆管理器中有足够的已提交的页面可以使用,那么它不需要将内存分页从其他状态改变为已提交状态,只需要在堆管理器中进行相关管理;如果在分配时没有足够的已提交页面供使用,那么还需要将虚拟内存分页从其他状态改变为已提交状态,在有足够的可使用的已提交页面的情况下,再由堆管理器进行相关管理。

目录
相关文章
|
5月前
|
存储 算法 关系型数据库
实时计算 Flink版产品使用合集之在Flink Stream API中,可以在任务启动时初始化一些静态的参数并将其存储在内存中吗
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
121 4
|
3月前
|
XML Ubuntu Linux
部署08---扩展-Win10配置WSL(Ubuntu)环境,WSL系统是什么意思,是Windows系统上的一个子系统, xml的一大特点是直链系统,直接链接你的CPU,硬盘和内存,如何用 WSL部署
部署08---扩展-Win10配置WSL(Ubuntu)环境,WSL系统是什么意思,是Windows系统上的一个子系统, xml的一大特点是直链系统,直接链接你的CPU,硬盘和内存,如何用 WSL部署
|
7天前
|
开发框架 .NET API
Windows Forms应用程序中集成一个ASP.NET API服务
Windows Forms应用程序中集成一个ASP.NET API服务
48 9
|
6天前
|
弹性计算 关系型数据库 数据安全/隐私保护
阿里云国际版如何配置Windows服务器的虚拟内存
阿里云国际版如何配置Windows服务器的虚拟内存
|
7天前
|
C# 开发工具 Windows
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
C# 获取Windows系统信息以及CPU、内存和磁盘使用情况
17 0
|
11天前
|
程序员 Windows
程序员必备文件搜索工具 Everything 带安装包!!! 比windows自带的文件搜索快几百倍!!! 超级好用的文件搜索工具,仅几兆,不占内存,打开即用
文章推荐了程序员必备的文件搜索工具Everything,并提供了安装包下载链接,强调其比Windows自带搜索快且占用内存少。
20 0
|
1月前
|
监控 Java 大数据
【Java内存管理新突破】JDK 22:细粒度内存管理API,精准控制每一块内存!
【9月更文挑战第9天】虽然目前JDK 22的确切内容尚未公布,但我们可以根据Java语言的发展趋势和社区的需求,预测细粒度内存管理API可能成为未来Java内存管理领域的新突破。这套API将为开发者提供前所未有的内存控制能力,助力Java应用在更多领域发挥更大作用。我们期待JDK 22的发布,期待Java语言在内存管理领域的持续创新和发展。
|
21天前
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
|
5月前
|
存储 缓存 Java
释放C盘空间:释放Windows休眠文件和关闭虚拟内存
在 Windows 11 专业版中,可以通过以下步骤来释放休眠文件(Hibernate File),以释放磁盘空间。休眠文件是系统休眠(Hibernate)功能所需要的文件,它保存了系统的当前状态,以便在休眠状态下恢复。如果你不使用休眠功能,如果因为C盘空间不足,可以考虑释放这个文件来腾出磁盘空间。
13903 1
|
5月前
|
API Python Windows
python3应用windows api对后台程序窗口及桌面截图并保存的方法
python3应用windows api对后台程序窗口及桌面截图并保存的方法
454 1