MINI3内存分配算法
最差适应算法
#ifdef USING_WORST_FIT
{
//先找到第一个满足要求的空洞,
//再以第一个为标准寻找最适合的空洞。
//当最适合的空洞完全吻合
//就直接划给它,当空洞较大时就切割。 //首先注册目标指针、目标前一个指针、头指针
//记录目标大小和目前最适合大小
register struct hole *hp;
register struct hole *prevAim_ptr;
register struct hole *Aim_ptr;
phys_clicks old_base; //如果循环一次都没找到
//就把可以退出内存的进程赶出去
//再循环 ;
do{
hp = hole_head;
prevAim_ptr = NIL_HOLE;
Aim_ptr = NIL_HOLE; for(;hp != NIL_HOLE && hp->h_base < swap_base;
prevAim_ptr=hp,hp=hp->h_next)
{ //当从没记录过合适内存时
//把遇到的第一个合适节点保存在aim中
if(hp->h_len >= clicks && Aim_ptr == NIL_HOLE)
{
Aim_ptr=hp;
} //当找到一个比原来aim更合适的空间
//记录新的空间
if(hp->h_len >= clicks && hp->h_len > Aim_ptr->h_len)
{
//mark it down
Aim_ptr=hp;
} } //we found bigest
if(Aim_ptr!=NIL_HOLE)
{
old_base =Aim_ptr->h_base;
Aim_ptr->h_base+=clicks;
Aim_ptr->h_len-=clicks; /* Remember new high watermark of used memory. */
if(Aim_ptr->h_base > high_watermark)
high_watermark = Aim_ptr->h_base; return(old_base);
} }while(swap_out());
return(NO_MEM);
}
#endif
最佳适应:
#ifdef USING_BEST_FIT
{
//先找到第一个满足要求的空洞,
//再以第一个为标准寻找最适合的空洞。
//当最适合的空洞完全吻合
//就直接划给它,当空洞较大时就切割。 //首先注册目标指针、目标前一个指针、头指针
//记录目标大小和目前最适合大小
register struct hole *hp;
register struct hole *prevAim_ptr;
register struct hole *Aim_ptr;
phys_clicks old_base; //如果循环一次都没找到
//就把可以退出内存的进程赶出去
//再循环
do{
hp = hole_head;
prevAim_ptr = NIL_HOLE;
Aim_ptr = NIL_HOLE; for(;hp != NIL_HOLE && hp->h_base < swap_base;
prevAim_ptr=hp,hp=hp->h_next)
{ //当从没记录过合适内存时
//把遇到的第一个合适节点保存在aim中
if(hp->h_len > clicks && Aim_ptr == NIL_HOLE)
{
Aim_ptr=hp;
} //当找到一个比原来aim更合适的空间
//记录新的空间
if(hp->h_len > clicks && hp->h_len < Aim_ptr->h_len)
{
//mark it down
Aim_ptr=hp;
}
}
//we found it
if(Aim_ptr != NIL_HOLE)
{
old_base = Aim_ptr->h_base; /* remember where it started */
Aim_ptr->h_base += clicks; /* bite off */
Aim_ptr->h_len -= clicks; /* ditto */ /* Remember new high watermark of used memory. */
if(Aim_ptr->h_base > high_watermark)
high_watermark = Aim_ptr->h_base; return(old_base);
} }while(swap_out());
return(NO_MEM);
}
#endif
下一个最适合 :
#ifdef USING_NEXT_FIT //161 error
{
register struct hole *hp, *prev_ptr;
static register struct hole *start_ptr; phys_clicks old_base;
start_ptr = hole_head;
Prev_ptr=NIL_HOLE;
hp=start_ptr; do{ if(hp->h_next==start_ptr)
{
return(NO_MEM);
} while (hp->h_next != start_ptr && 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 */ /* Delete the hole if used up completely. */
if (hp->h_len == ) del_slot(prev_ptr, hp); If((start_ptr=hp->h_next)==NIL_HOLE)
Start_ptr=hole_head; /* Return the start address of the acquired block. */
return(old_base);
} prev_ptr = hp;
hp = hp->h_next; If(hp==NIL_HOLE)
hp=hole_head;
} }while(swap_out());
}
#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 == ) 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内存分配算法的更多相关文章
- Java实现内存分配算法 FF(首次适应算法) BF(最佳适应算法)
一.概述 因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示. MemoryAlgorithm类里只是和控制台输入输出有关的操作,而对内存的所有逻辑操作都是用Mem ...
- python的list内存分配算法
前提:python为了提高效率会为list预先分配一定的内存空间供其使用,避免在每次append等操作都去申请内存,下面简单分析下list的内存分配算法,主要就是两段. 1.当没有元素时,newsiz ...
- Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF
1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是: BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...
- Buddy内存分配算法
Buddy(伙伴的定义): 这里给出伙伴的概念,满足以下三个条件的称为伙伴:1)两个块大小相同:2)两个块地址连续:3)两个块必须是同一个大块中分离出来的: Buddy算法的优缺点: 1)尽管伙伴内存 ...
- c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)
#include<bits/stdc++.h> using namespace std; /*定义内存的大小为100*/ #define MEMSIZE 100 /*如果小于此值,将不再分 ...
- [图解tensorflow源码] [转载] tensorflow设备内存分配算法解析 (BFC算法)
转载自 http://weibo.com/p/1001603980563068394770 @ICT_吴林阳 tensorflow设备内存管理模块实现了一个best-fit with coales ...
- TLFS 内存分配算法详解
文章目录 1. DSA 背景介绍 1.1 mmheap 1.2 mmblk 2. TLFS 原理 2.1 存储结构 2.2 内存池初始化 2.3 free 2.4 malloc 参考资料 1. DSA ...
- 内存分配---FF、BF、WF三种算法
动态分区分配是根据进程的实际需要,动态的为之分配内存空间.而在实现可变分区分配时,将涉及到分区分配中 所用的数据结构.分区分配算法和分区的分配与内存回收的过程. 分区分配中的数据结构:(1)描述空闲块 ...
- SQLite剖析之动态内存分配
SQLite通过动态内存分配来获取各种对象(例如数据库连接和SQL预处理语句)所需内存.建立数据库文件的内存Cache.保存查询结果. 1.特性 SQLite内核和它的内存分配子系统提供以下特性 ...
随机推荐
- GO语言官方中文教程!
官方中文教程网址:https://tour.go-zh.org/basics/1 推荐理由:简洁,一句废话没有,对于初学者可以让大家快速掌握GO语言! 注意问题:如果不能访问,你懂的! 教程截图:
- Mybatis 的输入参数学习
mybatis 的输入参数: 指得就是parameterType的参数 这个参数就代表的sql语句中的输入参数 sql语句中的参数使用 有两种方式 : 使用#{} 获取: 8个基本数据类型 + S ...
- 【bug】—— H5页面在 ios 端滑动不流畅的问题
IOS系统的惯性滑动效果非常6,但是当我们对div加overflow-y:auto;后是不会出这个效果的,滑动的时候会感觉很生涩.怎么办? 方案一: 在滚动容器内加-webkit-overflow-s ...
- 十招谷歌 Google 搜索
十招谷歌搜索 一.或者 OR 二.网址 insite:example.com keyword 三.大约 1.类似查询(记得) ~keyword 2.模糊查询(记得) key*****word 3.模糊 ...
- 安装openssl-devel
安装openssl-devel 0.操作系统为 RHEL6.7 1.描述:当开发人员需要调用openssl的库文件时,需要安装openssl-devel包 2.当根目录(即挂载点为 )的利用率为10 ...
- vscode调试typescript
1.记录一个插件:https://www.npmjs.com/package/ts-node # Locally in your project npm install -D ts-node npm ...
- 51.RocketMQ 顺序消费
大部分的员工早上的心情可能不会很好,因为这时想到还有很多事情要做,压力会大点,一般到下午4点左右,状态会是一天中最好的,因为这时大部分的工作做得差不多了,又快要下班了,当然也不是绝对.要注意记录各下属 ...
- [原创] PHP 使用Redis实现锁
目录 锁实现的注意点 加锁 connect 与 pconnect 解锁 Redis 中使用 Lua 脚本的注意点 Redis集群分布式锁 RedLock 算法 锁实现的注意点 互斥: 任意时刻, 只能 ...
- golang使用etcd实现分布式锁
package main import ( "context" "fmt" "time" "go.etcd.io/etcd/cli ...
- 后台开发面试题(.net与java)
最近面试了几家公司,发现大部分公司面试题有相似的地方.现在此记录下我还记得的一些题: JAVA部分: 1.Java Map 按Key排序和按Value排序: 参考链接:Java Map 按Key排序和 ...