操作系统课程设计报告_主存空间的分配与回收
- 格式:doc
- 大小:102.50 KB
- 文档页数:16
内容及要求
设计要求: 1.设计基于空闲区说明表的可变分区分配与回收算法; 2.或设计基于空闲区链表的可变分区分配与回收算法; 3.画出以上算法流程图; 4.编程实现算法功能; 5.编写课程设计说明书。 工作量要求:完成以上设计要求中的所有算法功能。
实验环境
硬件环境:
Windows 7系统
软件环境:
end->data.state=0;
strcpy(end->data.tag,"无作业");
return OK;
}
void sort()//分区序号重新排序
{
Node *p=first->next,*q;
q=p->next;
for(;p!=NULL;p=p->next)
{
for(q=p->next;q;q=q->next)
p=p->next;
while(p)
{
printf("%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");
else printf("\t\t已分配\n\n");
p=p->next;
}
printf("**********************************************************\n\n");
}
//首次适应算法
Status First_fit(int request,char name[20])
{
//为申请作业开辟新空间且初始化
end=(LinkList)malloc(sizeof(Node));
first->prior=NULL;
first->next=end;
end->prior=first;
end->next=NULL;
end->data.num=1;
end->data.start=0;
end->data.length=600;
VC++6.0开发工具
总体设计
本次课程设计中主要是模拟主存分配与回收,考虑到一个进程的五个状态,初始,就绪,等待,执行,终止五个状态,所以决定从一个进程的运行过程进行模拟,总体流程大致是首先创建一个进程即填写PCB信息,然后将进程送到后备集合,然后从后备集合从取出一个进程进行是分配。如果能分配,就将其送入就绪集合,然后从就绪集合中取出一个进程运行一个时间片(即一秒钟),接着将该进程送入就绪集合,如果运行时间减为零,就不送入就绪集合中。考虑到实际的需要,我添加了一个挂起状态,还添加了一个撤销进程函数,一个强制回收函数。在本次设计中用多线程模拟多进程,所以各个共享表都应该设置为线程安全的。
{
int num; //分区序号
long start; //起始地址
long length; //分区大小
int state; //分区状态
char tag[20];//作业名称
}job;
typedef struct Node// 线性表的双向链表存储结构
{
job data;
struct Node *prior; //前趋指针
操作系统课程设计报告
学院:计算机科学与技术学院 专业:软件工程 班级:软件***班
姓 名
****
学 号
********
实验组
***
实验时间
指导教师
*****
成 绩
实验项目名称
主存空间的分配与回收
实验目的
通过该课程设计使我们理解在不同的存储管理方式下,如何实现主存空间的分配与回收。使学生初步具有研究、设计、编制和调试操作系统模块的能力
Node *p=first->next;
LinkList temp=(LinkList)malloc(sizeof(Node));
temp->data.length=request;
temp->data.state=1;
strcpy(temp->data.tag,name);
p->data.num=1;
程序框图及流程图
程序框图:
程序流程图:
主要源代码及注释
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef struct node//定义一个空闲区说明表结构
struct Node *next; //后继指针
}Node,*LinkList;
LinkList first; //头结点
LinkList end; //尾结点
int flag;//记录要删除的分区序号
Status Initblock()//开创带头结点的内存空间链表
{
first=(LinkList)malloc(sizeof(Node));
{//有空闲块能满足需求且有剩余
temp->prior=p->prior;
temp->next=p;
temp->data.start=p->data.start;
temp->data.num=p->data.num;
p->data.state#34;");
sort();
printf("\n\t\t》主存空间分配情况《\n");
printf("**********************************************************\n\n");
printf("分区序号\t作业名\t\t起始地址\t分区大小\t分区状态\n\n");
{
if(p->data.num>=q->data.num)
{
q->data.num+=1;
}
}
}
}
//显示主存分配情况
void show()
{ int flag=0;//用来记录分区序号
Node *p=first;
p->data.num=0;
p->data.start=0;
p->data.length=0;
while(p)
{
if((p->data.state==0)&&(p->data.length==request))
{//有大小恰好合适的空闲块
p->data.state=1;
return OK;
break;
}
else if((p->data.state==0) && (p->data.length>request))