您的位置:首页 > 运维架构 > Linux

linux高级编程 - 前言&内存管理

2017-09-04 01:02 537 查看
杨强 linux高级编程 day01 am

程序员的基本素养:进程管理、内存管理、文件系统管理、IO、(设备驱动)

应用:数据库、网络、UI、openGL、shell等等

内存管理

层次:

1. 硬件层次:内存结构管理(段页管理)

2. 内核层次:内存映射、堆扩展

3. 语言层次:c语言 malloc c++:new

4. 数据结构层次:STL、智能指针

STL内存托管存在的问题:

对多线程的支持存在问题

对共享内存存在问题

格式控制符“%p”中的p是pointer(指针)的缩写。

指针的值是语言实现(编译程序)相关的,但几乎所有实现中,指针的值都是一个表示地址空间中某个存储器单元的整数。printf函数族中对于%p一般以十六进制整数方式输出指针的值,附加前缀0x。

程序示例1

#include <stdio.h>
#include <stdlib.h>
main()
{
int *p1 = malloc(4);
int *p2 = malloc(4);
int *p3 = malloc(4);
int *p4 = malloc(4);
int *p5 = malloc(4);
int *p6 = malloc(4);
printf("%p\n", p1);
printf("%p\n", p2);
printf("%p\n", p3);
printf("%p\n", p4);
printf("%p\n", p5);
printf("%p\n", p6);
}


输出:

0x234e010

0x234e030

0x234e050

0x234e070

0x234e090

0x234e0b0

问题:我们malloc分配的是4个字节,为什么结果是16个字节?

参考

关于C语言的malloc函数以及内存泄漏的问题

malloc 函数详解

malloc的原型:(void *)malloc(int size)
malloc函数的返回值是一个void类型的指针,参数为int类型的数据,即申请分配的内存大小,单位是字节。内存分配成功之后,malloc函数返回这块内存的首地址,你需要一个指针来接受这个地址


内存越界将会出现的严重问题!!

内存越界分析与解决办法

http://blog.csdn.net/jaymade/article/details/6589566

改为 c++

#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p1 = new int;
int *p2 = new int;
int *p3 = new int;
int *p4 = new int;
int *p5 = new int;
printf("%p\n", p1);
printf("%p\n", p2);
printf("%p\n", p3);
printf("%p\n", p4);
printf("%p\n", p5);

return 0;
}


输出:
0x2299c20
0x2299c40
0x2299c60
0x2299c80
0x2299ca0


问题:

malloc怎么分配空间?

malloc与new的关系?

Linux对内容的描述

/proc/${pid}/ 存放进程运行时所有的信息

一个小程序

main(){
while(1);
}








整个程序运行的内存结构



结论

任何程序的内存空间分成4个基本部分

1. 代码区 (地址基本是固定的)

2. 全局栈区

3. 堆

4. 局部栈

程序加载器 ld-linux.so.2



深入理解LINUX下动态库链接器/加载器ld-linux.so.2

http://blog.csdn.net/elfprincexu/article/details/51701242

所以要执行程序,也可以通过

/lib/ld-linux.so ./test
# 我在ubuntu上是
# /l/lib64/ld-linux-x86-64.so.2 ./test


程序示例

#include <stdio.h>
#include<stdlib.h>
#include<unistd.h>

int add(int a, int b){
return a+b;
}
int a1 = 1;
static int a2 = 2;
const int a3 = 3;

main(){
int b1 = 4;
static int b2 = 5;
const int b3 = 6;

int *p1 = malloc(4);
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);

printf("%d\n", getpid());
while(1);
}


结果



各个变量的地址



结论

1. 内存分4个区
2. 各种变量有对应的存放区
3. 堆栈是一种管理内存的数据结构


理解malloc的工作原理

malloc使用一个数据结构(链表)维护分配空间

链表的构成:分配的空间/上一个空间/下一个空间/空间大小等信息

对malloc分配的空间不要越界访问,因为容易破坏后台维护结构,导致malloc/free/calloc/realloc不正常工作

C++的 new 与 malloc 的关系

malloc new new[]

realloc ??

calloc ??

free delete delete[]?

结论:new的实现使用的是malloc来实现的。

区别:new使用malloc后,还要初始化空间

基本类型:直接初始化成默认值

UDT类型(结构体等用户自定义类型):调用构造器

delete通过调用free实现:delete负责调用析构函数,然后再调用free

new与new[]的区别:new只调用一个构造器,new[] 会循环地对每个区域调用构造器

delete与delete[]的区别

函数调用栈空间的分配与释放
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: