/*
达内学习 UC day25 2013-10-8
*/
cat/proc/进程ID/maps 可以察看内存页的分配
malloc()在分配内存时候,如果是小块内存,直接分配33个内存页,如果大块内存(超过32个内存页)会分配比申请的内存也稍多的内存页。
int *p = malloc(4/8/16)
free(p); //请问4/8/16 对p的位置没有影响,如何free
malloc() 在分配内存时,系统记录一些额外的信息(底层是一个双向链表),因此mallooc()的内存地址会比申请的要多一些,这些额外信息中包含了分配的字节数(free()才可以释放)
注:由于附加信息的存在,在使用malloc时,不要超过malloc和size存数据,否则存储时不错错,但后续可能出错
free()释放内存页的效果:
1,检测是否需要释放 33 内存页
2,释放对应的内存页数
3,free不一定会解除内存映射,但一定会释放虚拟内存地址
4,free到最后33的内存页时,只释放虚拟内存地址,不在解除映射,最后33页到进程结束时候,才解除映射
经验:虽然malloc(),一次会分配33个内存页,但在应用时,每次存储新变量之前需要malloc().而不是简单的指针移动
brk()/sbrk()
brk()和sbrk()是unix的系统函数,底层维护了一个位置
void* sbrk(int increment) 参数是内存分配或释放的字节数
返回值是之前的位置(指针/地址)
increment > 0 分配内存
increment < 0 释放内存
increment == 0 取当前位置
失败/出错,返回(void*) -1
内存虚拟地址的分配的分配和回收 以字节为单位, 但内存映射和解除映射以内存页(4k)为基本单位
sbrk()/brk() 是系统函数,因此处理方式和malloc()完全不同,内存超过一页就分配第二页,不足一页就释放一页 。释放所有内存,映射全部解除
int brk(void*) 可以直接指定当前的位置
返回:0 成功 -1 失败
注: 使用brk()之前最少要sbrk(0)得到初始位置
使用brk()进行内存的释放比较方便,使用sbrk()进行内存分配比较方便
mmap()/munmap() - 映射物理内存/硬盘文件 解除映射
权限的有无用二进制代表
只读 100;只写 010;只执行 001;
因此很多权限/选项用 位或 运算拼接