![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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
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); }