You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux和Windows下malloc/calloc/realloc/free对进程地址空间、页和段的影响

Linux与Windows中动态内存分配/释放对进程地址空间、页、段的影响

Linux系统下的行为

内存分配(malloc()/calloc()/realloc())

地址空间

  • 进程堆区会向高地址方向扩张:malloc/calloc直接从堆里划出一块连续的虚拟地址;realloc如果当前块后面没足够空间扩容,会在堆的新位置分配更大的块,原地址块标记为可用,同时更新指针到新地址。
  • 如果堆顶扩展超出了当前已映射的虚拟地址范围,会通过brk()或mmap()向内核申请新的虚拟地址区间——小内存用brk扩展堆,大内存(通常>128KB,不同内核版本阈值有差异)直接用mmap映射独立的虚拟区域。

页表

  • 首次访问分配的虚拟页时会触发缺页异常:内核给这个虚拟页分配物理页,更新进程页表,建立虚拟-物理地址映射;calloc因为要初始化内存为0,内核会复用零页,首次写入时才真正分配专属物理页(写时复制机制)。
  • 用mmap分配的大内存块,内核会直接创建新的虚拟内存区域(VMA),页表里先预留好虚拟页条目,等首次访问时再完成物理页映射。

段

  • Linux用的是扁平化段模型,用户空间的代码段、数据段、堆段共用一套覆盖整个用户空间的段描述符——代码段和数据段基址相同,限长拉满整个用户区。所以动态分配根本不会改动段的结构,只是在堆对应的虚拟区间里调整可用空间。

内存释放(free())

地址空间

  • 释放的内存块会被标记为堆里的空闲块,如果释放的是堆顶连续的空闲块,会通过brk()把堆顶往低地址收缩;要是释放的是中间块,只会合并相邻的空闲块形成更大的“空洞”,不会立刻收缩地址空间。
  • 如果释放的是mmap分配的内存块,会直接解除这个虚拟区域的映射,对应的虚拟地址区间变回未分配状态还给系统。

页表

  • brk分配的内存,释放后如果没收缩堆,页表条目不会立刻删——物理页可能留在缓存里,供后续分配复用;要是堆收缩了,内核会删掉对应虚拟页的页表条目,物理页标记为可用。
  • mmap分配的内存释放时,直接清除对应页表条目,物理页被回收或复用。

段

  • 还是因为扁平化段模型,释放内存不会改动段的结构,只是调整堆区内的空闲空间分布。

Windows系统下的行为

内存分配(malloc()/calloc()/realloc())

地址空间

  • Windows的C运行时(CRT)会先从进程的默认堆或自定义堆里分配虚拟地址块:malloc/calloc直接划连续块;realloc要是扩容失败,会在堆里找新的连续空间,复制原数据后释放旧块。
  • 当堆里空闲空间不够时,CRT会调用VirtualAlloc()向内核申请新的虚拟内存区域(也就是“堆提交”),扩展进程虚拟地址空间里堆对应的区间。
  • calloc会把内存初始化为0,CRT通常直接用内核提供的零初始化页,省去额外的内存写入操作。

页表

  • 分配的虚拟内存默认是**预留(reserved)状态,首次写入时触发缺页异常,内核把预留页转成提交(committed)**状态,分配物理页并更新页表映射。
  • 要是分配的是大内存块(通常>512KB),CRT可能直接调用VirtualAlloc()分配提交状态的内存,这时页表会直接建立虚拟-物理地址映射。

段

  • Windows的用户空间分代码段、数据段、堆段等,但动态内存分配只会在堆段对应的虚拟地址区间里操作,不会修改段的描述符或边界,只是调整堆内的可用空间。

内存释放(free())

地址空间

  • 释放的内存块会被标记为堆里的空闲块,CRT会尝试合并相邻的空闲块;如果释放的是堆里最后一个提交的内存块,CRT可能调用VirtualFree()把对应的虚拟区域从提交状态改成预留状态,甚至直接释放预留空间还给系统。
  • 要是释放的是CRT用VirtualAlloc()直接分配的大内存块,会直接解除虚拟地址映射,对应的区间变回未分配状态。

页表

  • 堆内的内存块释放后,如果只是标记为空闲,页表条目不会立刻删,物理页可能留在堆的缓存里;要是通过VirtualFree()释放提交状态,内核会删掉对应页表条目,物理页被回收。
  • 直接释放VirtualAlloc()的内存时,页表条目会立即清除,物理页还给系统。

段

  • 和Linux类似,动态内存释放不会改动段的结构,只是调整堆区内的空闲空间分布。

内容的提问来源于stack exchange,提问作者skm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:26:03