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

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

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

说法一:

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

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

说法二:

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

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

说法三:

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

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

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

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

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

 

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

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

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

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

 

你可能感兴趣的:(操作系统)