实验3存储管理模拟_实验三虚拟存储管理
实验3存储管理模拟由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“实验三虚拟存储管理”。
计算机操作系统实验
存储管理模拟
实验三
存储管理模拟
一、内容补充说明
实验中固定内存分区采用结构体数组实现,分区信息采用结构体初始化实现。由于结构体中含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
//每5秒产生一个新作业
{p=new Job;
//产生新作业
……
for(int k=0;k
if(District_table[k].Job_size==0 && p->Job_size
//如果分区未分配并且作业大小小于分区大小
{District_table[k].Job_num=j;
//分配内存,并将作业信息保存至分区信息中
……
for(int k=0;k
if(District_table[k].Job_size!=0)
//如果分区中有作业运行
District_table[k].Remainder-=1;
//程序步进驱动,作业运行减1 ……
for(int t=0;t
//如果分区中有作业运行,并且作业已运行完成 计算机操作系统实验
存储管理模拟
{District_table[t].Job_size=0;
//释放内存
……
四、操作界面
操作界面为命令提示符界面,实验截图如下:
1.编译、连接界面
计算机操作系统实验
存储管理模拟
五、心得体会
程序最后跳出永真循环是用break语句。原来是用goto语句,用break语句或exit语句应该也是可以的,但运行后死活都跳不出来,后来不知道为什么又好了。
MinGW是一个很好的编译器,安装包小、程序文件小、绿色环保、速度快、效率高。另外,还有很多人性化的设计,比如:现实代码行数、网格显示、配对括号激活时高亮显示方便检查、括号代码折叠方便查看上下段程序等等。可惜Windows Vista用户没福气,幸好我是Windows XP。
六、附录
#include #include #include
using namespace std;
计算机操作系统实验
存储管理模拟
cout
//打印内存分区内容
cout>Counter;for(int j=0,clock=0,flag=0;1;clock++,flag=0,Sleep(1000))
//总循环,永真循环,flag为作业分配标志,clock为作业产生时钟,Sleep为程序步进驱动
{if(j
//每5秒产生一个新作业
{p=new Job;
//产生新作业
p->Job_size=rand()%34+1;
//作业大小随机
p->Job_time=rand()%40+1;
//作业运行时间随机
coutJob_sizeJob_time
for(int k=0;k
if(District_table[k].Job_size==0 && p->Job_size
//如果分区未分配并且作业大小小于分区大小
{District_table[k].Job_num=j;
//分配内存,并将作业信息保存至分区信息中
District_table[k].Job_size=p->Job_size;
District_table[k].Remainder=p->Job_time;
District_table[k].District_state=“Allocated”;
cout
cout
for(int t=0;t
cout
flag=1;
//分配成功
Jump+=1;
//内存中作业数
break;
}
if(flag==0)
//如果作业分配不成功
cout
j++;
//生成作业数
}
for(int k=0;k
if(District_table[k].Job_size!=0)
//如果分区中有作业运行
District_table[k].Remainder-=1;
//程序步进驱动,作业运行减1
for(int t=0;t
if(District_table[t].Job_size!=0 && District_table[t].Remainder==0)
//如果分区中有作业运行,并且作业已运行完成{District_table[t].Job_size=0;
//释放内存
District_table[t].District_state=“Unallocated”;
cout
District_table[t].Job_num=0;
cout
for(int r=0;r
cout
Jump-=1;
//内存中作业数