连续内存分配

  物理地址空间:加载到寄存器中的地址,内存单元真正的地址,其位数由地址总线数决定,32位则表示32条地址总线,编号从0一直到可用内存的最大值。

  逻辑地址空间:CPU运行时程序可看到的地址,由内部和编程时使用,比如C语言中读取一个指针变量本身的值,读到的就是逻辑地址,它是相对于当前数据段的地址也就是偏移地址。(段基地址+偏移地址构成线性地址,线性地址通过MMU根据分页机制转化成物理地址)

 

逻辑地址的生成:

  1.编译时获取。在已知最后地址的情况下编译时直接写死地址。如果起始地址改变需要重新编译。

  2.加载时。起始地址未知下,编译时生成可重定位的代码,加载时生成绝对地址。

  3.执行时。执行到该指令时知道确切访问地址。在程序运行时可以移动内存中的地址,更灵活。

 

连续内存分配:给进程分配不小于指定大小的,物理地址连续的内存区域

 

动态内存分配:程序被加载执行时,分配一个进程大小可改变的分区

         需要维护数据结果:所有已分配分区 空闲分区

分配策略:最先分配(first-fit) 最佳分配(best-fit)最差匹配(worst-fit)

  1.最先匹配:按照地址顺序最先找到的比要求空间大的分区,可在高地址留下比较大块的分区,但容易留下外碎片,并且分配大块时速度较慢。

  2.最佳匹配:找到一个比要求大但又大的最少的分区。空闲分区列表按照大小排序,释放时和地址临近的空闲分区合并。分配尺寸较小时效果好,避免大块分区被拆分,减少外碎片的大小,但容易产生无用小碎片。

  3.最差匹配:空闲分区由大到小排,找满足要求的最大的分配。释放时与临近的空闲分区合并。中等大小分配时效果最好,避免出现太多小碎片。但释放分区慢,容易破坏大分区。

内存碎片:空闲内存不能被利用

  1.内部碎片:分配单元之间不能被使用的内存。由于内存过小,申请单元都大于该内存块,无法使用。

  2.外部碎片:分配单元内部无法使用。由于分配时取整,申请510字节实际分配了512字节,2字节无法被利用

碎片整理:

  通过调整进程占用分区位置来减少或避免分区碎片

posted @ 2016-04-09 12:15  hzxscyq  阅读(597)  评论(0编辑  收藏  举报