MINI3内存分配算法

 1 最差适应算法
2 #ifdef USING_WORST_FIT
3 {
4 //先找到第一个满足要求的空洞,
5 //再以第一个为标准寻找最适合的空洞。
6 //当最适合的空洞完全吻合
7 //就直接划给它,当空洞较大时就切割。
8
9 //首先注册目标指针、目标前一个指针、头指针
10 //记录目标大小和目前最适合大小
11 register struct hole *hp;
12 register struct hole *prevAim_ptr;
13 register struct hole *Aim_ptr;
14 phys_clicks old_base;
15
16 //如果循环一次都没找到
17 //就把可以退出内存的进程赶出去
18 //再循环 ;
19 do{
20 hp = hole_head;
21 prevAim_ptr = NIL_HOLE;
22 Aim_ptr = NIL_HOLE;
23
24 for(;hp != NIL_HOLE && hp->h_base < swap_base;
25 prevAim_ptr=hp,hp=hp->h_next)
26 {
27
28 //当从没记录过合适内存时
29 //把遇到的第一个合适节点保存在aim中
30 if(hp->h_len >= clicks && Aim_ptr == NIL_HOLE)
31 {
32 Aim_ptr=hp;
33 }
34
35
36 //当找到一个比原来aim更合适的空间
37 //记录新的空间
38 if(hp->h_len >= clicks && hp->h_len > Aim_ptr->h_len)
39 {
40 //mark it down
41 Aim_ptr=hp;
42 }
43
44 }
45
46 //we found bigest
47 if(Aim_ptr!=NIL_HOLE)
48 {
49 old_base =Aim_ptr->h_base;
50 Aim_ptr->h_base+=clicks;
51 Aim_ptr->h_len-=clicks;
52
53 /* Remember new high watermark of used memory. */
54 if(Aim_ptr->h_base > high_watermark)
55 high_watermark = Aim_ptr->h_base;
56
57 return(old_base);
58 }
59
60 }while(swap_out());
61 return(NO_MEM);
62 }
63 #endif

 1 最佳适应:
2 #ifdef USING_BEST_FIT
3 {
4 //先找到第一个满足要求的空洞,
5 //再以第一个为标准寻找最适合的空洞。
6 //当最适合的空洞完全吻合
7 //就直接划给它,当空洞较大时就切割。
8
9 //首先注册目标指针、目标前一个指针、头指针
10 //记录目标大小和目前最适合大小
11 register struct hole *hp;
12 register struct hole *prevAim_ptr;
13 register struct hole *Aim_ptr;
14 phys_clicks old_base;
15
16 //如果循环一次都没找到
17 //就把可以退出内存的进程赶出去
18 //再循环
19 do{
20 hp = hole_head;
21 prevAim_ptr = NIL_HOLE;
22 Aim_ptr = NIL_HOLE;
23
24 for(;hp != NIL_HOLE && hp->h_base < swap_base;
25 prevAim_ptr=hp,hp=hp->h_next)
26 {
27
28 //当从没记录过合适内存时
29 //把遇到的第一个合适节点保存在aim中
30 if(hp->h_len > clicks && Aim_ptr == NIL_HOLE)
31 {
32 Aim_ptr=hp;
33 }
34
35
36 //当找到一个比原来aim更合适的空间
37 //记录新的空间
38 if(hp->h_len > clicks && hp->h_len < Aim_ptr->h_len)
39 {
40 //mark it down
41 Aim_ptr=hp;
42 }
43 }
44 //we found it
45 if(Aim_ptr != NIL_HOLE)
46 {
47 old_base = Aim_ptr->h_base; /* remember where it started */
48 Aim_ptr->h_base += clicks; /* bite off */
49 Aim_ptr->h_len -= clicks; /* ditto */
50
51 /* Remember new high watermark of used memory. */
52 if(Aim_ptr->h_base > high_watermark)
53 high_watermark = Aim_ptr->h_base;
54
55 return(old_base);
56 }
57
58 }while(swap_out());
59 return(NO_MEM);
60 }
61 #endif

 1 下一个最适合 :
2 #ifdef USING_NEXT_FIT //161 error
3 {
4 register struct hole *hp, *prev_ptr;
5 static register struct hole *start_ptr;
6
7 phys_clicks old_base;
8    start_ptr = hole_head;
9    Prev_ptr=NIL_HOLE;
10 hp=start_ptr;
11
12 do{
13
14 if(hp->h_next==start_ptr)
15 {
16 return(NO_MEM);
17 }
18
19 while (hp->h_next != start_ptr && hp->h_base < swap_base){
20
21 if (hp->h_len >= clicks) {
22 /* We found a hole that is big enough. Use it. */
23 old_base = hp->h_base; /* remember where it started */
24 hp->h_base += clicks; /* bite a piece off */
25 hp->h_len -= clicks; /* ditto */
26
27
28 /* Delete the hole if used up completely. */
29 if (hp->h_len == 0) del_slot(prev_ptr, hp);
30
31 If((start_ptr=hp->h_next)==NIL_HOLE)
32 Start_ptr=hole_head;
33
34 /* Return the start address of the acquired block. */
35 return(old_base);
36 }
37
38 prev_ptr = hp;
39 hp = hp->h_next;
40
41 If(hp==NIL_HOLE)
42 hp=hole_head;
43 }
44
45 }while(swap_out());
46 }
47 #endif

View
Code


FIRST_FIT
*===========================================================================*
* alloc_mem分配内存 *
*===========================================================================*/
PUBLIC phys_clicks alloc_mem(clicks)
phys_clicks clicks; /* amount of memory requested */
{
/* Allocate a block of memory from the free list using first fit. The block
* consists of a sequence of contiguous bytes, whose length in clicks is
* given by ‘clicks‘. A pointer to the block is returned. The block is
* always on a click boundary. This procedure is called when memory is
* needed for FORK or EXEC. Swap other processes out if needed.
*/
register struct hole *hp, *prev_ptr;
phys_clicks old_base;

do {
prev_ptr = NIL_HOLE;
hp = hole_head;
while (hp != NIL_HOLE && hp->h_base < swap_base) {
if (hp->h_len >= clicks) {
/* We found a hole that is big enough. Use it. */
old_base = hp->h_base; /* remember where it started */
hp->h_base += clicks; /* bite a piece off */
hp->h_len -= clicks; /* ditto */

/* Remember new high watermark of used memory. */
if(hp->h_base > high_watermark)
high_watermark = hp->h_base;

/* Delete the hole if used up completely. */
if (hp->h_len == 0) del_slot(prev_ptr, hp);

/* Return the start address of the acquired block. */
return(old_base);
}

prev_ptr = hp;
hp = hp->h_next;
}
} while (swap_out()); /* try to swap some other process out */
return(NO_MEM);
}

MINI3内存分配算法,布布扣,bubuko.com

时间: 2024-10-13 02:36:08

MINI3内存分配算法的相关文章

操作系统: 最佳适配算法和邻近适配算法的模拟实现(内存分配算法)

实现动态分区的分配算法. (1) 最佳适配算法:选择内存空闲块中最适合进程大小的块分配. (2) 邻近适配算法:从上一次分配的地址开始查找符合要求的块,所查找到的第一个满足要求的空闲块就分配给进程. 模拟添加进程的时候,假定内存是一块完整的空闲区,对于算法(1)来说,分配的时候遍历所有的空闲内存块,找出其中最适合的一块,注意此时内存分区的总块数可能已经发生了变化: 对于算法(2)来说,则需要从上次分配的内存块(使用变量记录即可)接着向下找到第一个满足条件的块即可,内存分区的总块可能也已经发生了变

内存分配算法 之 首次适应-最佳适应

程序在向操作系统申请内存空间的时候,操作系统会扫描空闲块链表并从中取出一块足够大的分配,与之对应的算法有 首次适应 和 最佳适应,顾名思义,首次适应就是把首次遇到的足够大的空闲块分配给应用程序,最佳适应就是扫描完空闲块链表把大小与申请空间最匹配的空闲块分配给应用程序. mem.h        程序用到的头文件 main.c       主函数 fit.c        具体的实现函数 这里使用make来编译使用,若是读者还没接触过make的, 请移步参考我写的这篇文章:http://netca

我所理解的内存分配算法(一)

内存分配从本质上来说是一种空间管理算法,给你一块连续的空间,提供存储服务,那么你的空间管理跟分配要采用什么样的算法才会比较高效? Bump-the-Pointer Bump-the-Pointer是最简单的算法.HotSpot的MM白皮书是这么描述btp的, That is, the end of the previously allocated object is always kept track of. When a new allocation request needs to be s

垃圾收集与内存分配算法

3.1判断对象是否已死引用-计数算法 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1:当引用失效时,计数器值就减1:任何时候计数器为0的对象就是不可能再被使用的. 3.2判断对象是否已死引用-可达性分析算法 在主流的程序语言中,都是通过可达性分析来判断对象是否存活的.这个算法的基本思路就是通过一系列称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链,当一个对象至GC Roots没有任何引用链相连时,则证明此对象不可用. 在java语言中

内存分配---FF、BF、WF三种算法

动态分区分配是根据进程的实际需要,动态的为之分配内存空间.而在实现可变分区分配时,将涉及到分区分配中 所用的数据结构.分区分配算法和分区的分配与内存回收的过程. 分区分配中的数据结构:(1)描述空闲块的数据结构.(2)内存块的描述. #define PROCESS_NAME_LEN 32 //进程名长度 #define MIN_SLICE 10 //最小碎片的大小 #define DEFAULT_MEM_SIZE 1024 //内存大小 #define DEFAULT_MEM_START 0 /

SQLite剖析之动态内存分配

SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.以及保存查询结果.我们做了很多努力来让SQLite的动态内存分配子系统可靠.可预测.健壮并且高效.本文概述SQLite的动态内存分配,软件开发人员在使用SQLite时可以据此获得最佳性能. 1.特性    SQLite内核和它的内存分配子系统提供以下特性:    (1)对内存分配失败的健壮处理.如果一个内存分配请求失败(即malloc()或realloc()返回NULL),SQ

内存分配方式及内存碎片

什么是内存碎片? 内部碎片的产生:因为所有的内存分配必须起始于可被 4.8 或 16 整除(视 处理器体系结构而定)的地址或者因为MMU的分页机制的限制,决定内存分配算法仅能把预定大小的内存块分配给客户.假设当某个客户请求一个 43 字节的内存块时,因为没有适合大小的内存,所以它可能会获得 44字节.48字节等稍大一点的字节,因此由所需大小四舍五入而产生的多余空间就叫内部碎片.外部碎片的产生: 频繁的分配与回收物理页面会导致大量的.连续且小的页面块夹杂在已分配的页面中间,就会产生外部碎片.假 设

c语言 变量的存储类别以及对应的内存分配?

<h4><strong>1.变量的存储类别</strong></h4>从变量值存在的角度来分,可以分为静态存储方式和动态存储方式.所谓静态存储方式指在程序运行期间由系统分配固定的存储空间的方式(<strong>程序开始执行时分配,在程序完毕时释放,在程序过程中它们占据国定的存储单元,而不是动态分配和释放</strong>).而动态存储方式在运行期间根据需要进行动态存储方式(<strong>在程序过程中申请和释放的一些空间&

RT-thread内核之小内存管理算法

 一.动态内存管理 动态内存管理是一个真实的堆(Heap)内存管理模块,可以在当前资源满足的情况下,根据用户的需求分配任意大小的内存块.而当用户不需要再使用这些内存块时,又可以释放回堆中供其他应用分配使用.RT-Thread系统为了满足不同的需求,提供了两套不同的动态内存管理算法,分别是小内存管理算法和SLAB内存管理算法.小堆内存管理模块主要针对系统资源比较少,一般用于小于2M内存空间的系统:而SLAB内存管理模块则主要是在系统资源比较丰富时,提供了一种近似多内存池管理算法的快速算法. 两种内