内存管理问题数组
在你的系统中,你所能分配的静态数组的最大长度是多少? 使用动态分配内存,你所能分配的最大内存是多少?
ide
: 对于这个问题,因为静态数组是全局变量,全局变量是在数据区。数据区的大小没法肯定,鉴于网上答案不少,我写程序尝试了一下,最终检验的结果是 2G。spa
用户所能分配的静态数据的最大长度是2G。进程
动态分配的最大内存也是2G。内存
注意: 部分网友说,用户动态分配的最大内存空间应该是用户所能使用的最大用户空间也就是3G,但事实上没法到3G,经过代码检验是2G。
ci
系统将4G系统空间分为两部分,将高字节 0-1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址 0x00000000 -0xBFFFFFFF),供各个进程使用,称为“用户空间)。由于每一个进程能够经过系统调用进入内核,所以,Linux内核由系统内的全部进程共享。因而,从具体进程的角度来看,每一个进程能够拥有4G字节的虚拟空间。
Linux使用两级保护机制:0级供内核使用,3级供用户程序使用。从图中能够看出(这里没法表示图),每一个进程有各自的私有用户空间(0~3G),这个空间对系统中的其余进程是不可见的。最高的1GB字节虚拟内核空间则为全部进程以及内核所共享。
内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据。无论是内核空间仍是用户空间,它们都处于虚拟空间中。
虽然内核空间占据了每一个虚拟空间中的最高1GB字节,但映射到物理内存却老是从最低地址(0x00000000)开始。对内核空间来讲,其地址映射是很简单的线性映射,0xC0000000就是物理地址与线性地址之间的位移量,在Linux代码中就叫作PAGE_OFFSET。
内核空间和用户空间之间如何进行通信?
内核空间和用户空间通常经过系统调用进行通讯。编译器
动态分配内存是在堆上进行,这个视编译器决定。it
2.当你一次请求分配500字节的内存时,你实际得到的动态分配的内存数量总共是多少?当你一次性请求分配5000字节的时候,又如何? 他们存在什么区别吗?
内存管理
:对于这个问题网上有一答案,可是我运行告终果不同。给你们附代码:io
#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 ?????
请问为何呢??? 这是为何呢?? 难道是人品问题吗??? 对于这个问题我没有答案。