7.Linux/Unix 系统编程手册(上) -- 内存分配

1.在堆上分配内存
	  进程可以通过增加堆的大小来分配内存,所谓的堆是一段长度可变的连续虚拟内存,始于进程的未初始化数据段的末尾。
	随着内存的分配和释放而增减。通常将堆的当前内存边界称为"program break"。

2.调整 program break: brk() 和 sbrk()
	  改变堆的大小(即分配和释放内存),其实就像命令内核改变进程的 program break 位置一样简单。最初,program break
	正好位于未初始化数据段末尾之后,与 &end 相同。
	  在 program break 的位置抬升后,程序可以访问新分配区域的任何内存地址,而此时物理内存尚未分配。内核会在进程首次
	试图访问时,自动分配新的物理内存页。

3.在堆上分配内存: malloc() 和 free()
	  C语言使用 malloc 函数族在堆上分配和释放内存。较之 brk() 和 sbrk() ,优点:
	  1.属于C语言标准的一部分
	  2.更易于在多线程程序中使用
	  3.接口简单,允许分配小块内存
	  4.允许随意释放内存,它们被维护于一张空闲内存列表中,在后续内存分配调用时循环使用

4.malloc() 和 free() 的实现
	  malloc : 它首先会扫描之前由 free() 释放的空闲内存列表,以求找到尺寸大于或者等于要求的一块内存空间。如果这一内存块
	正好与要求相当,就把它直接返回给调用者,如果是一块较大的内存块,那么将对其分割。
	  如果在空闲块内存列表中根本找不到足够大的内存块,那么 malloc 会调用 sbrk() 以分配更多的内存。为减少对 sbrk() 的调用,
	malloc 并未只是严格按照所需字节数来分配内存,而是以更大的幅度来增加 program break ,并将超出的部分至于空闲内存表中。
	  free() 的实现:当 free 将内存块至于空闲列表之上时,是如何知晓内存块大小的?这是通过一个小技巧实现的。当 malloc 分配
	内存块时,会额外分配几个字节来存放记录这块内存块的大小的整数值。该整数值位于内存块的起始处,而实际返回给调用者的内存地址恰好
	位于这一长度记录字节之后。

brk();
sbrk();
malloc();
free();
mtrace();
muntrace();
mcheck();
mprobe();
mallopt();
mallinfo();
calloc();
realloc();
memalign();
posix_memalign();
alloca();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值