内存管理问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存管理问题相关的知识,希望对你有一定的参考价值。

内存管理问题

  1. 在你的系统中,你所能分配的静态数组的最大长度是多少? 使用动态分配内存,你所能分配的最大内存是多少?

    : 对于这个问题,由于静态数组是全局变量,全局变量是在数据区。数据区的大小无法确定,鉴于网上答案很多,我写程序尝试了一下,最终检验的结果是 2G。

    用户所能分配的静态数据的最大长度是2G。

    动态分配的最大内存也是2G。

    注意: 部分网友说,用户动态分配的最大内存空间应该是用户所能使用的最大用户空间也就是3G,但事实上无法到3G,通过代码检验是2G。


    系统将4G系统空间分为两部分,将高字节 0-1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址 0x00000000 -0xBFFFFFFF),供各个进程使用,称为“用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。
     Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。从图中可以看出(这里无法表示图),每个进程有各自的私有用户空间(0~3G),这个空间对系统中的其他进程是不可见的。最高的1GB字节虚拟内核空间则为所有进程以及内核所共享。
    内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。不管是内核空间还是用户空间,它们都处于虚拟空间中。
    虽然内核空间占据了每个虚拟空间中的最高1GB字节,但映射到物理内存却总是从最低地址(0x00000000)开始。对内核空间来说,其地址映射是很简单的线性映射,0xC0000000就是物理地址与线性地址之间的位移量,在Linux代码中就叫做PAGE_OFFSET。
    内核空间和用户空间之间如何进行通讯?
    内核空间和用户空间一般通过系统调用进行通信。

       动态分配内存是在堆上进行,这个视编译器决定。

2.当你一次请求分配500字节的内存时,你实际获得的动态分配的内存数量总共是多少?当你一次性请求分配5000字节的时候,又如何? 他们存在什么区别吗?

     :对于这个问题网上有一答案,但是我运行了结果不一样。给大家附代码:

#include<stdio.h>

#include<stdlib.h>

#include<maloc.h>

int main ()

{

    char *p ;

    p = (char *)mallo (500 * sizeof (char));

    printf ("%u\n", malloc_usable_size(p));

    free (p);


    p = (char *) malloc (5000 * sizeof (char));

    printf ("%u\n", malloc_usable_size(p));

    free(p);

    return 0;

}

注意: 网上给出的运行答案是 504   5000 ,  but  but  but   我运行的结果是 500  5000   ?????

           请问为什么呢???  这是为什么呢?? 难道是人品问题吗???  对于这个问题我没有答案。








以上是关于内存管理问题的主要内容,如果未能解决你的问题,请参考以下文章

STM32内存管理

STM32内存管理

操作系统页式存储管理的问题

iOS面试题之内存管理

操作系统-页式内存管理

操作系统-页式内存管理