
一.实验目的及要求:
通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法。
通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。
二 . 实验环境:
操作系统:Windows XP
编译环境:Visual C++ 6.0
三.算法描述
由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU时限等因素。
作业调度算法:采用先来先服务(FCFS)调度算法,即按作业提交的先后次序进行调度。总是首先调度在系统中等待时间最长的作业。
每个作业由一个作业控制块JCB表示,JCB可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。
作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。每个作业的最初状态总是等待W。
各个等待的作业按照提交时刻的先后次序排队,总是首先调度等待队列中队首的作业。
每个作业完成后要打印该作业的开始运行时刻、完成时刻、周转时间和带权周转时间,这一组作业完成后要计算并打印这组作业的平均周转时间、带权平均周转时间。
四. 实验步骤:
核心源码:
void acceptment2(RECT *head,RECT *back1)
{
RECT *before,*after;
int insert ;
insert=0;
before=head;
after=head->next;
if(head->next==NULL) /*如果可利用区表为空*/
{
head->size=back1->size;
head->next=back1;
maxblocknum++;
back1->next=NULL;
}
else
{
while(after!=NULL) /*与上一块合并*/
if(back1->address==after->size+after->address)
{
before->next=after->next;
back->size=after->size+back1->size;
free(after);
after=NULL;
}
else
{
after=after->next;
before=before->next;
}
before=head;
after=head->next;
while(after!=NULL)
if(after->address==back1->size+back1->address) /*与下一块合并*/
{
back1->size=back1->size+after->size;
before->next=after->next;
free(after);
after=NULL;
}
else
{
before=before->next;
after=after->next;
}
before=head;/*将回收结点插入到合适的位置*/
after=head->next;
do{
if(after==NULL||(after->size>back1->size))
{
before->next=back1;
back1->next=after;
insert=1;
}
else
{
before=before->next;
after=after->next;
}
}while(!insert);
if(head->size { head->size=back1->size; maxblocknum++; } else if(head->size==back1->size) maxblocknum++; } } /*分配函数*/ RECT *assignment(RECT *head,int application) { RECT *after,*before,*assign; assign=(RECT*)malloc(sizeof(RECT)); /*分配申请空间*/ assign->size=application; assign->next=NULL; if(application>head->size||application<=0) assign->address=-1; /*申请无效*/ else { before=head; after=head->next; while(after->size before=before->next; after=after->next; } if(after->size==application) /*结点大小等于申请大小则完全分配*/ { if(after->size==head->size) maxblocknum--; before->next=after->next; assign->address=after->address; free(after); } else { if(after->size==head->size) maxblocknum--; after->size=after->size-application; /*大于申请空间则截取相应大小分配*/ assign->address=after->address+after->size; if(tolower(way)=='b')/*如果是最佳适应,将截取后剩余结点重新回收到合适位置*/ { before->next=after->next; back=after; acceptment2(head,back); } } if(maxblocknum==0) /*修改最大数和头结点值*/ { before=head; head->size=0; maxblocknum=1; while(before!=NULL) { if(before->size>head->size) { head->size=before->size; maxblocknum=1; } else if(before->size==head->size) maxblocknum++; before=before->next; } } } assign1=assign; return assign1; /*返回分配给用户的地址*/ } void acceptment1(RECT *head,RECT *back1)/*首先适应*/ { RECT *before,*after; int insert; before=head; after=head->next; insert=0; while(!insert) /*将回收区插入空闲区表*/ { if((after==NULL)|| ((back1->address<=after->address)&& (back1->address>=before->address))) { before->next=back1; back1->next=after; insert=1; } else { before=before->next; after=after->next; } } if(back1->address==before->address+before->size)/*与上一块合并*/ { before->size=before->size+back1->size; before->next=back1->next; free(back1); back1=before; } if(after!=NULL&&(after->address==back1->address+back1->size)) { /*与下一块合并*/ back1->size=back1->size+after->size; back1->next=after->next; free(after); } if(head->size { head->size=back1->size; maxblocknum=1; } else if(head->size==back1->size) maxblocknum++; } /*检查回收块的合法性,back1为要回收的结点地址*/ int backcheck(RECT *head,RECT *back1) { RECT *before,*after; int check=1; if(back1->address<0||back1->size<0) check=0;/*地址和大小不能为负*/ before=head->next; while((before!=NULL)&&check)/*地址不能和空闲区表中结点出现重叠*/ if(((back1->address &&(back1->address+back1->size>before->address)) ||((back1->address>=before->address) &&(back1->address check=0; else before=before->next; if(check==0) printf("输入回收空间地址错误或输入的回收空间是空闲状态。!!\\n"); return check; /*返回检查结果*/ } 3.、实验截图:
