操作系统课程设计报告主存空间的分配与回收Word格式文档下载.docx

上传人:b****5 文档编号:20031784 上传时间:2023-01-16 格式:DOCX 页数:15 大小:77.63KB
下载 相关 举报
操作系统课程设计报告主存空间的分配与回收Word格式文档下载.docx_第1页
第1页 / 共15页
操作系统课程设计报告主存空间的分配与回收Word格式文档下载.docx_第2页
第2页 / 共15页
操作系统课程设计报告主存空间的分配与回收Word格式文档下载.docx_第3页
第3页 / 共15页
操作系统课程设计报告主存空间的分配与回收Word格式文档下载.docx_第4页
第4页 / 共15页
操作系统课程设计报告主存空间的分配与回收Word格式文档下载.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

操作系统课程设计报告主存空间的分配与回收Word格式文档下载.docx

《操作系统课程设计报告主存空间的分配与回收Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计报告主存空间的分配与回收Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。

操作系统课程设计报告主存空间的分配与回收Word格式文档下载.docx

实验环境

硬件环境:

Windows7系统

软件环境:

VC++6.0开发工具

总体设计

本次课程设计中主要是模拟主存分配与回收,考虑到一个进程的五个状态,初始,就绪,等待,执行,终止五个状态,所以决定从一个进程的运行过程进行模拟,总体流程大致是首先创建一个进程即填写PCB信息,然后将进程送到后备集合,然后从后备集合从取出一个进程进行是分配。

如果能分配,就将其送入就绪集合,然后从就绪集合中取出一个进程运行一个时间片(即一秒钟),接着将该进程送入就绪集合,如果运行时间减为零,就不送入就绪集合中。

考虑到实际的需要,我添加了一个挂起状态,还添加了一个撤销进程函数,一个强制回收函数。

在本次设计中用多线程模拟多进程,所以各个共享表都应该设置为线程安全的。

程序框图及流程图

程序框图:

程序流程图:

主要源代码及注释

#include<

stdio.h>

stdlib.h>

string.h>

#defineOK1

#defineERROR0

typedefintStatus;

typedefstructnode//定义一个空闲区说明表结构

{

intnum;

//分区序号

longstart;

//起始地址

longlength;

//分区大小

intstate;

//分区状态

chartag[20];

//作业名称

}job;

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

jobdata;

structNode*prior;

//前趋指针

structNode*next;

//后继指针

}Node,*LinkList;

LinkListfirst;

//头结点

LinkListend;

//尾结点

intflag;

//记录要删除的分区序号

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

{

first=(LinkList)malloc(sizeof(Node));

end=(LinkList)malloc(sizeof(Node));

first->

prior=NULL;

next=end;

end->

prior=first;

next=NULL;

data.num=1;

data.start=0;

data.length=600;

data.state=0;

strcpy(end->

data.tag,"

无作业"

);

returnOK;

}

voidsort()//分区序号重新排序

Node*p=first->

next,*q;

q=p->

next;

for(;

p!

=NULL;

p=p->

next)

{

for(q=p->

q;

q=q->

{

if(p->

data.num>

=q->

data.num)

q->

data.num+=1;

}

}

//显示主存分配情况

voidshow()

{intflag=0;

//用来记录分区序号

Node*p=first;

p->

data.num=0;

data.length=0;

data.state=1;

strcpy(p->

"

sort();

printf("

\n\t\t》主存空间分配情况《\n"

**********************************************************\n\n"

分区序号\t作业名\t\t起始地址\t分区大小\t分区状态\n\n"

p=p->

while(p)

%d\t\t%s\t\t%d\t\t%d"

p->

data.num,p->

data.tag,p->

data.start,p->

data.length);

if(p->

data.state==0)printf("

\t\t空闲\n\n"

elseprintf("

\t\t已分配\n\n"

//首次适应算法

StatusFirst_fit(intrequest,charname[20])

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

LinkListtemp=(LinkList)malloc(sizeof(Node));

temp->

data.length=request;

strcpy(temp->

data.tag,name);

if((p->

data.state==0)&

&

(p->

data.length==request))

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

break;

elseif((p->

data.state==0)&

(p->

data.length>

request))

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

prior=p->

prior;

next=p;

data.start=p->

data.start;

data.num=p->

data.num;

prior->

next=temp;

prior=temp;

data.start=temp->

data.start+temp->

data.length;

data.length-=request;

returnERROR;

//最佳适应算法

StatusBest_fit(intrequest,charname[20])

intch;

//记录最小剩余空间

Node*q=NULL;

//记录最佳插入位置

p->

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

=request))

if(q==NULL)

q=p;

ch=p->

data.length-request;

elseif(q->

data.length>

data.length)//找到最小插入空闲块

if(q==NULL)returnERROR;

//没有找到空闲块

data.length==request)//相等字节写入

q->

else//不相等,把节点插入链表

prior=q->

next=q;

data.start=q->

data.num=q->

data.start+=request;

data.length=ch;

//最差适应算法

StatusWorst_fit(intrequest,charname[20])

//记录最大剩余空间

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

data.state==0&

data.length<

data.length)//找到插入最大空闲快

data.length==request)

data.length=1;

else

//主存回收

Statusrecovery(intflag)

next)

data.num==flag)

{

prior==first)

next!

=end)//当前P指向的下一个不是最后一个时

if(p->

next->

data.state==0)//与后面的空闲块相连

data.length+=p->

prior=p;

next=p->

strcpy(p->

data.num=flag;

}

else

{

p->

strcpy(p->

}

next==end)//当前P指向的下一个是最后一个时

strcpy(p->

}//结束if(p->

prior==block_first)的情况

elseif(p->

prior!

=first)

=end)

deal1(p);

deal2(p);

=block_first)的情况

}//结束if(p->

data.num==flag)的情况

\t****回收成功****"

//主函数

voidmain()

inti;

//操作选择标记

inta;

//算法选择标记

printf("

**********************************************************\n"

\t\t用以下三种方法实现主存空间的分配\n"

\t

(1)首次适应算法\t

(2)最佳适应算法\t(3)最差适应算法\n"

\n"

请输入所使用的内存分配算法:

scanf("

%d"

&

a);

while(a<

1||a>

3)

输入错误,请重新输入所使用的内存分配算法:

switch(a)

case1:

\n\t****使用首次适应算法:

****\n"

break;

case2:

\n\t****使用最佳适应算法:

case3:

\n\t****使用最坏适应算法:

Initblock();

//开创空间表

while

(1)

show();

\t1:

分配内存\t2:

回收内存\t0:

退出\n"

请输入您的操作:

i);

if(i==1)

allocation(a);

//分配内存

elseif(i==2)//内存回收

请输入您要释放的分区号:

flag);

recovery(flag);

elseif(i==0)

printf("

\n退出程序\n"

break;

//退出

else//输入操作有误

输入有误,请重试!

continue;

程序测试及结果分析

程序测试:

初始化:

显示功能:

实验总结

这次实验比较复杂,用了很多时间,但同时收获了很多,对主存空间分配认识加深了很多。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1