`
simohayha
  • 浏览: 1387045 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

常用的内存管理算法的简要介绍

阅读更多
主要是介绍一下常用的内存管理算法以及相关的数据结构.

三种类型:
1 sequential fit

包括first fit,next fit,以及best fit

这种算法的实现基本来说都是基于一个双向链表或者循环链表来保存所有的free memory.而且一般都会使用kunth的boundary tag算法来合并临近的内存(这个算法可以去网上搜索下,这里就不介绍了).

其中free block的顺序一般为FIFO,LIFO或者address order(AO).

而从free list中分配block则有三种方法. 第一种 就是 first fit,也就是从头开始搜索,找到第一个可以满足请求大小的block. 第二种是next fit,它是从最后一次搜索停止的地方开始搜索,找到下一个满足请求大小的block.
第三种是best fit,它是每次都是遍历list,然后找到满足请求大小的最小的那个block.

fist fit : 当找到的block比请求的大的话,就分割这个block将剩余的插入到free list中.我们可以看到,这样的话会使得前面的block越来越小,从而导致每次搜索都会越来越远.

next fit: 可以看做是优化版的 first fit.

best fit: 它是从生成的内存碎片来看,最好的一种策略,因为它会产生最小的碎片.可是由于它会每次遍历所有block,所以它的效率比较低.为了解决它的碎片问题,那就是每次提交给请求者的内存都会大于等于它的请求值.不过这样会导致内存浪费. 而segreganted fit算法可以看做是best fit的一种很好的补充(下面会介绍这个算法).


2 segreganted free list

这种数据结构其实也就是将相同大小的block放在一个链表,然后将将这些链表再组合成一个链表或者数组(可以看到memcached也就是用的这种算法).当请求到来时,从最合适的size大小的链表中取得一个block.而一般block的大小都是2的次幂.比如2,4,8等等.

segreganted fit算法

也就是当请求到来时,会将每次提交的值按一定的规则对齐,然后从free list搜索的话就按对齐后的这个值来搜索,一般都是先从数组或者链表中去的当前的size class然后再在这个size class中搜索可用的block(memcached也就是使用的这种内存管理算法).


3 buddy system

包括binary buddy和double buddy.

buddy system可以说是segreganted free list的一个变体.它只不过提供了一个受限制的但是高效的分割和组合内存块的算法.在一个简单的buddy结构中,整个内存堆被分为两个块,这两个块就称作一对buddy.而当内存请求到来时,它会像segreganted free list中处理的那样,先将请求大小对齐,然后再递交给buddy system.将会不断地平均切割内存,直到得到一个最小的满足请求的大小的块.而当内存块被释放时,它会尝试合并内存块,而合并内存块的话,一个内存块只能和它的buddy合并.


可以看下面的图:





binary buddy

这个是最简单的也是最流行的,所有的buddy大小都是2的次幂,然后每次分割都是将一个块分为相等的两个块.这个缺点就是容易造成内存碎片.

Fibonacci buddy

和binary buddy 类似,只不过buddy大小是按Fibonacci排列(16, 32, 48, 80, 128, 208...)

double buddy

这个它会使用两个buddy system,比如一个是按binary buddy(2,4,8,16...)而另一个则使用2的倍数并且起始数是一个不同的值(3,6,12....).当请求到来,会选择一个最合适的块.这个会很大的降低内存碎片.

通过这个解决方法我们也可以在segreganted fit中使用,也就是我们可以提供两种机制,也就是每次提供一对内存块给请求,然后选择最合适的(可以试下改进memcached).



  • 大小: 41.9 KB
分享到:
评论

相关推荐

    操作系统实验报告 模拟内存管理

    Linux文件操作与内存管理算法模拟 1、实验目的: 1) 熟悉LINUX文件系统; 2) 通过编写文件操作的程序,进一步掌握操作系统的文件管理机制。 3) 模拟内存管理算法的实现方法; 4) 掌握简单的用户接口(字符菜单)...

    进程调度算法、内存管理算法、银行家算法(Java实现),可用于课设.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    C#伙伴算法虚拟内存管理系统

    C#图形界面,基于linux伙伴算法,对虚拟内存管理。包含可视化窗格,界面简单易懂

    动态分区管理----用C语言(也可以用Java)实现采用首次适应算法的内存分配和回收过程。

    实现首次适应算法的内存分配函数alloc_mem(int len),其中的参数为所申请的内存空间的长度,函数返回值为所分配到的内存空间的起始地址,分配时优先将空闲区的低端部分分配出去,如果空闲区较大,则留下的高端部分仍...

    内存管理内存管理内存管理

    本文将介绍手工的、半手工的以及自动的内存管理实践的基本概念。 追溯到在 Apple II 上进行汇编语言编程的时代,那时内存管理还不是个大问题。您实际上在运行整个系统。系统有多少内存,您就有多少内存。您甚至...

    模拟内存分配的简单算法

    C++编写的模拟内存分配的简单算法 可在turbo C下运行

    TensorFlow内存管理bfc算法实例

    tensorflow设备内存管理模块实现了一个best-fit with coalescing算法(后文简称bfc算法)。 bfc算法是Doung Lea’s malloc(dlmalloc)的一个非常简单的版本。 它具有内存分配、释放、碎片管理等基本功能。 2. bfc基本...

    操作系统的期末课程设计

    课程设计内容 1、CPU管理。通过模拟设计并实现进程调度算法,实现CPU对进程的调度。 2、内存管理。设计并模拟实现虚拟内存中的请求分页...内存管理中要包括页面置换算法的基本实现;文件管理中要包括目录创建的功能。

    clock页面置换算法

    简单的clock页面置换算法 采用CLOCK置换算法仿真请求分页系统 1、设计目的:用高级语言编写和调试一个内存分配程序,加深对内存分配算法的理解。 2、设计要求: 1) 实现请求分页存储管理方式的页面置换算法:...

    操作系统(内存管理)

    本文将介绍手工的、半手工的以及自动的内存管理实践的基本概念。 追溯到在 Apple II 上进行汇编语言编程的时代,那时内存管理还不是个大问题。您实际上在运行整个系统。系统有多少内存,您就有多少内存。您甚至...

    存储管理--可变分区管理 操作系统 实验报告

    对分区的管理法可以采用下面三种算法之一: 首次适应算法 循环首次适应算法 最佳适应算法 必须建立空闲区表和占用区表,回收算法考虑四种情况。 流程图按选定的算法自己完成。 三.实验源程序文件名:...

    《操作系统》实验二.doc

    2、实验内容 实现一个内存管理的伙伴算法,实现内存块申请时的分配和释放后的回收。 设计一个虚拟存储区和内存工作区,并使用下述算法计算访问命中率。 1) 最佳置换算法(Optimal) 2) 先进先出法(Fisrt In First ...

    内存管理简介.ppt

    1.介绍两种内存管理方案的对比; 2.介绍分页机制的框架; 3.介绍分页机制的实现; 4.内存的分配和回收(buddy); 5.介绍小块内存分配方案:SLAB算法的实现(简单介绍)

    内存管理调度操作系统c++实现

    这次作业的数据结构比较简单,所以没有单独写类,而是把成员和方法放在DLG类中。 首先关于指令访问次序,我写了一个Rand函数,用于生成上下限之间的伪随机数。由于指令不需要重复执行,所以函数里添加了一些判断指令...

    常用文本聚类算法java实现.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    《数据结构与算法分析》.txt

    ——加菲劳 《数据结构与算法分析》 ――课程内容体系主要内容 教学单元模块 具体教学内容 绪论 绪论部分是全书的预备知识,主要对ADL语言、数据结构与算法、算法分析基础、OOP、和C++做了简单介绍 基本数据结构 ...

    分页管理(操作系统分页存储管理.模拟多进程内存动态分配)

    本设计要求用高级语言编写模拟一个简单的内存管理程序。通过本实验可以加深对常见操作系统的内存管理模块的实现方法的理解。 2. 要求 (1)设计用户程序数组、PCB、页表、内存分配表等数据结构; (2)编程模拟OS...

    常用数据结构及其算法的Java实现.zip

    包括但不仅限于链表、栈,队列,...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

Global site tag (gtag.js) - Google Analytics