内存管理
内存管理
1 基本概念:
虚拟地址:
对于32位机器一页为4K,如果虚拟地址0xb700
1000~0xb700 1fff是一个页,可能被 MMU映射到物理地址0x2000~0x2fff,CPU是不会直接访问内存的,只能通过虚拟地址访问
详情参考http://blog.csdn.net/iqian1314/article/details/5641458
进程与程序的区别:
程序是保存在磁盘上的可执行文件,进程是运行程序是,把程序加载到内存中的映 像。一个程序可以包含多个进程
进程在内存中的分配情况,5个段的情况怎么分配的:
对任何一个进程都可能在内存中涉及到下列5个段:段、堆、BSS、数据段、代码段 以下以一个简单图式说明 参考
http://www.cnblogs.com/autum/archive/2012/10/12/linuxmalloc.html
stack:函数内部局部变量的存储单元,函数执行完后自动释放,局部变量
heap:动态分配的内存空间,使用后必须手动释放,并且将指针指向NULL
使用函数malloc、 new、brk、sbrk、free、
bss:未初始化全局变量
data:已初始化的全局变量
1.1
static的使用:
全局变量前面:全局变量就被定义成为一个全局静态变量
局部变量前面:局部静态变量
2者区别:局部变量加上static后会从堆到栈区但是我们不能对它进行访问
静态函数: 函数的定义和声明默认情况下是extern的,但静态函数只是在声明 文件当中可见,不能被其他文件所用
1.2 字符串的操作 3种形式
1.2.1 字面值: “abc”
1.2.2 字符指针: char *str
1.2.3 字符数组: char str[]
2
动态分配内存 malloc/calloc/realloc的使用
#include <stdlib.h>
void *malloc(size_t size)
void free(void *ptr)
void *calloc(size_t,size_t size)
void *realloc(void *ptr,size_t size)
2.1 malloc返回开辟堆空间首地址,并且第一次至少开辟33页空间,后面就逐渐减少
2.2 callloc 连续开辟n块空间大小
2.3
realloc 重新开辟内存空间,ptr:要改变内存大小的指针名 size:新的大小
返回值:新开辟内存空间的首地址
3
U/C中关于内存管理相关函数
#include <unistd.h>
int brk(void *addr)
void *sbrk(intptr_t increment)
3.1
brk/sbrk:改变的是堆区 program break 的位置指针所指向的区域
通过该指针位置的移动实现内存的分配和回收,malloc底层调用了brk/sbrk
而sbrk调用了brk,brk是系统调用
3.2
一般模式: 先使用sbrk(0) 获得program break 再使用 brk(n)改变它来开辟或者释放内存
注意: sbrk返回的是改变之前的program break 的值
4
mmap / munmap的使用
#include <sys/mman.h>
void *mmap(void *addr,size_t length, int prot,int flags,int fd,off_t offset);
addr:映射首地址一般取 0
length:要分配内存大小
prot:分配内存权限: PROT_READ (读) |
PROT_WRITE(写)
flags:标识: MAP_SHARED(共享) MAP_PRIVATE(私有)
MAP_ANONYMOUS(映射物理内存,不加该选项默认映射文件)
fd:文件描述符,在映射文件时有用 offset:文件的偏移量:指定文件从哪里开始
返回值:映射成功返回映射首地址
int munmap(void *addr,size_t length);
addr: 要释放内存的首地址 length:释放内存长度
返回值: 0成功 -1失败
4.1 mmap是在栈区之上分配,比malloc sbrk 等灵活

浙公网安备 33010602011771号