Linux--内存结构
首先看一串代码
#include <stdio.h>
#include <stdlib.h>void main(){int *p1 = (int *)malloc(4);int *p2 = (int *)malloc(4);int *p3 = (int *)malloc(4);int *p4 = (int *)malloc(4);printf("p1 = %p\n",p1);printf("p2 = %p\n",p2);printf("p3 = %p\n",p3);printf("p4 = %p\n",p4);
}
可见每次开辟的空间之间间隔16字节(p2-p1等于16字节),而每次开辟的空间明明只有4字节,多余的12字节从何而来?
原因在于,malloc开辟的内存空间位于堆,堆是由链表维护的,链表的每个结点(结构体)由两部分组成:“数据部分”、“控制部分”。所以对于上面的情况多余的12字节来自于控制部分,并与内存对齐有关。控制部分主要包括上一个结点的地址、下一个结点的地址、当前结点的空间大小等。
在Linux系统中,运行着一个进程,会在"/proc/进程ID"下保存进程运行时所有的信息,进程结束时该文件夹会自动删除。
Linux的内存结构可以分为以下几个部分。
代码段、数据段、BSS段、堆、栈
对于一个空的main函数:
#include <stdio.h>
#include <stdlib.h>void main(){}
通过size命令查看可执行文件,可以查看代码段、数据段、BSS段的数据的情况
现在在代码中插入一个局部常量
#include <stdio.h>
#include <stdlib.h>
void main(){
const int a = 3;
}
没有变化,因为局部常量位于局部栈中。
在代码中插入一个全局常量
#include <stdio.h>
#include <stdlib.h>const int b = 3;
void main(){
}
代码段增加了4个字节变成1037,所以全局常量位于代码段。
#include <stdio.h>
#include <stdlib.h>int a=1;
static b=2;
const int c = 3;void fun(){
}void main(){int a1 = 1;static int b1 = 2;const int c1 = 3;printf("a = %p\n",&a);printf("b = %p\n",&b);printf("c = %p\n",&c);printf("a1 = %p\n",&a1);printf("b1 = %p\n",&b1);printf("c1 = %p\n",&c1);printf("fun = %p\n",fun);printf("main = %p\n",main);
}
查看/proc目录下进程中的maps文件
总结:
代码区:存放的CPU的机器指令、全局常量、字符串常量。
数据段:存储初始化的全局变量、静态变量。
BSS段:未初始化的全局变量、静态变量。
堆:动态开辟的内存空间。低地址向高地址扩展
栈:局部变量、局部常量。高地址向低地址扩展
malloc与new的区别:
new的实现是利用malloc,但是在malloc后会初始化空间。
如果是基本数据类型,直接初始化为默认值
如果是UDT,调用对应的构造函数进行初始化。
与内存分配有关的函数:
(1)malloc:
(2)void * calloc(int count , int size):count为元素个数,size为每个元素的大小。分配count*size字节的空间,并初始化。
(3)alloca:原型类似malloc,但在栈中分配空间、
(4)void * realloc(void * ptr , int new_size): 修改已经配置好的内存空间大小,ptr为待修改的空间地址,new_size为新的内存大小。
若内存减少:则直接返回ptr,内存空间大小变为new_size
若内存增加:若后续空间足够,则返回ptr,内存空间变为new_size。若后续空间不足,则寻找第一个能够满足条件的空间,并将数据拷贝到新内存空间,返回新空间地址。
注:ptr = realloc(ptr , new_size)是不对的,如果分配失败,ptr变为NULL,则原空间不能访问。
转载于:https://www.cnblogs.com/xiaogua918/p/4181547.html
Linux--内存结构相关推荐
- linux内存管理窥探10,Linux 内存管理窥探(2):内存模型
讨论内存的模型之前需要先聊一下两种计算机架构:UMA 和 NUMA UMA 称为均匀存储器存取(Uniform-Memory-Access) : 物理存储器被所有处理机均匀共享.所有处理机对所有存储字 ...
- linux文件夹前的描述,Linux对内存结构的描述
Linux对内存结构的描述 1.查看Linux程序运行时状态 Linux在运行可执行文件时,该状态信息全部在/porc/${PID}中. proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外 ...
- Linux下的进程内存结构
Linux下的进程内存结构 虚拟内存管理 Linux操作系统采用虚拟内存管理技术,使得每个进程都有独立的地址空间,该地址空间大小为4GB的线性虚拟空间,用户所看到和接触到的都是该虚拟地址,无法看到实际 ...
- Linux内存技术分析(上)
Linux内存技术分析(上) 一.Linux存储器 限于存储介质的存取速率和成本,现代计算机的存储结构呈现为金字塔型.越往塔顶,存取效率越高.但成本也越高,所以容量也就越小.得益于程序访问的局部性原理 ...
- 嵌入式linux内存使用和性能优化
这本书有两个关切点:系统内存(用户层)和性能优化. 这本书和Brendan Gregg的<Systems Performance>相比,无论是技术层次还是更高的理论都有较大差距.但是这不影 ...
- Windows内存管理和linux内存管理
windows内存管理 windows 内存管理方式主要分为:页式管理,段式管理,段页式管理. 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页:页式管理把内存空间按照页的大小划分成片或 ...
- 简述Linux目录结构和系统结构
提到 GNU/Linux 系统的目录结构,不得不说一下FHS(Filesystem Hierarchy Standard,文件系统层次结构标准),正是这一标准的存在,详细的定义了类 Unix 操作系统 ...
- 万字长文,别再说你不懂Linux内存管理了(合辑),30 张图给你安排的明明白白...
之前写了两篇详细分析 Linux 内存管理的文章,读者好评如潮.但由于是分开两篇来写,而这两篇内容其实是有很强关联的,有读者反馈没有看到另一篇读起来不够不连贯,为方便阅读这次特意把两篇整合在一起,看这 ...
- 别再说你不懂Linux内存管理了,10张图给你安排的明明白白!
来自:后端技术学堂 过去的一周有点魔幻,有印象的有三个新闻:天猫总裁绯闻事件,蘑菇街裁员,不可能打工的周某也放出来了.三件事,两件和互联网行业相关,好像外面的世界很是精彩啊!吃瓜归吃瓜,学习还是不能落 ...
- 转:JAVA常见错误处理方法 和 JVM内存结构
OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...
最新文章
- List集合中的对象根据属性排序
- linux系统调用理解之摘录(3)
- eclipse web项目 解决“Dynamic Web Module 3.0 requires J
- linux系统 opt扩容,Linux虚拟机新增加了块100G硬盘后,把空间分配到/opt下
- 利用 Selenium 自动化 web 测试
- 【excrt】屠龙勇士(luogu 4774)
- 重写equals方法(未完)
- 小数据作为解题关键:
- Python 基础总结
- php不使用框架,导出Excel,这里有代码,全解
- 微信小程序快速提升独立访客方法
- 大写阿拉伯数字1到10(大写阿拉伯数字1到10千百万)
- 基于华为云服务器Docker nginx安装和配置挂载
- 从“快稳省安全”看Chromium——Chromium学习系列
- 抖音java表白教程_抖音最火套路情话,深情感人,表白专用!
- 项目1:Ego微商小程序
- PHP 将大量数据导出到 Excel 的方法
- 十大家用投影仪排名,什么牌子的投影仪质量最好?
- 光伏储能联合运行的直流微电网matlab/simulink 光伏+MPPT控制 储能系统双向DCDC充放电控制
- 旅行时间和花费c语言编程,C语言顺序结构
-C语言计算旅行花费(附带源码)