当前位置:文档之家› 动态分区分配方式的模拟C语言代码和C++代码

动态分区分配方式的模拟C语言代码和C++代码

动态分区分配方式的模拟C语言代码和C++代码
动态分区分配方式的模拟C语言代码和C++代码

实验三使用动态分区分配方式的模拟

1、实验目的

了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。

2、实验内容

(1) 用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc( )和回收过程free( )。其中,空闲分区通过空闲分区链来管理:在进行内存分配时,系统优先使用空闲区低端的空间。

(2) 假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:

?作业1申请130KB。

?作业2申请60KB。

?作业3申请100KB。

?作业2释放60KB。

?作业4申请200KB。

?作业3释放100KB。

?作业1释放130KB。

?作业5申请140KB。

?作业6申请60KB。

?作业7申请50KB。

?作业6释放60KB。

请分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次分配和回收后显示出空闲分区链的情况。

程序代码——C语言实现

#include

#include

struct node //空闲分区链结点的定义

{

node *before;

node *after;

int size;

int address;

int state;

};

node L;

struct usenode

{

usenode *next;

int num;

int add;

int size;

}U,*n;

void Init() //空闲分区链的初始化

{

node *p;

p=(node *)malloc(sizeof(node));

p->before=&L;

p->after=NULL;

p->size=640;

p->address=0;

p->state=0;

L.after=p;

L.before=NULL;

L.size=0;

U.next=NULL;

n=&U;

}

node *search(int a)

{

node *p=L.after;

if(p==NULL)

{

printf("没有空闲的区域!");

p=NULL;

return p;

}

else

{

while(p!=NULL && a>p->size)

p=p->after;

if(p==NULL)

{

printf("没有找到合适的空闲空间!");

p=NULL;

return p;

}

else

return p;

}

}

void recovery(int a,int b) //内存回收算法

{

node *c,*s,*r=L.after;

node *d=L.after,*e;

usenode *k=U.next,*h=&U;

while(k!=NULL && a!=k->num)

{

h=k;

k=k->next;

}

if(k==NULL)

printf("没有找到这样的作业!");

else

{

h->next=k->next;

if(h->next==NULL)

n=h;

}

while(r!=NULL) //若回收得到的空闲块的前方有空闲块合并此空闲块{

if(k->add==r->address+r->size)

{

r->size=r->size+k->size;

break;

}

else

r=r->after;

}

if(r==NULL) //若回收得到的空闲块的后面有空闲块合并此空闲块{

r=L.after;

while(r!=NULL)

{

if(k->add+k->size==r->address)

{

r->address=k->add;

r->size=r->size+k->size;

break;

}

else

r=r->after;

}

}

while(d!=NULL) //保证空闲链表中没有相邻的空闲空间{

if(d->after!=NULL)

e=d->after;

else

break;

if(d->address+d->size==e->address)

{

d->after=e->after;

while(e->after!=NULL)

e->after->before=d;

d->size=d->size+e->size;

free(e);

break;

}

else

d=d->after;

}

if(r==NULL)

{

r=L.after;

c=(node *)malloc(sizeof(node));

c->size=b;

c->address=k->add;

if(L.after==NULL)

{

c->after=L.after;

c->before=&L;

L.after=c;

}

else

{

r=L.after;

while(r!=NULL)

{

if(r->address>c->address)

{

c->after=r;

c->before=r->before;

r->before->after=c;

r->before=c;

free(k);

return;

}

else

r=r->after;

}

}

}

free(k);

}

void alloc(int a ,int b) //分配内存算法

{

node *p,*q=L.after;

usenode *m;

p=search(b);

if(p==NULL)

return;

m=(usenode *)malloc(sizeof(usenode));//生成一个被占用链表的结点,并插入到该链表的尾部m->add=p->address;

m->size=b;

m->num=a;

m->next=n->next;

n->next=m;

n=m; //保证n始终指向被占用链表的尾部,方便以后新生成结点的插入if(p->size>b) //如果申请空间的大小小于找到空闲空间的大小的处理

{

p->size=p->size-b;

p->address=p->address+b;

}

else //如果申请空间的大小等于找到空闲空间的大小的处理

{

p->before->after=p->after;

if(p->after!=NULL)

p->after->before=p->before;

free(p);

}

}

void sort() //对空闲链表进行排序

{

int max;

node *p,*q,*r,*s;

node a;

p=L.after;

while(p!=NULL) //让指针q指向链表的最后一个结点{

q=p;

p=p->after;

}

if(L.after->after==NULL)

return;

else

{

while(p!=q)

{

s=r=p=L.after;

max=r->size;

while(s!=q->after)

{

if(s->size>max)

{

max=s->size;

r=s;

s=s->after;

}

else

s=s->after;

}

a.size=q->size;

a.address=q->address;

q->size=r->size;

q->address=r->address;

r->size=a.size;

r->address=a.address;

if(q->before->before==&L)

return;

else

q=q->before;

}

}

}

void Print()

{

node *p=L.after;

usenode *q=U.next;

int i=1;

printf("\n空闲区域列表:\n");

printf("FREEID address size\n");

while(p!=NULL)

{

printf("%-10d",i);

printf("%-10d",p->address);

printf("%d\n",p->size);

p=p->after;

i++;

}

if(q==NULL)

return;

else

{

printf("\n已分配区域列表:\n");

printf("WORKID address size\n");

while(q!=NULL)

{

printf("%-10d",q->num);

printf("%-10d",q->add);

printf("%d\n",q->size);

q=q->next;

}

}

}

void firstfit() //首次适应算法

{

int a,b,i;

Init();

Print();

while(1)

{printf("\n1、申请空间\n");

printf("2、释放空间\n");

printf("3、退出首次适应算法\n");

printf("请输入你的选择:");

scanf("%d",&i);

switch(i)

{

case 1:

{

printf("请输入申请空间的作业号:");

scanf("%d",&a);

printf("请输入申请空间的大小:");

scanf("%d",&b);

alloc(a,b);

Print();

break;

}

case 2:

{

printf("请输入释放空间的作业号:");

scanf("%d",&a);

printf("请输入释放空间的大小:");

scanf("%d",&b);

recovery(a,b);

Print();

break;

}

case 3:printf("\n");return;

}

}

}

void bestfit()

{

int a,b,i;

Init();

Print();

while(1)

{printf("\n1、申请空间\n");

printf("2、释放空间\n");

printf("3、退出最佳适应算法\n");

printf("请输入你的选择:");

scanf("%d",&i);

switch(i)

{

case 1:

{

printf("请输入申请空间的作业号:");

scanf("%d",&a);

printf("请输入申请空间的大小:");

scanf("%d",&b);

alloc(a,b);

sort();

Print();

break;

}

case 2:

{

printf("请输入释放空间的作业号:");

scanf("%d",&a);

printf("请输入释放空间的大小:");

scanf("%d",&b);

recovery(a,b);

sort();

Print();

break;

}

case 3:printf("\n");return;

}

}

}

void main()

{

int i;

while(1)

{

printf("1、首次适应算法\n");

printf("2、最佳适应算法\n");

printf("3、退出\n");

printf("请输入你的选择:");

scanf("%d",&i);

switch(i)

{

case 1:firstfit();break;

case 2:bestfit();break;

case 3:return;

}

}

}

运行结果

①开始界面

②首次适应算法

③最佳适应算法

程序代码——C++语言实现

//*************************************************************** //******** 动态分区分配方式的模拟 *********

//***************************************************************

#include

#include

#define Free 0 //空闲状态

#define Busy 1 //已用状态

#define OK 1 //完成

#define ERROR 0 //出错

#define MAX_length 640 //最大内存空间为640KB

typedef int Status;

typedef struct freearea//定义一个空闲区说明表结构

{

int ID; //分区号

long size; //分区大小

long address; //分区地址

int state; //状态

}ElemType;

//---------- 线性表的双向链表存储结构 ------------

typedef struct DuLNode //double linked list

{

ElemType data;

struct DuLNode *prior; //前趋指针

struct DuLNode *next; //后继指针

}DuLNode,*DuLinkList;

DuLinkList block_first; //头结点

DuLinkList block_last; //尾结点

Status alloc(int);//内存分配

Status free(int); //内存回收

Status First_fit(int,int);//首次适应算法

Status Best_fit(int,int); //最佳适应算法

void show();//查看分配

Status Initblock();//开创空间表

Status Initblock()//开创带头结点的内存空间链表

{

block_first=(DuLinkList)malloc(sizeof(DuLNode));

block_last=(DuLinkList)malloc(sizeof(DuLNode));

block_first->prior=NULL;

block_first->next=block_last;

block_last->prior=block_first;

block_last->next=NULL;

block_last->data.address=0;

block_last->data.size=MAX_length;

block_last->data.ID=0;

block_last->data.state=Free;

return OK;

}

//----------------------- 分配主存 ------------------------- Status alloc(int ch)

{

int ID,request;

cout<<"请输入作业(分区号):";

cin>>ID;

cout<<"请输入需要分配的主存大小(单位:KB):";

cin>>request;

if(request<0 ||request==0)

{

cout<<"分配大小不合适,请重试!"<

return ERROR;

}

if(ch==2) //选择最佳适应算法

{

if(Best_fit(ID,request)==OK) cout<<"分配成功!"<

return OK;

}

else //默认首次适应算法

{

if(First_fit(ID,request)==OK) cout<<"分配成功!"<

return OK;

}

}

//------------------ 首次适应算法 -----------------------

Status First_fit(int ID,int request)//传入作业名及申请量

{

//为申请作业开辟新空间且初始化

DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode));

temp->data.ID=ID;

temp->data.size=request;

temp->data.state=Busy;

DuLNode *p=block_first->next;

while(p)

{

if(p->data.state==Free && p->data.size==request)

{//有大小恰好合适的空闲块

p->data.state=Busy;

p->data.ID=ID;

return OK;

break;

}

if(p->data.state==Free && p->data.size>request)

{//有空闲块能满足需求且有剩余"

temp->prior=p->prior;

temp->next=p;

temp->data.address=p->data.address;

p->prior->next=temp;

p->prior=temp;

p->data.address=temp->data.address+temp->data.size; p->data.size-=request;

return OK;

break;

}

p=p->next;

}

return ERROR;

}

//-------------------- 最佳适应算法 ------------------------ Status Best_fit(int ID,int request)

{

int ch; //记录最小剩余空间

DuLinkList temp=(DuLinkList)malloc(sizeof(DuLNode)); temp->data.ID=ID;

temp->data.size=request;

temp->data.state=Busy;

DuLNode *p=block_first->next;

DuLNode *q=NULL; //记录最佳插入位置

while(p) //初始化最小空间和最佳位置

{

if(p->data.state==Free &&

(p->data.size>request || p->data.size==request) )

{

q=p;

ch=p->data.size-request;

break;

}

p=p->next;

}

while(p)

{

if(p->data.state==Free && p->data.size==request) {//空闲块大小恰好合适

p->data.ID=ID;

p->data.state=Busy;

return OK;

break;

}

if(p->data.state==Free && p->data.size>request)

{//空闲块大于分配需求

if(p->data.size-request

ch=p->data.size-request;//更新剩余最小值

q=p;//更新最佳位置指向

}

}

p=p->next;

}

if(q==NULL) return ERROR;//没有找到空闲块

else

{//找到了最佳位置并实现分配

temp->prior=q->prior;

temp->next=q;

temp->data.address=q->data.address;

q->prior->next=temp;

q->prior=temp;

q->data.address+=request;

q->data.size=ch;

return OK;

}

}

//----------------------- 主存回收 -------------------- Status free(int ID)

{

DuLNode *p=block_first;

while(p)

if(p->data.ID==ID)

{

p->data.state=Free;

p->data.ID=Free;

if(p->prior->data.state==Free)//与前面的空闲块相连

{

p->prior->data.size+=p->data.size;

p->prior->next=p->next;

p->next->prior=p->prior;

}

if(p->next->data.state==Free)//与后面的空闲块相连

{

p->data.size+=p->next->data.size;

p->next->next->prior=p;

p->next=p->next->next;

}

break;

}

p=p->next;

}

return OK;

}

//--------------- 显示主存分配情况 ------------------

void show()

{

cout<<"+++++++++++++++++++++++++++++++++++++++\n"; cout<<"+++ 主存分配情况 +++\n";

cout<<"+++++++++++++++++++++++++++++++++++++++\n"; DuLNode *p=block_first->next;

while(p)

{

cout<<"分区号:";

if(p->data.ID==Free) cout<<"Free"<

else cout<data.ID<

cout<<"起始地址:"<data.address<

cout<<"分区大小:"<data.size<<" KB"<

cout<<"状态:";

if(p->data.state==Free) cout<<"空闲"<

else cout<<"已分配"<

cout<<"——————————————"<

p=p->next;

}

//----------------------- 主函数---------------------------

void main()

{

int ch;//算法选择标记

cout<<" 动态分区分配方式的模拟 \n";

cout<<"************************************\n";

cout<<"** 1)首次适应算法 2)最佳适应算法 **\n";

cout<<"************************************\n";

cout<<"请选择分配算法:";

cin>>ch;

Initblock(); //开创空间表

int choice; //操作选择标记

while(1)

{

cout<<"********************************************\n"; cout<<"** 1: 分配内存 2: 回收内存 **\n";

cout<<"** 3: 查看分配 0: 退出 **\n";

cout<<"********************************************\n"; cout<<"请输入您的操作:";

cin>>choice;

if(choice==1) alloc(ch); // 分配内存

else if(choice==2) // 内存回收

{

int ID;

cout<<"请输入您要释放的分区号:";

cin>>ID;

free(ID);

}

else if(choice==3) show();//显示主存

else if(choice==0) break; //退出

else //输入操作有误

{

cout<<"输入有误,请重试!"<

continue;

}

}

}

分区分配算法的实现

分区分配算法的实现 实验要求: ?分区空闲表要表示出分区号、始址、大小 ?作业序列能够动态输入 ?内存不足,必须有提示功能 ?总结收获体会及对该题解的改进意见和见解 (红色字体为再修改处)

源代码: /********************操作系统实验四:首次适应(first fit)算法的分区分配算法*******************/ #include void main() { int m,n,i,j,j0,k,k0,A[30][3],B[30]; printf("请输入空闲分区块数:"); scanf("%d",&m); printf("\t分区号\t\t大小\t\t起始地址\n"); for(i=0;i

} } } printf("\n---------首次适应算法按地址从小到大排列后空闲区---------\n"); printf("\t分区号\t\t大小\t\t起始地址\n"); for(i=0;i

动态分区式存储管理

可变分区存储管理 设计思路: 整体思路: 可变分区管理方式将内存除操作系统占用区域外的空间看做一个大的空闲区。当作业要求装入内存时,根据作业需要内存空间的大小查询内存中的各个 空闲区,当从内存空间中找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业需求量划出一个分区装人该作业,作业执行完后,其所占的内存分区被收回,成为一个空闲区。如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。 设计所才用的算法: 采用最优适应算法,每次为作业分配内存时,总是把既能满足要求、又是最小的空闲分区分配给作业。但最优适应算法容易出现找到的一个分区可能只比作业所需求的长度略大一点的情行,这时,空闲区分割后剩下的空闲区就很小以致很难再使用,降低了内存的使用率。为解决此问题,设定一个限值min size,如果空闲区的大小减去作业需求长度得到的值小于等于min size,不再将空闲区分成己分分区和空闲区两部分,而是将整个空闲区都分配给作业。 内存分配与回收所使用的结构体: 为便于对内存的分配和回收,建立两张表记录内存的使用情况。一张为记录作业占用分区的“内存分配表”,内容包括分区起始地址、长度、作业名/标志(为0时作为标志位表示空栏目);一张为记录空闲区的“空闲分区表”,内容包括分区起始地址、长度、标志(0表空栏目,1表未分配)。两张表都采用顺序表形式。 关于分配留下的内存小碎片问题: 当要装入一个作业时,从“空闲分区表”中查找标志为“ 1”(未分配)且满足作业所需内存大小的最小空闲区,若空闲区的大小与作业所需大小的差值小于或等于min size,把该分区全部分配给作业,并把该空闲区的标志改为“0”(空栏目)。同时,在已分配区表中找到一个标志为“ 0”的栏目登记新装人作业所占用分区的起始地址,长度和作业名。若空闲区的大小与作业所需大小的差值大于

操作系统实验四实验报告动态分区分配算法

操作系统实验四 【实验题目】:动态分区分配算法 【实验学时】:4学时 【实验目的】 通过这次实验,加深对动态分区分配算法的理解,进一步掌握首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的实现方法。 【实验内容及要求】 问题描述: 设计程序模拟四种动态分区分配算法:首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法的工作过程。假设内存中空闲分区个数为n,空闲分区大小分别为P1, … ,P n,在动态分区分配过程中需要分配的进程个数为m(m≤n),它们需要的分区大小分别为S1, … ,S m,分别利用四种动态分区分配算法将m个进程放入n个空闲分区,给出进程在空闲分区中的分配情况。 程序要求: 1)利用首次适应算法、循环首次适应算法、最佳适应算法和最坏适应算法四种动态分区分配算法模拟分区分配过程。 2)模拟四种算法的分区分配过程,给出每种算法进程在空闲分区中的分配情况。 3)输入:空闲分区个数n,空闲分区大小P1, … ,P n,进程个数m,进程需要的分区大小S1, … ,S m。

4)输出:首次适应算法,循环首次适应算法,最佳适应算法,最坏适应算法,最终内存空闲分区的分配情况。 实现源代码: #include #include #include #include #define max 100 using namespace std; int work_num; int zone_num; struct Data{ int data; char name; }; Data *d=new Data[max]; struct Table{ int data; char array[max]; int length; };

动态分区分配算法资料

动态分区分配算法 一实验内容与要求 内容:动态分区分配是根据进程的实际需要,动态地为之分配内存空间,而在分配时,须按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业。在本实验中运用了三种分配算法,分别是1.首次适应算法,2.循环首次适应算法,3.最佳适应算法。 要求:动态分区算法也称为可变分区分配算法,常见的空闲区查找算法有首次适应算法,循环首次适应算法,最佳适应算法。特别注意分区回收时,相邻空闲分区需要合并。 (1)参考操作系统教材理解这3种分配算法以及回收算法。 (2)实现3种分配算法以及回收算法。 (3)已知作业申请内存和释放内存的序列,给出内存的使用情况。 (4)作业申请内存和释放内存的序列可以存放在文本文件中。 (5)设计简单的交互界面,演示所设计的功能。(可以使用MFC进行界面的设计) (6)可根据自己能力,在完成以上基本要求后,对程序功能进行适当扩充。 二、需求分析 本次实验通过用C语言进行编程并调试、运行,形象地表现出动态分区的分配方式,直观地展现了首次适应算法和最佳适应算法对内存的释放和回收方式之间的区别。加深了我们对两种算法优缺点的理解,帮助我们了解一些数据结构和分配算法,进一步加深我们对动态分区存储器管理方式及其实现过程的理解。主要的问题在于,如何解决两种算法对内存的释放和回收空间的表示。 动态分区分配:又称为可变分区分配,这种分配方式并不事先先将主存划分成一块块的分区,而是在作业进入主存时,根据作业的大小动态地建立分区。并使分区的大小正好适应作业的需要。因此系统中分区的大小是可变的,分区的数

目也是可变的。 分区分配算法: 1.首次适应法: 为作业选择分区时总是按地址从高到低搜索,只要找到可以容纳该作业的空白块,就把该空白块分配给该作业。 特点:优先利用内存中底地址部分的空闲分区 (将所有空闲区,按其地址递增的顺序链接) 2.循环首次适应算法 该算法是由首次适应算法演变而成,在为进程分配内存空间时,不再是每次都从第一个空间开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到第一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业,为实现本算法,设置一个全局变量f,来控制循环查找,当f%N==0时,f=0;若查找结束都不能找到一个满足要求的分区,则此次内存分配失败。 3.最佳适应算法: 接到内存申请时,在空闲块表中找到一个不小于请求的最小空块进行分配;为作业选择分区时总是寻找其大小最接近于作业所要求的存储区域。 三、概要设计 动态分区常用的数据结构有空闲分区表和空闲分区链,用来记录内存的使用情况,此题中我采用的是空闲分区链的结构,用链指针将所有的分区链接成一条链,每个分区的结构如下所示: typedef struct freearea//定义一个空闲区说明表结构 { int ID; //分区号 long size; //分区大小 long address; //分区地址 int state; //状态 }ElemType; typedef struct DuLNode //double linked list { ElemType data; struct DuLNode *prior; //前趋指针 struct DuLNode *next; //后继指针 }DuLNode,*DuLinkList;

动态分区分配方式模拟

使用动态分区分配方式的模拟 1内容 (1)用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc( )和回收过程free( )。其中,空闲分区通过空闲分区链来管理:在进行内存分配时,系统优先使用空闲区低端的空间。 (2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:?作业1申请130KB。 ?作业2申请60KB。 ?作业3申请100KB。 ?作业2释放60KB。 ?作业4申请200KB。 ?作业3释放100KB。 ?作业1释放130KB。 ?作业5申请140KB。 ?作业6申请60KB。 ?作业7申请50KB。 ?作业6释放60KB。 请分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次分配和回收后显示出空闲分区链的情况。 2、示例程序: //Tittle: 使用动态分区算法的模拟 //author: XuYongzhen #include #include #include #include using namespace std; typedef struct DuLNode{ struct DuLNode *prior; struct DuLNode *next; int address; int jsize; int jnumber;//显示分区被那个作业占用,显示零则为空闲分区; }DuLNode,*DuLinkList ; void CreatList(DuLinkList &L){ DuLinkList p=(DuLinkList)malloc(sizeof(DuLNode)); L->next=p; L->jnumber=100;//为释放头结点后面的结点空间做统一化处理 p->prior=L; p->next=NULL; p->jsize=600; p->address=0; p->jnumber=0;

实验报告-动态分区分配算法

南昌大学实验报告 学生姓名:马江涛学号: 8000612091 专业班级:计算机软件121班 实验类型:□验证□综合□设计□创新实验日期: 2014-05-08 实验成绩: 【实验要求】 1、编程实现首次适应算法和最佳适应算法的动态分区分配的分配过程和回收过程。其中,空闲分区通过分区链来管理;在进行内存分配时,系统优先使用空闲区低端的空间。 2、假设初始状态下,可用内存空间为640K,并依次有下列请求序列: 1)作业1申请130KB。 2)作业2申请60KB。 3)作业3申请100KB。 4)作业2释放60KB。 5)作业4申请200KB。 6)作业3释放100KB。 7)作业1释放130KB。 8)作业5申请140KB。 9)作业6申请60KB。 10)作业7申请50KB。 11)作业6释放60KB。 请分别用首次适应算法和最佳适应算法进行内存块的分配和回收,要求每次分配和回收后显示出空闲内存分区链的情况【可参考后文的实验提示】。 3、上机时认真的进行测试,输入不同的资源分配请求,写出实验结果; 4、具体要求: (1)对你的程序关键代码处进行注释。 (2)给出实验数据,对结果进行分析,说明对相关知识点的理解。 【实验目的】 了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。 【实验思路】 首次适应算法(First-fit):当要分配内存空间时,就查表,在各空闲区中查找满足大小要求的可用块。只要找到第一个足以满足要球的空闲块就停止查找,并把它分配出去;如果该空闲空间与所需空间大小一样,则从空闲表中取消该项;如果还有剩余,则余下的部分仍留在空闲表中,但应修改分区大小和分区始址。 最佳适应算法(Best-fit):当要分配内存空间时,就查找空闲表中满足要求的空闲块,并使得剩余块是最小的。然后把它分配出去,若大小恰好合适,则

动态分区分配管理系统

动态分区分配管理系统 学院 专业 学号 学生姓名 指导教师姓名 2014年3月14 日

目录 1程序设计的内容和相关的要求---------------------------------2 2程序总的功能说明--------------------------------------------3 3程序的模块的说明--------------------------------------------4 4程序设计的流程图--------------------------------------------5 5程序的操作说明及运行结果-----------------------------------7 6源程序-------------------------------------------------------11 7心得体会----------------------------------------------------27

1程序设计的内容和相关的要求: 课程设计的目的:操作系统课程设计是计算机学院重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。 ● 进一步巩固和复习操作系统的基础知识。 ● 培养学生结构化程序、模块化程序设计的方法和能力。 ● 提高学生调试程序的技巧和软件设计的能力。 ● 提高学生分析问题、解决问题以及综合利用C语言进行程序设计的能 力。 实现的任务:编写一个动态分区分配程序。 设计内容: 用高级语言编写和调试一个动态分区内存分配程序,演示实现下列两种动态分区分配算法 1.首次适应算法 2.循环首次适应算法 设计要求: 1.内存中有0-100M的空间为用户程序空间,最开始用户空间是空闲的; 2.作业数量、作业大小、进入内存空间、运行时间需要通过界面进行输入; 3.可读取样例数据(要求存放在外部文件夹中)进行作业数量、作业大小、进图内存时间、运行时间的初始化; 4.根据作业进图内存的时间,采用简单的先进先出原则进行从外村到内存的调度,作业具有等待(从外存进入内存执行)、装入(在内存可执行)、结束(运行结束,退出内存)三种状态。(为了简化,不考虑cpu的调度与切换,运行时间为作业在内存中驻留的时间); 5.能够自动进行内存分配与回收,可根据需要自动进行紧凑与拼接操作,所有过程均有动态图形变化的显示; 6.采用可视化界面,可随时暂停显示当前内存分配和使用情况图。 2程序总的功能说明: 本程序可以从界面直接输入作业并进行动态的内存分配,也可以自动地生成作业文件并自行调度进行内存分配,每次分配可以选择两种算法(首次适应算法和循环首次算法)中的一种,每次作业结束后可以进入操作主界面进行再次作业的操作。 首次适应算法(First-fit):当要分配内存空间时,就查表,在各空闲区中查找满足大小要求的可用块。只要找到第一个足以满足要球的空闲块就停止查找,并把它分配出去;

动态分区分配方式的模拟C语言代码和C代码

实验三使用动态分区分配方式的模拟 1、实验目的 了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。 2、实验内容 (1) 用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc( )和回收过程free( )。其中,空闲分区通过空闲分区链来管理:在进行内存分配时,系统优先使用空闲区低端的空间。 (2) 假设初始状态下,可用的内存空间为640KB,并有下列的请求序列: ?作业1申请130KB。 ?作业2申请60KB。 ?作业3申请100KB。 ?作业2释放60KB。 ?作业4申请200KB。 ?作业3释放100KB。 ?作业1释放130KB。 ?作业5申请140KB。 ?作业6申请60KB。 ?作业7申请50KB。 ?作业6释放60KB。 请分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次分配和回收后显示出空闲分区链的情况。 程序代码——C语言实现 #include #include struct node //空闲分区链结点的定义 { node *before; node *after; int size; int address; int state; }; node L; struct usenode { usenode *next; int num; int add; int size; }U,*n;

void Init() //空闲分区链的初始化 { node *p; p=(node *)malloc(sizeof(node)); p->before=&L; p->after=NULL; p->size=640; p->address=0; p->state=0; L.after=p; L.before=NULL; L.size=0; U.next=NULL; n=&U; } node *search(int a) { node *p=L.after; if(p==NULL) { printf("没有空闲的区域!"); p=NULL; return p; } else { while(p!=NULL && a>p->size) p=p->after; if(p==NULL) { printf("没有找到合适的空闲空间!"); p=NULL; return p; } else return p; } } void recovery(int a,int b) //内存回收算法 {

循环首次适应的动态分区分配算法模拟

课程设计报告 课程设计题目:循环首次适应的动态分区分配算法模拟 专业:计算机科学与技术 班级:10204102 姓名:谱 学号: 10204102 指导教师:高小辉 2013年1月11 日

目录 一.循环首次适应算法 (3) 1. 概述 (3) 2.需求分析 (3) 二.实验指导 (4) 1.基本思想 (4) 2.数据结构 (4) 三.运行环境 (6) 四.流程图 (6) 五.循环首次适应算法代码 (5) 六.调试结果 (11) 七、总结 (14) 八.参考文献 (14)

一.循环首次适应算法 1.概述: 该算法是由首次适应算法演变而成的。在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块的请求大小相等的内存空间分配给作业。为实现该算法,应设置一起始查找指针,用于指示下一次起始查询的空闲分区,并采用循环查找方式,即如果最后一个(链尾)空闲分区的大小仍不能满足要求,则返回到第一个空闲分区,比较大小是否满足,找到后,应调整起始查询指针。 2. 需求分析 了解动态分区分配中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。采用首次适应算法的动态分区分配过程alloc()和回收过程free()。 空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间,即每次分配内存空间是总是从低址部分开始进行循环,找到第一个合适的空间,便按作业所需分配的大小分配给作业。 作业完成时,需要释放作业所占空间,此时要考虑到四种情况: (1)回收区与插入点的前一个空闲分区相邻接。此时将二者合并,修改前一 分区的大小。 (2)回收区与插入点的后一空闲分区相邻接,将二者合并,用回收区的首址 作为新空闲区的首址。 (3)回收区同时与插入点的前后两个空闲分区相邻接,三者合并,使用前一空 闲分区的表项和首址。 (4)回收区单独存在。 二、实验指导 1.基本思想 动态分区是指系统不预先划分固定分区,而是在装入程序的时候划分内存区域,使得为程序分配的分区大小恰好等于该程序的需求量,且分区的个数是动态的。显然动态分区有较大的灵活性,较之固定分区能获得好的内存利用率。 2.数据结构 动态分区管理可以用两种数据结构实现,一种是已分配区表和空闲区表,也就是用预先定义好的系统空间来存放空间分配信息。

最新c++动态分区分配算法模拟(操作系统课程设计)

c++动态分区分配算法模拟(操作系统课程 设计)

课程设计 课程设计名称:操作系统课程设计 专业班级: 学生姓名: 学号: 指导教师: 课程设计时间:6月13日-——6月17日

计算机科学专业课程设计任务书 说明:本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页

1:需求分析 (1)用C语言实现采用首次适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端的空间。 (2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:作业1申请130KB;作业2申请60KB;作业3申请100KB;作业2释放60KB;作业4申请200 KB;作业3释放100 KB;作业1释放 130 KB;作业5申请140 KB;作业6申请60 KB;作业7申请 50KB;作业6释放60 KB。采用首次适应算法进行内存块的分配和回 收,同时显示内存块分配和回收后空闲内存分区链的情况。 2:概要设计 (1)数据结构:作业队列数据结构,用于存储待处理作业;阻塞作业队列数据结构,用于存储阻塞的作业。已分配内存块的双向链表,记录当前系 统已分配的各个内存块;未分配内存块的双向链表,记录系统中剩余的 各个内存块;系统内存分配总情况的结点对象,记录系统中阻塞的作业 总数,已分配的内存块数,剩余的内存块数。 (2)主函数:对作业队列、阻塞队列、已分配内存块链表、未分配内存块链表、系统总内存分配情况结点对象进行初始化,调用分配函数或回收函 数,循环处理11个作业步。 (3)分配函数alloc():首次适应算法检索未分配的内存块链表,若找到合适的内存块,则加以判断,空闲内存块大小减去作业去请求内存块大小小于

存储管理分区分配算法

/*9.3.2 源程序*/ /***pcb.c***/ #include "stdio.h" #include "stdlib.h" #include "string.h" #define MAX 32767 typedef struct node /*设置分区描述器*/ { int address,size; struct node *next; }RECT; /*函数原型*/ RECT *assignment(RECT *head,int application); void acceptment1(RECT *head,RECT *back1); void acceptment2(RECT *head,RECT *back1) ; int backcheck(RECT *head,RECT *back1); void print(RECT *head); /*变量声明*/ RECT *head,*back,*assign1,*p; int application1,maxblocknum; char way; /*主函数*/ main() { char choose[10]; int check; head=malloc(sizeof(RECT)); /*建立可利用区表的初始状态*/ p=malloc(sizeof(RECT)); head->size=MAX; head->address=0; head->next=p; maxblocknum=1; p->size=MAX; p->address=0; p->next=NULL; print(head); /*输出可利用表初始状态*/ printf("Enter the way(best or first(b/f)\n");/*选择适应策略*/ scanf("%c",&way); do{ printf("Enter the assign or accept(as/ac)\n"); scanf("%s",choose); /*选择分配或回收*/ if(strcmp(choose,"as")==0) /*as为分配*/ { printf("Input application:\n");

实验四动态分区分配算法实验分析报告及程序

实验四动态分区分配算法实验报告及程序

————————————————————————————————作者:————————————————————————————————日期:

实验报告四动态分区分配算法 班级学号姓名 一、实验目的 动态分区分配是根据进程的实际需要,动态地为之分配内存空间,而在分配时,须按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业。在本实验中运用了四种分配算法,分别是 1.首次适应算法,2.循环首次适应算法,3.最坏适应算法4.最佳适应算法。 二、实验环境 普通的计算机一台,编译环境Microsoft Visual C++ 6.0 三、算法思想 1.数据结构 (1)分区开始地址startaddress (2)分区大小size (3)分区状态state 2.功能介绍 (1)首次适应算法 在首次适应算法中,是从已建立好的数组中顺序查找,直至找到第一个大小能满足要求的空闲分区为止,然后再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空间令开辟一块新的地址,大小为原来的大小减去作业大小,若查找结束都不能找到一个满足要求的分区,则此次内存分配失败。 (2)循环首次适应算法 该算法是由首次适应算法演变而成,在为进程分配内存空间时,不再是每次都从第一个空间开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到第一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业,为实现本算法,设置一个全局变量f,来控制循环查找,当f%N==0时,f=0;若查找结束都不能找到一个满足要求的分区,则此次内存分配失败。

动态分区分配存储管理系统

动态分区分配存储管理系统 一、设计目的与内容 用高级语言编写和调试一个动态分区内存分配程序,演示实现下列两种动态分区分配算 法 1)首次适应算法 2)循环首次适应算法 1. 内存中有0-100M 的空间为用户程序空间,最开始用户空间是空闲的。 2. 作业数量、作业大小、进入内存时间、运行时间需要通过界面进行输入。 3. 可读取样例数据(要求存放在外部文件中)进行作业数量、作业大小、进入内存时间、 运行时间的初始化。 4. 根据作业进入内存的时间,采用简单的先进先出原则进行从外存到内存的调度,作业具 有等待(从外存进入内存执行)、装入(在内存可执行)、结束(运行结束,退出内存)三种状态。 5. 能够自动进行内存分配与回收,可根据需要自动进行紧凑与拼接操作。 二、算法的基本思想 1、定义基本结构: 1作业结构: typedef struct JOB { int num; //作业号 int size; //作业大小 int ctime; //作业进入时间 int rtime; //作业运行时间 int state; //作业状态 }Job ; 2)分区结构: typedef struct DuLNode { int ID; //分区号 int start; //开始地址 int size; //大小 int state; //0=尚未使用1=使用2=释放 struct DuLNode *prior;//前驱指针 struct DuLNode *next; //后即指针 }DuLNode, * DuLinkList;

2、基本操作: int Firstfit(int);//首次适应算法 int Next_fit(int); //循环首次适应算法 void showJob(int); //显示作业表 void showPartiton(DuLinkList);//显示分区表 DuLinkList InitpartitionList(DuLinkList &p);//初始化 void huishou(DuLinkList pl3,DuLinkList &pl);//回收函数 int Putin(int &n);//输入函数,输入作业相关信息 3、首次适应算法 空闲分区链以地址递增的次序链接,分配内存时,从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区为止;然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,取消的空闲分区仍留在空闲链中。若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败,返回。 4、循环首次适应算法 在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直至找到一个能满足要求的空闲分区,从中划出一块与请求大小相等的内存空间分配给作业。

操作系统课程设计动态分区分配存储管理

操作系统课程设计 动态分区分配存储管理 吕 霆 计算机10-01班 设计题目 学 号 专业班级 学生姓名 指导教师

第一章课程设计概述 1.1 设计任务: 动态分区分配存储管理 1.2 设计要求 建立描述内存分配状况的数据结构; 建立描述进程的数据结构; 使用两种方式产生进程:(a)自动产生,(b)手工输入; 在屏幕上显示内存的分配状况、每个进程的执行情况; 建立分区的分配与回收算法,支持紧凑算法; 时间的流逝可用下面几种方法模拟:(a)按键盘,每按一次可认为过一个时间单位; (b) 响应WM_TIMER; 将一批进程的执行情况存入磁盘文件,以后可以读出并重放; 支持算法:首次适应算法、循环首次适应算法、最佳适应算法:最坏适应算法。1.3 设计目的 旨在让我们更好的了解动态分区管理方面的知识. 第二章原理及算法描述 2.1动态分区分配算法原理 首次适应算法 * 算法概述:分配内存时,从链首开始顺序查找,找到满足的空闲分区则划出空间分配,余下的空闲空间仍保留在空闲链表中 * 实现方法:分配时从数组第一个元素开始比较,若符合条件则将该元素减去对应作业的值 循环首次适应算法 * 算法概述:由首次适应算法演变,只是每次分配改为由上一次找到的空闲分区开始查找 * 实现方法:在首次适应算法的基础上增加一个值用于记录找到的空闲分区的位置 最佳适应算法 * 算法概述:每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区

分配给作业 * 实现方法:我们决定每次分配先把空闲分区按从小到大的顺序排列,然后将第一个匹配分区分配给作业 最坏适应算法 * 算法概述:每次为作业分配内存时,总是挑选一个最大的空闲分区分割给作业使用 * 实现方法:算法与最佳适应算法几乎相同,仅在排序时把空闲分区表按从大到小的顺序排列,所以未作详细注释 回收分区 当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链(表)中找到相应的插入点,此时可能出现以下四种情况之一; 1)回收区与插入点的前一个空闲分区F1相邻接,此时应将回收区与插入点的前一分 区合并,不必为回收区分配新表项,而只需修改其前一分区F1的大小. 2)回收分区与插入点的后一空闲分区F2相邻接,此时也可将两分区合并,形成新的 空闲分区,但用回收区的首址作为新空闲区的首址,大小为两者之和. 3)回收区同时与插入点的前,后两个分区邻接,此时将三个分区合并,使用F1的表项 和F1的首址,取消F2的表项,大小为三者之和. 4)回收区既不与F1相邻接,又不与F2邻接.这时应为回收区单独建立一新表项,填 写回收区的首址和大小,并根据其首址插入到空闲链中的适当位置. 紧凑算法 通过移动内存中的作业的位置,以把原来多个分散的小分区拼接成一个大分区的方法. 第三章开发环境 此程序是本人利用c++语言在vs2012的开发环境中实现的 第四章程序实现--数据结构 #include #include #include using namespace std; ofstream stream;//输出流对象 int ary1[20][4];//内存分配状态 int ary2[20][3];//空闲分区状态 int ary3[10];//进程分配状态

动态分区分配存储管理系统

动态分区分配存储管理系统 学院 专业 学号 学生姓名 指导教师姓名 2014年3月19 日

一、课题要求 课程设计的目的: 操作系统课程设计是计算机专业重要的教学环节,它为学生提供了一个既动手又动脑,将课本上的理论知识和实际有机的结合起来,独立分析和解决实际问题的机会。 ● 进一步巩固和复习操作系统的基础知识。 ● 培养学生结构化程序、模块化程序设计的方法和能力。 ● 提高学生调试程序的技巧和软件设计的能力。 ● 提高学生分析问题、解决问题以及综合利用C 语言进行程序设计的能力。 设计内容: 用高级语言编写和调试一个动态分区内存分配程序,演示实现下列两种动态分区分配算法 1. 首次适应算法 2. 循环首次适应算法 设计要求: 1. 内存中有0-100M 的空间为用户程序空间,最开始用户空间是空闲的 2. 作业数量、作业大小、进入内存时间、运行时间需要通过界面进行输入 3. 可读取样例数据(要求存放在外部文件中)进行作业数量、作业大小、进入内存 时间、运行时间的初始化 4. 根据作业进入内存的时间,采用简单的先进先出原则进行从外存到内存的调度, 作业具有等待(从外存进入内存执行)、装入(在内存可执行)、结束(运行结束, 退出内存)三种状态。(为了简化,不考虑CPU 的调度与切换,运行时间为作业 在内存中驻留的时间) 5. 能够自动进行内存分配与回收,可根据需要自动进行紧凑与拼接操作,所有过程 均有动态图形变化的显示 6. 采用可视化界面,可随时暂停显示当前内存分配和使用情况图。 设计结束需提交下列资料: 1、课程设计报告。报告中至少应包括:相关操作系统的知识介绍,程序总的功能说明、程序各模块的功能说明、程序设计的流程图、源程序清单。 2、源程序和编译连接后的可执行程序文件。 时间安排: 分析设计贮备阶段(1 天) 编程调试阶段(7 天) 写课程设计报告、考核(2 天)

操作系统实验—动态分区分配算法

操作系统实验报告实验2 动态分区分配算法 报告日期:2016-6-15 姓名: 学号: 班级: 任课教师:

实验2 动态分区分配算法 一、实验内容 编写一个内存动态分区分配模拟程序,模拟内存的分配和回收的完整过程。 二、实验目的 一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理 解在可变分区管理方式下应怎样实现主存空间的分配和回收。 三、实验原理 模拟在可变分区管理方式下采用最先适应算法实现主存分配和回收。 (1)可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。例如: 为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下: 第一栏 第二栏 其中,起址——指出一个空闲区的主存起始地址。 长度——指出从起始地址开始的一个连续空闲的长度。 状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区。

(2) 当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分给作业占用;另一部分又成为一个较小的空闲区。为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。 (3) 采用最先适应算法(顺序分配算法)分配主存空间。 按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。 由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。 (4) 当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。 (5) 请按最先适应算法设计主存分配和回收的程序。假设初始时主存中没有作业,现按下面序列进行内存的申请与释放: 作业1申请300K,作业2申请100K,作业1释放300K,作业3申请150K, 作业4申请30K,作业5申请40K,作业6申请60K,作业4释放30K。 请你为它们进行主存分配和回收,把空闲区说明表的初值以及每次分配或回收后的变化显示出来或打印出来。 四、实验报告 1. 画出算法流程图。

实验四--动态分区分配方式的模拟-答案

动态分区分配方式的模拟 第一部分设计思想的说明 1 设计目标 用C语言或C++语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链表来管理,在进行内存分配时,系统优先使用空闲区低端空间。 预期结果:假设初始状态如下,可用的内存空间为640KB,并有下列请求序列: 作业1 申请 130KB 作业2 申请 60KB 作业3 申请 100KB 作业2 释放 60KB 作业4 申请 200KB 作业3 释放 100KB 作业1 释放 130KB 作业5 申请 140KB 作业6 申请 60KB 作业7 申请 50KB 作业6 释放 60KB 分别用首次适应算法和最佳适应算法进行内存块的分配和回收,同时显示内存块分配和回收后空闲内存分区链的情况。 2、设计理论 首次适应算法(First-fit):当要分配内存空间时,就查表,在各空闲区中查找满足大小要求的可用块。只要找到第一个足以满足要球的空闲块就停止查找,并把它分配出去;如果该空闲空间与所需空间大小一样,则从空闲表中取消该项;如果还有剩余,则余下的部分仍留在空闲表中,但应修改分区大小和分区始址。 最佳适应算法(Best-fit):当要分配内存空间时,就查找空闲表中满足要求的空闲块,并使得剩余块是最小的。然后把它分配出去,若大小恰好合适,则直按分配;若有剩余块,则仍保留该余下的空闲分区,并修改分区大小的起始地址。 内存回收:将释放作业所在内存块的状态改为空闲状态,删除其作业名,设置为空。并判断该空闲块是否与其他空闲块相连,若释放的内存空间与空闲块相连时,则合并为同一个空闲块,同时修改分区大小及起始地址。

实验四动态分区分配算法

实验容:存储器管理实验 一、实验目的 采用首次适应算法(FF),最佳适应算法(BF),最坏适应算法(WF)三种不同的算法,实现对系统空闲区的动态分区分配。 二、实验题目 给予顺序搜索的动态分区算法的程序。 三、实验要求 读懂给出的核心代码,进行适当的修改,编译通过后,完成实验报告。 四、核心代码 #include #include #include //常量定义 #define PROCESS_NAME_LEN 32 #define MIN_SLICE 10 #define DEFAULT_MEM_SIZE 1024 #define DEFAULT_MEM_START 0 #define MA_FF 1 #define MA_BF 2 #define MA_WF 3 int mem_size=DEFAULT_MEM_SIZE; int ma_algorithm = MA_FF; static int pid = 0; int flag = 0; struct free_block_type{ int size;

int start_addr; struct free_block_type *next; }; struct free_block_type *free_block; //描述已分配的存块 struct allocated_block{ int pid; int size; int start_addr; char process_name[PROCESS_NAME_LEN]; struct allocated_block *next; }; struct allocated_block *allocated_block_head = NULL; //函数声明 struct free_block_type* init_free_block(int mem_size); void display_menu(); int set_mem_size(); void set_algorithm(); void rearrange(int algorithm); int rearrange_FF(); int rearrange_BF(); int rearrange_WF(); int new_process(); int allocate_mem(struct allocated_block *ab); void kill_process(); int free_mem(struct allocated_block *ab); int dispose(struct allocated_block *free_ab); int display_mem_usage(); void do_exit(); struct allocated_block *find_process(int pid); int main(){ char choice; pid=0; free_block= init_free_block(mem_size); //初始化空闲区while(1) { display_menu(); //显示菜单 fflush(stdin); choice=getchar(); //获取用户输入 switch(choice){ case '1': set_mem_size(); break; //设置存大小 case '2': set_algorithm();flag=1; break;//设置算法 case '3': new_process(); flag=1; break;//创建新进程

相关主题
文本预览
相关文档 最新文档