linux学习---内存管理以及结存结构描述
2017-10-08 20:27
337 查看
一.此部分从从一段很简单的程序和一个问题问题开始程序如下:#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
int a1 = 10;
int a2 = 20;
int a3 = 30;
int *p1 = malloc(4);
int *p2 = malloc(4);
int *p3 = malloc(4);
printf("[pid%d]\n",getpid());
printf("a1 %p\n",&a1);
printf("a2 %p\n",&a2);
printf("a3 %p\n",&a3);
printf("p1 %p\n",p1);
printf("p2 %p\n",p2);
printf("p3 %p\n",p3);
while(1);
}
运行结果如下
提两个问题:1. 为什么a1,a2,a3地址只相隔4个byte,而p1,p2,p3也是申请了4个byte,地址相隔却相隔16个byte?2. 各种变量(EX:全局,局部,const,static)分别在程序中的那个位置二.第一个问题主要是延伸出来第一个问题点,malloc怎样分配空间?先来看一个程序#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
int *p1 = malloc(4);
int *p2 = malloc(4);
int *p3 = malloc(4);
printf("[pid%d]\n",getpid());
*p1 = 1;
*(p1+1) = 2;
*(p1+2) = 3;
*(p1+3) = 4;
*(p1+4) = 5;
*(p1+5) = 6;
*(p1+6) = 7;
*(p1+7) = 8;
printf("%d\n",*p2);
while(1);
}
运行结果如下
怎么会是5呢,其实很简单,看图就一眼明白
但是胡乱更改malloc部分后,再free会如下
也就是说我们已经把malloc的结构已经修改了,造成释放错误所以总结一个结论:malloc使用一个数据结构(链表)维护分配空间链表的构成:分配的空间/上一个空间数据/下一个空间/空间大小等信息.三.第二个问题其实延伸出来另外一个重要的问题:Linux对内存的结构描述首先看一个程序#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int add(int a, int b)
{
return a+b;
}
int a1 =1;
staticint a2 = 2;
const inta3 = 3;
int main()
{
int b1 = 4;
static int b2 = 5;
const int b3 = 6;
int *p1 = malloc(4);
printf("pid %d\n",getpid());
printf("a1:%p\n",&a1);
printf("a2:%p\n",&a2);
printf("a3:%p\n",&a3);
printf("b1:%p\n",&b1);
printf("b2:%p\n",&b2);
printf("b3:%p\n",&b3);
printf("p1:%p\n",p1);
printf("main:%p\n",main);
printf("add:%p\n",add);
while(1);
}
程序运行如下图
通过程序打印发现pid为4733,所以通过maps看下,通过命令查看
我们发现:全局变量a1在全局区static修饰的全局变量a2也在全局区const修饰的全局变量a3在代码区(竟然在代码区~~~)局部变量b1在栈区static修饰的局部变量b2在全局区const修饰的局部变量b3在栈区malloc申请的内存毫无疑问在堆区main和add函数也是毋庸置疑的,在代码区
#include <stdlib.h>
#include <unistd.h>
int main()
{
int a1 = 10;
int a2 = 20;
int a3 = 30;
int *p1 = malloc(4);
int *p2 = malloc(4);
int *p3 = malloc(4);
printf("[pid%d]\n",getpid());
printf("a1 %p\n",&a1);
printf("a2 %p\n",&a2);
printf("a3 %p\n",&a3);
printf("p1 %p\n",p1);
printf("p2 %p\n",p2);
printf("p3 %p\n",p3);
while(1);
}
运行结果如下
提两个问题:1. 为什么a1,a2,a3地址只相隔4个byte,而p1,p2,p3也是申请了4个byte,地址相隔却相隔16个byte?2. 各种变量(EX:全局,局部,const,static)分别在程序中的那个位置二.第一个问题主要是延伸出来第一个问题点,malloc怎样分配空间?先来看一个程序#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int main()
{
int *p1 = malloc(4);
int *p2 = malloc(4);
int *p3 = malloc(4);
printf("[pid%d]\n",getpid());
*p1 = 1;
*(p1+1) = 2;
*(p1+2) = 3;
*(p1+3) = 4;
*(p1+4) = 5;
*(p1+5) = 6;
*(p1+6) = 7;
*(p1+7) = 8;
printf("%d\n",*p2);
while(1);
}
运行结果如下
怎么会是5呢,其实很简单,看图就一眼明白
但是胡乱更改malloc部分后,再free会如下
也就是说我们已经把malloc的结构已经修改了,造成释放错误所以总结一个结论:malloc使用一个数据结构(链表)维护分配空间链表的构成:分配的空间/上一个空间数据/下一个空间/空间大小等信息.三.第二个问题其实延伸出来另外一个重要的问题:Linux对内存的结构描述首先看一个程序#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
int add(int a, int b)
{
return a+b;
}
int a1 =1;
staticint a2 = 2;
const inta3 = 3;
int main()
{
int b1 = 4;
static int b2 = 5;
const int b3 = 6;
int *p1 = malloc(4);
printf("pid %d\n",getpid());
printf("a1:%p\n",&a1);
printf("a2:%p\n",&a2);
printf("a3:%p\n",&a3);
printf("b1:%p\n",&b1);
printf("b2:%p\n",&b2);
printf("b3:%p\n",&b3);
printf("p1:%p\n",p1);
printf("main:%p\n",main);
printf("add:%p\n",add);
while(1);
}
程序运行如下图
通过程序打印发现pid为4733,所以通过maps看下,通过命令查看
我们发现:全局变量a1在全局区static修饰的全局变量a2也在全局区const修饰的全局变量a3在代码区(竟然在代码区~~~)局部变量b1在栈区static修饰的局部变量b2在全局区const修饰的局部变量b3在栈区malloc申请的内存毫无疑问在堆区main和add函数也是毋庸置疑的,在代码区
相关文章推荐
- Linux学习总结—启动、内存结构和管理
- linux进程存储管理--进程内存结构
- Linux的内存结构以及动态申请的几个函数
- 轻松学习Linux之认识内存管理机制
- 【linux学习笔记之一】linux系统目录结构以及常用系统命令
- linux进程存储管理--进程内存结构
- 菜鸟学习linux笔记与练习-----一些初级命令以及基本用户管理
- [20150513]Linux远程登陆管理以及Vim的学习
- Linux运维学习历程-第六天-Linux用户、组以及权限管理
- Linux内核驱动学习(四)----内存管理子系统
- Linux学习日志day2 Part1——搭建freeIPA服务器实现用户管理以及SSH服务远程登录
- 小白学习大数据之路第一部分——基本指令以及linux的目录结构说明
- 【2015/10/17】Linux 逻辑卷管理以及C学习日志_Day7 编译步骤,注释,mystrcpy
- Accelerated C++学习笔记 5 管理内存和低级数据结构
- Linux学习总结—内存结构、启动和进程空间
- 轻松学习Linux之认识内存管理机制
- 学习日志---linux进程管理与结构
- Linux学习总结—内存结构、启动和进程空间
- Linux学习总结—内存分段和分页管理
- Linux内存管理机制学习-1