25,UC(04) .

/*
 达内学习 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;
因此很多权限/选项用 位或 运算拼接

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值