虚拟内存 -- 动态内存分配

2018-07-20  创建人:Ruo_Xiao
邮箱:xclsoftware@163.com

一、动态内存分配器

  1. 显式分配器,要求显式地释放任何已分配的块。
    栗子:malloc和free,new和delete。
  2. 隐式分配器(垃圾收集器),要求分配器检测一个已分配块何时不再被程序所使用,那么就释放这个块。自动释放未使用的已分配的块的过程叫做垃圾收集

二、虚拟内存中动态分配的内存的位置

这里写图片描述

  1. 动态内存分配器维护着一个进程的虚拟内存区域,称为堆(heap)。
  2. 内核维护着一个变量brk(读作“break”),他指向堆的顶部。
  3. 分配器将堆视为不同大小的块(block)的集合来维护。每个块都是一个连续的虚拟内存片(chunk),要么是已分配的,要没是空闲的

三、分配器要求和目标

要求
1、起始地址必须是某个数的倍数。
栗子:
32bit模式下,malloc返回的块的地址总是8的倍数。
64bit模式下,malloc返回的块的地址总是16的倍数。
2、内存块的大小。
必须是该数据类型所占大小的整数倍。
栗子:

    int *p = (int *)malloc(3);

其p指向的块的大小4个字节。(3+1)

3、处理任意请求序列。
4、立即响应请求。
5、不修改已分配的块。
目标

  1. 最大化吞吐率:单位时间内完成的请求数。
  2. 最大化内存利用率。

四、碎片

  1. 内部碎片:在一个已分配的块比有效载荷大时发生的,即:已分配块的大小和它们有效载荷大小之差的和。
  2. 外部碎片:当空闲内存合计起来足够满足一个分配请求,但是没有一个单独的空闲快足够大可以来处理这个请求时发生的。
    注:有效载荷,即:程序员要分配的内存大小。

(SAW:Game Over!)

猜你喜欢

转载自blog.csdn.net/itworld123/article/details/81191474