📄 8.cpp
字号:
操作系统课程设计报告_首次适应算法
作者 学友集 查看 1531 发表时间 2006/12/23 06:28 【论坛浏览】
呵呵,给大家共享一下实验报告,随便写的,觉得有用便拿去用吧.xxjjmz
xxjjmz
一、实验目的:xxjjmz
熟悉首次适应算法,理解分配内存资源及回收资源的方法,加深记意。xxjjmz
二、实验环境:xxjjmz
Win2000/winxp VC++6.0xxjjmz
三、实验内容:xxjjmz
编程实现初次内存分配算法、新申请资源分配算法、删除进程算法,回收合并算法等。xxjjmz
四.实验函数xxjjmz
程序主要以链表实现,相关函数如下:xxjjmz
1.void Init(memoryspace &L,int size)xxjjmz
初始化空间段,大小可自定。xxjjmz
2.void choice(memoryspace &L)xxjjmz
选择对作业的操作类型,选0退出程序,先1新建作业,输出已经分配和空闲资源情况,选3删除某作业,选4回收资源。xxjjmz
3.void Add(memoryspace &L)xxjjmz
添加的作业。xxjjmz
4.void Display(const memoryspace L)xxjjmz
输出已经分配和空闲结点。xxjjmz
5.void deltask(const memoryspace L)xxjjmz
输出已经分配和空闲资源情况。xxjjmz
6.void setfree(memoryspace &L)xxjjmz
回收空闲空间,若存在连续的空闲结点则合并。xxjjmz
五.实验代码:xxjjmz
程序代码xxjjmz
#include xxjjmz
#include xxjjmz
typedef struct LNodexxjjmz
{ int size; //内存大小xxjjmz
int state; //0表示空闲,1表示已经装入作业xxjjmz
char task_name; //装入的作业名称xxjjmz
struct LNode *next;xxjjmz
}LNode,*memoryspace;xxjjmz
void Init(memoryspace &L,int size); //初始化空间段xxjjmz
void choice(memoryspace &L); //选择操作类型xxjjmz
void Add(memoryspace &L); //添加作业xxjjmz
void Display(const memoryspace L); //显示作业xxjjmz
void deltask(const memoryspace L); //删除作业xxjjmz
void setfree(memoryspace &L); //回收空闲空间xxjjmz
void main()xxjjmz
{xxjjmz
memoryspace L=new LNode; //memoryspacexxjjmz
int N;xxjjmz
cout<<"初始多大空间,请输入一个整数:"<xxjjmz
cin>>N;xxjjmz
Init(L,N); //初始化大小为1000的内存空间xxjjmz
choice(L); //进入操作xxjjmz
}xxjjmz
void Init(memoryspace &L,int size) //初始化空间段xxjjmz
{xxjjmz
memoryspace p = new LNode;xxjjmz
p->size = size;xxjjmz
p->state = 0;xxjjmz
p->task_name = 'n';xxjjmz
p->next = NULL;xxjjmz
L->next = p;xxjjmz
}xxjjmz
void setfree(memoryspace &L) //找出连续的空闲资源,回收空闲空间xxjjmz
{xxjjmz
memoryspace p=L->next,q=p->next;xxjjmz
while(p && q)xxjjmz
{xxjjmz
if(p->state == 0 && q->state == 0) //如果空间连续,则回收xxjjmz
{xxjjmz
p->size +=q->size;xxjjmz
p->next = p->next->next;xxjjmz
delete q;xxjjmz
q=p->next;xxjjmz
}xxjjmz
elsexxjjmz
{xxjjmz
p = q;xxjjmz
q = q->next;xxjjmz
}xxjjmz
}xxjjmz
cout<<"回收成功"<xxjjmz
}xxjjmz
void deltask(const memoryspace L) //删除作业xxjjmz
{xxjjmz
char task_name;xxjjmz
int flag=0;xxjjmz
Display(L);xxjjmz
cout<<"请输入需要回收的作业名称:";xxjjmz
cin>>task_name;xxjjmz
xxjjmz
memoryspace p=L,q=L->next;xxjjmz
while(q)xxjjmz
{xxjjmz
if(q->task_name == task_name)xxjjmz
{xxjjmz
q->state=0;xxjjmz
q->task_name='?';xxjjmz
flag=1;xxjjmz
break;xxjjmz
}xxjjmz
elsexxjjmz
{xxjjmz
p = q;xxjjmz
q = q->next; //找到要删除作业的下一个结点xxjjmz
}xxjjmz
}xxjjmz
if(flag == 0)xxjjmz
cout<<"删除作业不成功"<xxjjmz
elsexxjjmz
cout<<"删除作业成功"<xxjjmz
}xxjjmz
xxjjmz
void Display(const memoryspace L) //显示作业xxjjmz
{xxjjmz
int count=1;xxjjmz
memoryspace p = L->next;xxjjmz
cout<<"结点号 作业 状态 大小"<xxjjmz
while(p)xxjjmz
{xxjjmz
cout<<"结点"<xxjjmz
cout<state<<" "<size<xxjjmz
p = p->next;xxjjmz
count++;xxjjmz
}xxjjmz
}xxjjmz
xxjjmz
void Add(memoryspace &L) //添加作业xxjjmz
{xxjjmz
int new_size;xxjjmz
char new_name;xxjjmz
memoryspace q=L,p = L->next;xxjjmz
cout<<"请输入新任务的名称:";xxjjmz
cin>>new_name;xxjjmz
cout<<"请输入新任务的大小:";xxjjmz
cin>>new_size;xxjjmz
xxjjmz
while(p) //查找空闲资源进行分配xxjjmz
{xxjjmz
if (new_size<=0)xxjjmz
{xxjjmz
cout<xxjjmz
break;xxjjmz
}xxjjmz
if(p->state==0 && p->size >= new_size) xxjjmz
{ xxjjmz
//****************************************************//xxjjmz
memoryspace q = new LNode;xxjjmz
q->size = p->size - new_size; xxjjmz
q->state = 0;xxjjmz
q->task_name='?';xxjjmz
q->next=NULL;xxjjmz
//****************************************************//xxjjmz
p->size = new_size;xxjjmz
p->state = 1;xxjjmz
p->task_name=new_name;xxjjmz
q->next = p->next;xxjjmz
p->next = q;xxjjmz
break; //分配完成便退出xxjjmz
}xxjjmz
elsexxjjmz
{xxjjmz
p = p->next; //移动到足够分配的空结点xxjjmz
}xxjjmz
if(!p)xxjjmz
{xxjjmz
cout<<"作业"<xxjjmz
break;xxjjmz
}xxjjmz
}xxjjmz
p = L->next;xxjjmz
while(p) //删除大小为0的结点,当分配空间完时会出现0结点xxjjmz
{xxjjmz
if(p->size == 0)xxjjmz
{xxjjmz
q->next = q->next->next;xxjjmz
delete p;xxjjmz
p = q->next;xxjjmz
}xxjjmz
else xxjjmz
{xxjjmz
q = p;xxjjmz
p = p->next;xxjjmz
}xxjjmz
}xxjjmz
}xxjjmz
void choice(memoryspace &L) //选择操作类型xxjjmz
{ xxjjmz
int choice;xxjjmz
doxxjjmz
{xxjjmz
cout<<"0.退出本程序"<xxjjmz
cout<<"1.添加新的作业"<xxjjmz
cout<<"2.显示当前作业"<xxjjmz
cout<<"3.删除一条作业"<xxjjmz
cout<<"4.回收空闲空间"<xxjjmz
cout<xxjjmz
cin>>choice;xxjjmz
switch(choice)xxjjmz
{xxjjmz
case 0:xxjjmz
exit(1);break;xxjjmz
case 1:xxjjmz
Add(L); break;xxjjmz
case 2:xxjjmz
Display(L); break; xxjjmz
case 3:xxjjmz
deltask(L); break;xxjjmz
case 4:xxjjmz
setfree(L); break;xxjjmz
default:xxjjmz
cout<<"请输入正确的选择!"<xxjjmz
break;xxjjmz
}xxjjmz
cout<xxjjmz
}while(choice!=0 ||choice!=1 || choice !=2 || choice!=3 || choice!=4);xxjjmz
}xxjjmz
xxjjmz
六.实验总结xxjjmz
在一般的操作系统中,进程量都不是很大,于是添加新作业及回收资源的时候都是遍历整个链表对每个结点进行操作,这样也使算法易于实现.通过本次实验,我对操作系统的内存分配方法有了进一步的理解.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -