操作系统实验报告--实验三Word文档下载推荐.doc
《操作系统实验报告--实验三Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《操作系统实验报告--实验三Word文档下载推荐.doc(14页珍藏版)》请在冰豆网上搜索。
![操作系统实验报告--实验三Word文档下载推荐.doc](https://file1.bdocx.com/fileroot1/2022-10/2/47d4a458-d2e9-43bf-af97-610bf33b9ad1/47d4a458-d2e9-43bf-af97-610bf33b9ad11.gif)
是
否
开始
初始化内存空间
建立页表
分配页表到空的内存空间
进程请求分页
检查页面是否在内存?
调用淘汰最近最少使用LRU
直接转换逻辑地址到物理地址
提示:
可先用动态申请的方式申请一大块空间,然后假设该空间为内存区域,对该空间进行页框的划分、分配等。
程序功能结构图:
流程图:
开始
生成地址流
输入算法号S
1≤S≤4
形成地址页号
用户内存空间msize=2
Msize≤32
OPT()
FIFO()
LRU()
LFU()
Msize加1
S=?
是否用其他算法继续
结束
N
Y
1
2
3
4
提示出错,重新输入
数据结构定义:
我提供定义了两个类。
第一个类就是页面类,在这类里面包括一些重要的数据成员。
有页号(page_no),页框号(frame_no),页面是否在内存的标志(flag(1表示在内存,0表示不在内存)),访问次数(times)。
另一个类是进程控制块类PCB。
类的数据成员有id(进程编号),name(进程名),size(进程大小),*p(页类指针)。
在本类中,有一些成员函数:
构造函数(用来初始化本类的所有数据),displayPCB(输出函数),convert(地址映射函数),allocation(分配函数),restore(回收函数)。
另外还有一些类外的函数:
initMemorySpace(初始化内存空间的函数),displayMemorySpace(输出内存空间的状态1(表示占用)0(表示空))。
四、所用仪器、材料(设备名称、型号、规格等)。
计算机一台
五、实验方法、步骤
程序代码:
#include<
iostream>
string>
ctime>
usingnamespacestd;
constintframe_size=1024;
//页框长度,固定为1k
constintpage_size=1024;
//页面长度,固定为1k
constintmemory_size=102400;
//内存容量,固定为100k
constintframe_number=memory_size/frame_size;
//100k/1k=100frames
int*memory;
//指针变量,用来存内存的状态1还是0。
voidinitMemorySpace()//初始化内存空间
{
inti,ran,times;
time_tt;
//定义time_t对象t
t=time(0);
srand(t);
//随机改变每秒
times=0;
//变量times初始化为0,变量的功能是检查内存空间是否有一半空了没。
memory=newint[frame_number];
//申请内存空间,有frame_number这么大的空间
for(i=0;
i<
frame_number;
i++)//首选循环页框数次
memory[i]=1;
//初始化全部为1
do
{
ran=rand()%frame_number;
//随机空间位置
if(memory[ran]==0)continue;
//如果当前的位置已经是空就要再循环
else//否则
{
memory[ran]=0;
//内存空间在ran的位置为0(空)
times++;
//times变量增加一个
}
}while(times<
=(frame_number/2));
//空的空间还没到内存空间的一半,再循环
}
voiddisplayMemorySpace()//输出内存空间状态,1还是0
inti;
cout<
<
"
内存空间(0表示空,1表示占用)"
endl;
i++)//循环页框数次
cout<
memory[i]<
"
;
//输出1或者0
if((i+1)%10==0)cout<
//到第10个列回车一次
}
classpage//定义页表类page
public:
intlogic_no;
//定义页号变量
intframe_no;
//定义页框号变量
intflag;
//定义内存标志变量,1表示在内存,0表示不在
inttimes;
//定义访问次数变量
};
classPCB//定义进程控制块类PCB
private:
staticintid;
//定义静态进程编号变量
stringname;
//定义进程名为字符串类
intsize;
//定义进程大小
intpage_number;
//定义页面总数变量
intgiven_frame;
//定义系统给的页框数变量
page*p;
//类page的指针变量
PCB();
//本类的构造函数
voiddisplayPCB();
//输出进程和页表的重要信息
voidconvert();
//地址映射函数,也有淘汰方法(最近最少使用方法LRU)
intallocation(int);
//分配函数。
函数里是按到页框号分配的
voidrestore();
//回收函数。
用来回收内存空间
intPCB:
:
id=0;
//初始化进程编号
voidPCB:
restore()//实现restore函数在类外
given_frame;
i++)//循环given_frame次
memory[p[i].frame_no]=0;
//请求到的页框号的内存空间改到被占用
allocation(intframe_no)//实现allocation函数体在类外部
if(memory[frame_no]==0)//如果内存空间是空的话
{
memory[frame_no]=1;
//改该空间位置到1
return1;
//返回1
}
return0;
//如果对应的页框号在内存没有空间的话,返回0
PCB:
PCB()//实现构造函数体
inti,j,unused_page,*random_page,*page_no_array;
id++;
//自动增加进程编号一个
请输入进程名:
cin>
>
name;
//输入进程名
size=3072+rand()%48128;
//初始化进程大小,随机从3页数到50页
page_number=(size/1024);
//计算出页面数,进程大小除以一个页面的长度
given_frame=(page_number*2)/3;
//固定页框数只是总页面数的三分之二
unused_page=page_number-given_frame;
//空页面
p=newpage[page_number];
//动态初始化类page的指针对象p
random_page=newint[given_frame];
//动态初始化random_page指针变量
page_no_array=newint[page_number];
//动态初始化page_no_array指针变量
i++)//循环given_frame次数
while
(1)
intrecord=0;
random_page[i]=rand()%page_number;
//随机从0到page_number-1
for(j=0;
j<
i;
j++)
{
if(random_page[i]==random_page[j])record++;
//如果当前随机的值等于以前值
}
if(record==0)break;
//如果当前随机的值不等于以前值
page_number;
i++)//循环page_number次
intrecord=0;
for(j=0;
if(random_page[j]==i)record++;
if(record==0)page_no_array[i]=0;
//如果第i个没有在random_page中,所以赋值为0
elsepage_no_array[i]=1;
//否则第i个就赋值为1
if(page_no_array[i]==1)//如果第i的page_no_array等于1,表示要放也页面
p[i].logic_no=i;
//赋i的值给页号
do
while
(1)
intrecord=0;
p[i].frame_no=rand()%frame_number;
//随机页框号,从0到frame_number-1
for(intj=0;
{
if(p[i].frame_no==p[j].frame_no)record++;
}
if(record==0)break;
//如果当前随机的值没有跟以前的值一样的话,结束loopwhile
(1)
}while((allocation(p[i].frame_no))==0);
//如果要放到内存的位置不为空的话,再循环
p[i].flag=1;
//页面在内存
p[i].times=1;
//