实验3存储管理模拟
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);