• 大小: 9KB
    文件类型: .c
    金币: 1
    下载: 0 次
    发布日期: 2021-05-09
  • 语言: C/C++
  • 标签:

资源简介

在可变分区管理方式下,采用首次适应算法(最先适应算法)实现主存空间的分配和回收。操作系统课程设计,用C语言实现。在VC6.0上调试通过。

资源截图

代码片段和文件信息

/* 使用首次适应算法的模拟使用空闲分区链*/
#include “stdio.h“
#include “conio.h“

#define getpch(typesize) (type*)malloc(sizeof(type)*size)
#define MINSIZE sizeof(FQ)*2

int memsize;/*模拟的内存大小*/
char *memfirst; /*模拟的内存所占的首地址*/
int frees=-1;/*free指向模拟内存的空闲分区的首地址*/



struct fq/*分区链的结构*/
{
    int link;  /*指向前一个空闲分区块或者后一个空闲分区块*/
    int size;  /*空闲分区的大小*/
}*p=NULL;

typedef struct fq FQ;

int insert(int firstint fqsize)/*构造空闲分区时插入空闲分区*/
{
    int tmptmp1a;
    if(frees<0)/*空闲分区为空*/
    {
        frees=first;
        p=(FQ*)(memfirst+first);/*在空闲分区的首部来记录该空闲分区的信息和前向指针*/
        p->link=-1; /*因为是第一个前向指针为-1*/
        p->size=fqsize;
        /*printf(“%d“(char*)p-memfirst); */
        p=(FQ*)(memfirst+first+fqsize-sizeof(FQ)); /*在空闲分区的尾部来记录该空闲分区的信息和前向指针*/
        p->size=fqsize;
        p->link=-1; /*因为是第1个所以后向指针也为-1*/
        return 1;
    }
    else
    {
        if(first        {
            if(first+fqsize>frees)/*判断是否有重叠部分*/
            {
                printf(“空闲分区有部分重叠!“);
                return -1;
            }
            if(first+fqsize==frees)/*要插入的空闲分区刚好可以和最前面的分区合并就和最前面的分区合并*/
            {
                p=(FQ*)(memfirst+frees);
                p=(FQ*)(memfirst+frees+p->size)-1;
                p->size=p->size+fqsize;
                tmp=p->size;
                p=(FQ*)(memfirst+first);
                p->size=tmp;
                p->link=-1;
                frees=first;
                return 1;
            }
            p=(FQ*)(memfirst+first);/*如果不能合并就把这个空闲分区插入到最前面*/
            p->size=fqsize;
            p->link=-1;
            p=(FQ*)(memfirst+first+fqsize)-1;
            p->size=fqsize;
            p->link=frees;
            p=(FQ*)(memfirst+frees);
            p->link=first+fqsize-sizeof(FQ);
            frees=first;
            return 1;
        }
        else/*空闲分区不是应该插入到最前面*/
        {
            tmp=frees;
            p=(FQ*)(memfirst+frees);
            p=(FQ*)(memfirst+frees+p->size)-1;
            tmp1=p->link;
            while(first>tmp1&&tmp1!=-1)/*找到应该插入的位置*/
            {
                p=(FQ*)(memfirst+tmp1);
                p=(FQ*)((char*)p+p->size)-1;
                tmp=tmp1 ;
                tmp1=p->link;
            }
            if(tmp1==-1)/*要插入的空闲分区大于所有空闲分区*/
            {
                p->link=first;
                tmp=(char*)p-memfirst;
                p=(FQ*)(memfirst+first);
                p->size=fqsize;
                p->link=tmp;
                p=(FQ*)(memfirst+first+p->size)-1;
                p->size=fqsize;
                p->link=-1;
                return 1;
            }
            else
            {
                if(first+fqsize==tmp1)
                {
                    p=(FQ*)(memfirst+tmp1);
                    a=p->link;/*保存前一空闲分区的尾部*/
                    p=(FQ*)(memfirst+tmp1+p->size)-1;
                    p->size=p->size+fqsize;
                    fqsi

评论

共有 条评论

相关资源