首次适配算法是按照地址顺序在链表中存放进程和空闲区时,用来为进程创建分配内存最简单的方法,它假设存储管理器预先知道要为进程分配多大的进程。
n 可变式分区管理
在处理进程过程中建立分区,使分区大小正好适合进程的需要。
n 首次适应算法
将空闲分区链以地址递增的次序链接,在进行内存分配时,从链首开始顺序查找,直到找到一个能满足请求要求的空闲分区为止。然后,按照作业的大小,从该分区中划出一内存块给请求者,余下的空闲分区仍留在空闲分区链中。
#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;
}
}
}