假设系统的可利用内存空间容量为2m个字(地址从0到2m-1),则在开始运行时,整个内存区是一个大小为2m的空闲块,在运行了一段时间之后,被分隔成若干占用块和空闲块。为了在分配时查找方便起见,我们将所有大小相同的空闲块建于一张子表中。每个子表是一个双重链表,这样的链表可能有m+1个,将这m+1个表头指针用向量结构组织成一个表,这就是伙伴系统中的可利用空间表,如图所示:
分配算法:
当用户提出大小为n的内存请求时,首先在可利用表上寻找结点大小与n相匹配的子表,若此子表非空,则将子表中任意一个结点分配之即可;若此子表为空,则需从结点更大的非空子表中去查找,直至找到一个空闲块,则将其中一部分分配给用户,而将剩余部分插入相应的子表中。
若2k-1< n ≤ 2k-1,又第k+1个子表不空,则只要删除此链表中第一个结点并分配给用户即可;若 2k-2< n ≤ 2k-1-1,此时由于结点大小为2k-1的子表为空,则需从结点大小为2k的子表中取出一块,将其中一半分配给用户,剩余的一半作为一个新结点插入在结点大小为2k-1的子表中,若2k-i-1< n
≤ 2k-i-1(i为小于是的整数),并且所有结点小于2k的子表均为空,则同样需从结点大小为2k的子表中取出一块,将其中2k-i的一小部分分配给用户,剩余部分分割成若干个结点分别插入在结点大小为2k-1、 2k-2、…、 2k-i的子表中。
回收算法:
在用户释放不再使用的占用块时,系统需将这新的空闲块插入到可利用空间表中去。这里,同样有一个地址相邻的空闲块归并成大块的问题。但是在伙伴系统中仅考虑互为“伙伴”的两个空闲块的归并。
何谓“伙伴”?如前所述,在分配时经常需要将一个大的空闲块分裂成两个大小相等的存储区,这两个由同一大块分裂出来的小块就称之“互为伙伴”。例如:假设p为大小为pow(2,k)的空闲块的初始地址,且p MOD pow(2,k+1)=0,则初始地址为p和p+pow(2,k)的两个空闲块互为伙伴。在伙伴系统中回收空闲块时,只当其伙伴为空闲块时才归并成大块。也就是说,若有两个空闲块,即使大小相同且地址相邻,但不是由同一大块分裂出来的,也不归并在一起。
由此,在回收空闲块时,应首先判别其伙伴是否为空闲块,若否,则只要将释放的空闲块简单插入在相应子表中即可;若是,则需在相应子表中找到其伙伴并删除之,然后再判别合并后的空闲块的伙伴是否是空闲块。依此重复,直到归并所得空闲块的伙伴不是空闲块时,再插入到相应的子表中去。
全文转自
分享到:
相关推荐
内存管理伙伴算法
详细描述了linux内存管理中伙伴算法的技术原理,对了解内存管理很有帮助
基于Ucosii改进的具有伙伴算法的内存管理
设计了一个内存管理模拟程序,实现了最先适应算法和最佳适应算法,可以手动申请内存大小,释放内存,同时附有测试程序,可设置测试次数,同时统计了平均申请内存大小,内存利用率及运行时间。
C++ 内存管理算法和实现.详细介绍了C++在内存管理方面的知识点。一本好书。
内存替换算法各个算法对比内存替换算法各个算法对比内存替换算法各个算法对比内存替换算法各个算法对比内存替换算法各个算法对比内存替换算法各个算法对比内存替换算法各个算法对比内存替换算法各个算法对比内存替换...
如Binary-Buddy,在分配内存的时候,首先找到一个空闲内存块,接着把内存块不断的进行对半切分(切分得到的2个同样大小的内存块互为伙伴),直到切出来的内存块刚好满足分配需求为止。合并的时候,只有伙伴才能合并...
C#图形界面,基于linux伙伴算法,对虚拟内存管理。包含可视化窗格,界面简单易懂
1.实现三个内存分配算法、从内存中移除作业进程、添加作业进程至作业进程表的独立功能实现 2.实现动态操作,即每次内存分配、移除作业进程、添加作业进程可以通过对话框自定义 3.实现移除作业进程时对相邻空内存块...
课程设计用的 内存管理FIFO算法,课程设计中的金典啊,
操作系统课程设计 内存管理 银行家算法 快速文件管理系统 windows内核一书pdf 实验综合报告
内存管理算法与C,C++实现内存管理算法与C,C++实现内存管理算法与C,C++实现内存管理算法与C,C++实现内存管理算法与C,C++实现
用C语言实现的内存管理,主要是堆和栈的管理 以及内存回收等算法的实现
实验二 存储管理 1、实验目的 通过模拟实现内存分配的伙伴算法和请求页式存储管理的几种基本页面置换算法,了 解存储技术的特点。掌握虚拟存储请求页式存储管理中几种基本页面置换算法的基本思 想和实现过程,并比较...
操作系统实验,内存管理——首次适应算法模拟系统
设计和实现关于内存管理的内存布局初始化及内存申请分配、内存回收等基本功能操作函数,尝试对用256MB的内存空间进行动态分区方式模拟管理。内存分配的基本单位为1KB,同时要求支持至少两种分配策略,并进行测试和对...
C++ 内存管理算法和实现 C++ 内存管理算法和实现
操作系统实验——内存管理之页面置换算法,包括FIFO,LRU,CLOCK三种算法
C++ 内存管理算法和实现.chm,适合于对c++内存管理的了解,本书分两部分,分别下载,直接解压就行
2.模拟linux内存管理中的Buddy(伙伴)算法,实现页面的回收。 1)假设内存中有16个页面,部分页面是正在使用的,部分页面是空闲的,页面号依次是0,1,。。。15; 2)算法根据buddy算法的原理管理着空闲页面;(注...