Unix C学习笔记5 内存管理,内存映射的建立与解除,系统调用

内存管理

malloc会调用sbrk/brk,相当于封装

sbrk/brk会调用mmap/munmap。。。层层封装

内存映射的建立与解除

mmap

头文件路径为bin/include/x86/sys/mman.h

start:一般给空NULL,系统自动指定,如果自己指定不知道哪些内存能用哪些不能用

length:一页为4096个字节,4kB

PRIVATE与SHARED二选一

munmap

映射两页8kB内存,成功存入

成功输出

解除第一个页的映射,第二页还能使用

解除第二页的映射后,同样访问不了第二页,段错误

虚拟内存的分配和释放

sbrk

前提:已经完成一个页的映射

堆尾指针往上移,内存增大,移出当前已映射范围后,sbrk函数会自动映射一个新的页

堆尾指针往下移,内存释放,从新的页往下移动到旧的页后,sbrk函数会自动解除新页的映射

ubuntu12.04:堆尾指针一开始的位置与第一个返回值(位置)相同

12.04以后堆尾指针一开始的位置与第一个返回的位置差33个页

brk

brk只能用来分配内存,需要用sbrk来获取当前堆尾的地址

系统调用

标准库函数malloc free底层会调用 系统调用函数mmap munmap

间接/直接调用 系统调用函数时,内核就要工作,工作在内核态上

在程序中操作没有调用系统调用函数时,程序执行在底下3G的用户态上

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值