实验3存储管理模拟

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三存储管理模拟

一、内容补充说明

实验中固定内存分区采用结构体数组实现,分区信息采用结构体初始化实现。由于结构体中含string类,VC++不能对含string类的结构体初始化,这里采用MinGW编译器作为程序平台。

MinGW,即Minimalist GNU For Windows 。它是一些头文件和端口库的集合,该集合允许人们在没有第三方动态链接库的情况下使用GCC(GNU Compiler C)产生Windows32 程序。实际上MinGW 并不是一个C/C++ 编译器,而是一套GNU 工具集合。除开GCC(GNU 编译器集合)以外,MinGW 还包含有一些其他的GNU 程序开发工具(比如gawk bison 等等)。开发MinGW 是为了那些不喜欢工作在Linux(FreeBSD) 操作系统而留在Windows 的人提供一套符合GNU 的GNU 工作环境。

内存的分配采用“最先适应算法”实现,由于是固定分区,采用该算法不仅简单,而且保证效率。

二、分析和设计

1.理论分析

初始状态内存中没有作业运行;以后每5 秒钟随机生成一个作业,如果不能满足作业需求(主存中没有分区能够容纳的下),则丢弃该作业。作业以秒为单位进行驱动,当一个作业运行时间结束后将释放内存空间。

2.总体设计

分区信息采用初始化实现。

作业以秒为单位进行驱动。

作业的生成、内存的释放采用永真循环实现,当作业全部运行完后跳出循环。

新作业的大小和运行时间由随机数函数rand生成。

结构体Job用于生成新作业时用;结构体District是内存分区,作业分配成功后,作业的信息全部保存在District内,不再由专门的作业队列记录。

作业运行时间由District[i]. Remainder记录,当每秒驱动一次时,时间将减少一秒。当时间减少为0时,作业运行结束,释放内存空间。

每分配一个作业,变量Jump自加一次;每释放一个作业时Jump自减一次。因为作业先分配、内存后释放,所以当作业都运行完时Jump必定等于初始值,这时程序跳出永真循环。

三、详细实现

for(int j=0,clock=0,flag=0;1;clock++,flag=0,Sleep(1000))

//总循环,永真循环,flag为作业分配标志,clock为作业产生时钟,Sleep为程序步进驱动{if(j

{p=new Job; //产生新作业

for(int k=0;k<10;k++)

if(District_table[k].Job_size==0 && p->Job_size<=District_table[k].District_size)

//如果分区未分配并且作业大小小于分区大小{District_table[k].Job_num=j; //分配内存,并将作业信息保存至分区信息中…

for(int k=0;k<10;k++)

if(District_table[k].Job_size!=0) //如果分区中有作业运行

District_table[k].Remainder-=1; //程序步进驱动,作业运行减1

for(int t=0;t<10;t++)

if(District_table[t].Job_size!=0 && District_table[t].Remainder==0)

//如果分区中有作业运行,并且作业已运行完成

{District_table[t].Job_size=0; //释放内存

四、操作界面

操作界面为命令提示符界面,实验截图如下:

1.编译、连接界面

……

2.运行结果

五、心得体会

程序最后跳出永真循环是用break语句。原来是用goto语句,用break语句或exit语句应该也是可以的,但运行后死活都跳不出来,后来不知道为什么又好了。

MinGW是一个很好的编译器,安装包小、程序文件小、绿色环保、速度快、效率高。另外,还有很多人性化的设计,比如:现实代码行数、网格显示、配对括号激活时高亮显示方便检查、括号代码折叠方便查看上下段程序等等。可惜Windows Vista用户没福气,幸好我是Windows XP。

六、附录

#include

#include

#include

using namespace std;

struct District{ //内存分区结构体

int District_num;

int District_size;

int Job_num;

int Job_size;

int Remainder;

string District_state;

};

struct Job{ //作业信息结构体

int Job_size;

int Job_time;

};

void Initialization(District (&temp)[10]) //内存分区初始化,参数采用“引用”方式传递

{temp[0].District_num=0;temp[0].District_size=4;

temp[0].Job_num=0;temp[0].Job_size=0;temp[0].District_state="Unallocated";

temp[1].District_num=1;temp[1].District_size=32;temp[1].Job_num=0;temp[1].Job_size=0;temp[1].District_state="Unalloc ated";

temp[2].District_num=2;temp[2].District_size=8;

temp[2].Job_num=0;temp[2].Job_size=0;temp[2].District_state="Unallocated";

temp[3].District_num=3;temp[3].District_size=16;temp[3].Job_num=0;temp[3].Job_size=0;temp[3].District_state="Unalloc ated";

temp[4].District_num=4;temp[4].District_size=4;

temp[4].Job_num=0;temp[4].Job_size=0;temp[4].District_state="Unallocated";

temp[5].District_num=5;temp[5].District_size=16;temp[5].Job_num=0;temp[5].Job_size=0;temp[5].District_state="Unalloc ated";

temp[6].District_num=6;temp[6].District_size=16;temp[6].Job_num=0;temp[6].Job_size=0;temp[6].District_state="Unalloc ated";

temp[7].District_num=7;temp[7].District_size=8;

temp[7].Job_num=0;temp[7].Job_size=0;temp[7].District_state="Unallocated";

temp[8].District_num=8;temp[8].District_size=32;temp[8].Job_num=0;temp[8].Job_size=0;temp[8].District_state="Unalloc ated";

temp[9].District_num=9;temp[9].District_size=8;

temp[9].Job_num=0;temp[9].Job_size=0;temp[9].District_state="Unallocated";

}

int main()

{int Counter,Jump=0; //作业数、作业全部释放标志

Job *p; //用于产生新作业

District District_table[10]; //内存分区数组

cout<<"@分区表初始化,请稍候……"<

Initialization(District_table);

相关文档
最新文档