程序在向操作系统申请内存空间的时候,操作系统会扫描空闲块链表并从中取出一块足够大的分配,与之对应的算法有 首次适应 和 最佳适应,顾名思义,首次适应就是把首次遇到的足够大的空闲块分配给应用程序,最佳适应就是扫描完空闲块链表把大小与申请空间最匹配的空闲块分配给应用程序。

mem.h        程序用到的头文件

main.c       主函数

fit.c        具体的实现函数

这里使用make来编译使用,若是读者还没接触过make的,

请移步参考我写的这篇文章:http://netcake.blog.51cto.com/8663272/1560563

================================================

mem.h

------------------------------------------------

#include <stdio.h>
#include <stdlib.h>

//模拟空闲块链表的节点,其中k代表空闲空间大小
typedef struct po{
    int k;
    struct po *next;
}points;

void initalize(void);//初始化空闲块链表,给节点中代表空闲空间大小k赋值

void print(void);    //打印空闲块链表

void fassign(void);  //first_fit,首次适应算法

void bassign(void);  //best_fit,最佳适应算法

================================================

================================================

main.c

------------------------------------------------

/*
    内存分配适应算法主函数
    
        while(打印提示用户的输入信息)
             等待用户输入
            用户合法,执行相应操作
*/
#include "mem.h"

main()
{
    char c;
    initalize();

printf("p表示打印空闲空间块,m表示要申请一块空闲空间,q表示退出,请输入:");
    while(c = getchar())    
        if(c == '\n')
            continue;
        else
        {
            switch(c)
            {
                case 'p':
                    print();
                    break;
                case 'b':
                    bassign();
                    break;
                case 'f':
                    fassign();
                    break;
                case 'q':
                    exit(0);
                default:
                    printf("请正确输入!\n");
            }
            printf("p表示打印空闲空间块大小,b表示最佳适应法,f表示首次适应法,q表示退出,请输入:");
        }
}

================================================

fit.c

------------------------------------------------

#include "mem.h"

static points * header;//空闲块链表头节点的全局变量,使用static限定只能在本文件使用
#define MAXSIZE    140

//初始化空闲块链表
void initalize(void)
{
    points *f, *b;
    int i = 6;
        
    header = (points *)malloc(sizeof(points *));
    header->k = 6;//头节点记录空闲块的块数,头节点并不属于要分配的内存的一部分
    header->next = NULL;
    b = header;

while(--i)
    {
        f = (points *)malloc(sizeof(points *));
        f->k = rand()%(MAXSIZE-i*10);
        f->next = NULL;
        
        b->next = f;
        b = f;
        f = f->next;
    }
    f = (points *)malloc(sizeof(points *));
    f->k = MAXSIZE;
    f->next = NULL;
    b->next = f;
}
//打印空闲链表
void print(void)
{
    points *p;
    for(p=header->next; p != NULL; p=p->next)
        printf("%d ", p->k);
    printf("\n");

}
void getsize(int *size)
{
    char a[3], c, *p;
    int i, k;

getchar();//读取在菜单选择时候的回车符

while(1)
    {
        printf("请输入要申请的空间的大小,范围(0-120]:");
        //每次对a初始化是为了避免再输入超3个字符错误之后,输入少于3个字符的情况
        for(i=0;i<3;i++)
            a[i]='f';
        p = a;
        for(i=0;(c=getchar())!='\n' && i<3;i++)
            *p++ = c;
        k = i;
        for(i=0; i<k; i++)
            if(a[i] <'0' || a[i]>'9')
            {
                printf("非法输入!\n");
                break;
            }
        if(i == k)
        {
            *size = atoi(a);
            if(*size<=0 || *size>MAXSIZE)
            {
                printf("非法输入!\n");
                continue;
            }
            else
                break;
        }
    }
}
void bassign(void)
{
    int size, far=MAXSIZE, n;
    points *ptr, *p;
    getsize(&size);
    for(p=header->next; p!=NULL; p=p->next)
        if((n=p->k-size) >= 0 && n < far)
        {    
            far = n;
            ptr = p;
        }
    printf("最佳适应法分配的空间块大小是 %d\n", ptr->k);
}
void fassign(void)
{
    int size;
    points *p;

getsize(&size);
    for(p=header->next; p!=NULL; p=p->next)
        if((p->k-size) >= 0 )
            break;
    printf("首次适应法分配的空间块大小是 %d\n", p->k);
}

/*

使用scanf函数并不不能正确处理遇到输入为字符串的情况,这里提供这个一开始

为了简单而暂时使用的处理用户输入的函数

void getsize(int *size)
{
    char *p;
    while(1)
    {
        printf("请输入要申请的空间的大小,范围(0-120]:");
        scanf("%d", size);
        if(*size<=0 || *size>120)
            printf("输入非法!\n");
        else
            break;
    }
}
 
 */

================================================

转载于:https://blog.51cto.com/poollooq/1561004

内存分配算法 之 首次适应-最佳适应相关推荐

  1. Java实现内存分配算法 FF(首次适应算法) BF(最佳适应算法)

    一.概述 因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示. MemoryAlgorithm类里只是和控制台输入输出有关的操作,而对内存的所有逻辑操作都是用Mem ...

  2. c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)

    #include<bits/stdc++.h> using namespace std; /*定义内存的大小为100*/ #define MEMSIZE 100 /*如果小于此值,将不再分 ...

  3. 各种存储分配算法java代码实现_Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF...

    1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是:BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...

  4. 操作系统-动态内存分配算法

    内存分配算法 1.首次适应算法(FF) 2.循环首次适应算法(NF) 3.最佳适应算法(BF) 4.最坏适应算法(WF) 本程序使用前端技术实现(html+css+JavaScript) 新建以下文件 ...

  5. Java实现操作系统中四种动态内存分配算法:BF+NF+WF+FF

    1 概述 本文是利用Java实现操作系统中的四种动态内存分配方式 ,分别是: BF NF WF FF 分两部分,第一部分是介绍四种分配方式的概念以及例子,第二部分是代码实现以及讲解. 2 四种分配方式 ...

  6. 内存分配算法(FF、BF、MF)

    动态分区分配 最近在学习操作系统内存分配方面的知识点,小小的总结一下知识点. 根据进程的实际需要,动态的为之分配内存空间.在实现动态分区分配时,将涉及到分区分配中所用到的数据结构.分区分配算法和分区的 ...

  7. linux为系统分配内存,Linux操作系统知识讲解:走进Linux 内存分配算法

    Linux 内存分配算法 内存管理算法--对讨厌自己管理内存的人来说是天赐的礼物 1.内存碎片 1) 基本原理 产生原因:内存分配较小,并且分配的这些小的内存生存周期又较长,反复申请后将产生内存碎片的 ...

  8. Linux 操作系统原理 — 内存 — 内存分配算法

    目录 文章目录 目录 前文列表 内存碎片 伙伴(Buddy)分配算法 Slab 算法 虚拟内存的分配 内核态内存分配 vmalloc 函数 kmalloc 用户态内存分配 malloc 申请内存 用户 ...

  9. 嵌入式操作系统内核原理和开发(内存分配算法)

    内存分配是操作系统必须面对的一个环节,除非这个系统本身不需要内存安排,所有业务可以通过全局数据和堆栈搞定.内存分配其实不困难,但是由内存引申出来的东西就比较复杂了.早前没有MMU,系统本身的空间和用户 ...

最新文章

  1. html标题标签最大值是多少,css – 样式HTML5进度标记,达到了它的最大值
  2. VIM 使用技巧(常用提取)
  3. android 图片变颜色代码,Android -对图片Drawable进行变色
  4. iOS开发 CGAffineTransform 让图片旋转, 旋转后获得图片旋转的角度
  5. 单片机shell命令_MCU调试大法:使用串口实现简单shell功能
  6. MarkDown中的表格在jekyll的pages博客中不能正常显示
  7. EXCEL如何新建自定义单元格以及样式怎么设置
  8. 高维(多变量)优化问题的技术与瓶颈
  9. Oracle10g安装教程、配置实例、监听、客户端程序详解_Windows篇
  10. react录制mp3格式音频,输出二进制数据流向后台请求音频的url
  11. 最小二乘法曲线拟合(代码环境:matlab)
  12. Easy Less生成.ttss后缀文件的配置
  13. 用xLang 写 SQL 控制程序
  14. 山东省第二届数据应用创新大赛日照赛区-公积金贷款逾期预测-赛后总结
  15. 细谈围城---我的启示录
  16. impala shell
  17. sw标准件不能配置_sw标准件库调不出来(在使用solidworks2009标准件库 调不出零件)...
  18. 创建五星级评级的五种方法
  19. 游戏指标ACU PCU APA ARPU
  20. 小小黑客从鼠标钩子开始,密码看看看

热门文章

  1. js和html以及css的区别,html、css、js中的区别与关系
  2. centos上安装zookeeper
  3. docker部署elasticsearch-+-Kibana(6-8)-+-SpringBoot-2-1-6
  4. 源码安装nginx开启SSL功能
  5. Mybatis 3.5.X 解析LocalDateTime 错误问题
  6. NSURLCache
  7. spark读取hdfs路径下的数据_Spark读取HDFS数据分区参考
  8. 公办低分二本_三本4所二本3所,四川考生都是用这7所大学保底的,分数低保录取...
  9. 犟泥巴php集训营,想要开发自己的PHP框架需要那些知识储备?
  10. 用Zabbix部署onalert云告警平台