首次适配算法是按照地址顺序在链表中存放进程和空闲区时,用来为进程创建分配内存最简单的方法,它假设存储管理器预先知道要为进程分配多大的进程。

可变式分区管理

    在处理进程过程中建立分区,使分区大小正好适合进程的需要。

首次适应算法

  将空闲分区链以地址递增的次序链接,在进行内存分配时,从链首开始顺序查找,直到找到一个能满足请求要求的空闲分区为止。然后,按照作业的大小,从该分区中划出一内存块给请求者,余下的空闲分区仍留在空闲分区链中。


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

typedef struct _memorySpace
{
 int size;
 int state;
 int taskID;
 struct _memorySpace *next;
}memorySpace;


void *initMemeory(int size);
void displayMemory(memorySpace *memoryBlock);
void addTask(memorySpace *memoryBlock);
void delTask(memorySpace *memoryBlock);
void manageMemory(memorySpace*memoryBlock);


int main(int argc, char *argv)
{
 int size=0;
 memorySpace *memoryBlock;
 printf("初始多大空间,请输入一个整数:\n");
 scanf("%d",&size);
 memoryBlock = (memorySpace *)initMemeory(size);
 manageMemory(memoryBlock);
 return 0;
}


//初始化
void *initMemeory(int size)
{
 memorySpace *p = (memorySpace*)malloc(sizeof(memorySpace));
 p->size = size;
 p->state = 0;
 p->taskID = -1;
 p->next = NULL;
 return p;
}


//显示内容分配情况
void displayMemory(memorySpace *memoryBlock)
{
 printf("块序号\t作业ID\t状态\t大小\n");
 int num = 1;

 while(memoryBlock != NULL)
 {
 printf("%d\t%d\t%d\t%d\n",num++,memoryBlock->taskID,memoryBlock->state,memoryBlock->size);
  memoryBlock = memoryBlock->next;
 }
}

//添加作业
void addTask(memorySpace *memoryBlock)
{
 int new_ID;
 printf("请输入新任务的编号: \n");
 scanf("%d", &new_ID);
 getchar();

 int new_size;
 printf("请输入新任务的大小:\n");
 scanf("%d",&new_size);
 getchar();

 while(memoryBlock!=NULL)
 {
  if(memoryBlock->state==0 && memoryBlock->size >= new_size)
  {
   if(memoryBlock->size > new_size)
   {
    memorySpace *newBlock = (memorySpace *)malloc(sizeof(memorySpace));
    newBlock->size = memoryBlock->size - new_size;
    newBlock->state = 0;
    newBlock->taskID = -1;

    memoryBlock->size = new_size;
    memoryBlock->state = 1;
    memoryBlock->taskID = new_ID;

    newBlock->next = memoryBlock->next;
    memoryBlock->next = newBlock;
    return;
   }
   else if(memoryBlock->size == new_size)
   {
    memoryBlock->state = 1;
    memoryBlock->taskID = new_ID;
    return;
   }
  }
  else
  {
   memoryBlock = memoryBlock->next;
  }
 }

 printf("新建任务失败\n");

}

 //删除作业
void delTask(memorySpace *memoryBlock)
{
 printf("请输入要删除的作业ID:");
 int del_id;
 scanf("%d",&del_id);

 memorySpace * pBlock=NULL;
 memorySpace * nBlock=NULL;
 while(memoryBlock!=NULL)
 {
  if(memoryBlock->taskID==del_id)
  {
   if(pBlock==NULL||pBlock->state==1)
   {
    nBlock = memoryBlock->next;
    if(nBlock->state==0)
    {
     memoryBlock->next = nBlock->next;
     memoryBlock->size += nBlock->size;
     memoryBlock->state = 0;
     memoryBlock->taskID = -1;
     free(nBlock);
     return;
    }
    else
    {
     memoryBlock->state = 0;
     memoryBlock->taskID = -1;
     return;
    }
   }
   else
   {
    nBlock = memoryBlock->next;
    if(nBlock->state==0)
    {
     pBlock->next = nBlock->next;
     pBlock->size += nBlock->size + memoryBlock->size;
     free(memoryBlock);
     free(nBlock);
     return;
    }
    else
    {
     pBlock->next = memoryBlock->next;
     pBlock->size += memoryBlock->size;
     free(memoryBlock);
     return;
    }
   }
  }
  else
  {
   pBlock = memoryBlock;
   memoryBlock = memoryBlock->next;
  }
 }
 printf("删除失败,可能并不存在此作业\n");
}

//选择操作类型
void manageMemory(memorySpace *memoryBlock)
{
 int choice=4;
 while(choice!=0)
 {
  printf("\n");
  printf("请选择要进行的操作:\n");
  printf("0 退出本程序\n");
  printf("1 显示内存分配情况\n");
  printf("2 添加新作业\n");
  printf("3 删除某个作业\n");
  printf("输入你的选择:");
  scanf("%d",&choice);
  printf("\n");

  switch(choice)
  {
  case 0:
   return;
  case 1:
   displayMemory(memoryBlock);
   break;
  case 2:
   addTask(memoryBlock);
   break;
  case 3:
   delTask(memoryBlock);
   break;
  }
 }
}