内存空间的连续性(逻辑地址、物理地址)

本文探讨了堆分配的内存空间在逻辑地址上的连续性和物理地址的不连续性,解释了Windows下的分段分页机制,以及Linux内核如何通过虚拟内存系统进行内存管理。虽然malloc或new在虚拟地址上分配的内存看似连续,但实际物理地址可能不连续,取决于分页映射。同时,介绍了不同操作系统中内存地址的转换过程和物理内存的分配策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆分配的内存空间到底是连续的还是不连续的,如malloc/new分配的内存空间是连续的吗?

堆分配的空间在逻辑地址上是连续的,但在物理地址上是不连续的(因为采用了页式内存管理,windows下有段机制、分页机制),如果逻辑地址空间上已经没有一段连续且足够大的空间,则分配内存失败。 

堆包含一个链表来维护已用和空闲的内存块。不同进程对堆内存申请和销毁是不同步的,这就会导致一段内存区间中,部分段使用中,部分段已经空闲。

在堆上新分配(用 new 或者 malloc)内存是从空闲的内存块中找到一些满足要求的合适块。并不是只要有很多不连续的零散的小区域,总数达到申请的内存块,就可以分配。事实上必须要一整块连续的内存空间才能申请成功呢。

简要介绍Windows分段分页知识

     windows运行的几种模式,包括实模式、保护模式以及虚拟8086模式。一般操作系统运行在保护模式下,程序可以使用4G大小的虚拟空间。

逻辑地址(Logical Address)

         是由程序产生的相关的偏移地址。例如,你在进行C语言指针编程中,可以读取指针变量本身值(&操作),实际上这个值就是逻辑地址,它是相对于你当前进程数据段的地址,不和绝对物理地址相干。

       只有在Intel实模式下,逻辑地址才和物理地址相等(因为实模式没有分段或分页机制,cpu不进行自动地址换);逻辑地址也就是在Intel 保护模式下程序执行代码段限长内的偏移地址(假定代码段、数据段如果完全一样)。

        应用程序员仅需与逻辑地址打交道,而分段和分页机制对您来说是完全透明的,仅由系统编程人员涉及。应用程序员虽然自己可以直接操作内存,那也只能在操作系统给你分配的内存段操作。

线性地址(Linear Address) 

      是逻辑地址到物理地址变换之间的中间层。程序代码会产生逻辑地址(段中的偏移地址)加上相应段的基地址就生成了一个线性地址

如果启用了分页机制,那么线性地址可以再经变换以产生一个物理地址。

若没有启用分页机制,那么线性地址直接就是物理地址。Intel 80386的线性地址空间容量为4G(2的32次方即32根地址总线寻址)。

物理地址(Physical Address) 

      是指出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果地址。如果启用了分页机制,那么线性地址会使用页目录和页表中的项变换成物理地址。

       分页机制映射之后得到的地址。也就是程序代码、数据实际在内存中被加载的地址。

        如果没有启用分页机制,那么线性地址就直接成为物理地址了。

总结:Windows分段和分页机制存在的目的就是为了让逻辑地址通过分段和分页映射到物理内存中。

Linux 下面的分析

malloc分配的内存空间是连续的吗?

来源:http://blog.youkuaiyun.com/beitiandijun/article/details/9240649

1、linux内核管理内存空间的分配,所有程序对内存空间的申请和其他操作,最终都会交给内核来管理。

2、linux实现的是“虚拟内存系统”,对用户而言,所有内存都是虚拟的,也就是说程序并不是直接运行在物理内存上,而是运行在虚拟内存上,然后由虚拟内存转换到物理内存。

3、linux将所有的内存都以页为单位进行划分,通常每一页是4KB;

4、在对虚拟内存地址到物理内存地址进行转换时,内核会对地址的正确性进行检查,如果地址是合法的,内核就会 提供对应的物理内存分页;如果是申请内存空间,内核就会检查空余的物理内存分页,并加以分配,如果物理内存空间不足,内核会拒绝此次申请;

 5、使用malloc分配的内存空间在虚拟地址空间上是连续的,但是转换到物理内存空间上有可能是不连续的,因为有 可能相邻的两个字节是在不同的物理分页上;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值