操作系统的内存管理机制 -- 序

今天在工作上遇到一个问题,malloc 申请失败。在讨论的过程中引出 malloc 申请的地址是否是连续的问题。据此进行学习与记录。

通过网上查阅的信息,主要解析如下:

说法一:

malloc出来的空间,只是在虚拟内存中是连续的。而从实际的物理空间到虚拟内存空间还有一个映射的关系。这个映射是由操作系统来控制的,一般情况下,从虚拟地址无法反查到物理地址。对于连续的虚拟地址空间,也就无法得知是否物理连续。但由于映射的不确定性,当申请一段内存空间,尤其是比较大的内存长度情况下,物理地址不连续的可能性还是相当大的。

事实上,大多数的编程不需要关注物理空间是否连续。

说法二:

1、线性地址空间是连续的,对于物理地址空间,可以不连续,所以物理地址可能不连续
对于程序员看到的是虚拟地址空间,这个应该是连续的。

2、malloc申请的空间是在执行的时候由内存池分配的连续空间,这块空间是系统自动分配的,一般是够用的,如果不够用或者内存池为空的话,malloc返回的指针为空。使用malloc分配的内存空间在虚拟地址空间上是连续的,但是转换到物理内存空间上有可能是不连续的,因为有可能相邻的两个字节是在不同的物理分页上。

说法三:

不连续的,malloc是哪里有空闲内存,就往哪里找地址。 如果要的内存不大,就很可能连续。
大的地址的话,不连续的可能性就很大。

只能保证虚拟地址空间连续,物理空间取决于MMU的映射,如果一页内的话是连续的,超过一页那么不一定

其实我觉得 说法三 抛出了一个 概念,系统的 MMU 映射。一般系统分为两种,实时操作系统和非实时操作系统。

主要代表就是 Linux 和 ucos。当然我们提出 “malloc 申请的内存是否连续” 这个问题,应该建立在系统的基础上,明确是在哪一个系统上进行操作。因为每个系统的底层实现都不相同,所以我们对这个问题一概而论没有意义。

因此我们应该分析 各个系统的内存管理机制,以及给我们的 api 接口。

 

一、Linux 系统的内存管理机制;

二、Windows系统的内存管理机制;

三、ucos系统的内存管理机制;

四、FreeRTOS系统的内存管理机制;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值