西北工业大学操作系统实验OS38Word文档格式.docx
《西北工业大学操作系统实验OS38Word文档格式.docx》由会员分享,可在线阅读,更多相关《西北工业大学操作系统实验OS38Word文档格式.docx(16页珍藏版)》请在冰点文库上搜索。
![西北工业大学操作系统实验OS38Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/2175bf5a-5c79-49a0-b956-5336844bd85f/2175bf5a-5c79-49a0-b956-5336844bd85f1.gif)
2.请求分页存储管理设计
模拟存储管理常用的请求分页存储管理技术,通过本实验使学生更加深入的理解虚拟内存的思想和主要的页面淘汰算法。
二、实验内容:
1.理解线程的相关概念
线程创建和构造的相关知识,了解C语言程序编写的相关知识。
学习虚拟存储器的相关基础知识,了解请求分页存储管理系统的原理和具体实现过程,熟悉各种主要的页面调度算法。
三、项目要求及分析:
(1)编写一个程序,在其main()函数中创建一个(或多个)线程,观察该线
程是如何与主线程并发运行的。
输出每次操作后的结果;
(2)在main()函数外定义一个变量shared(全局变量),在main()中创建一个线
程,在main()中和新线程shared进行循环加/减操作,观察该变量的变化;
(3)修改程序把shared变量定义到main()函数之内,重复第
(2)步操作,
观察该变量的变化。
(1)通过随机数产生一个指令行列,共320条指令,指令中的地址按下述原则生
成:
50%的指令是顺序执行;
25%的指令均匀分布在前地址部分;
25%的指令
均匀分布在后地址部分。
(2)具体实验办法是:
在[0,319]之间选一起始点M;
顺序执行一条指令,即第
M+1条;
向前地址[0,M-1]中执行一条指令M;
顺序执行一条指令,即第M+1
条;
向后地址[M+2,319]中执行一条指令M。
如此继续,直至产生320条指令。
使用产生随机数的函数之前,首先要初始化设置RAN()产生序列的开始点,
SRAND(400);
然后计算随机数,产生指令序列。
例如:
a[0]=1.0*rand()/32767*319+1;
a[1]=a[0]+1;
a[2]=1.0*rand()/32767*(a[1]-1)+1;
a[3]=a[2]+1;
a[4]=319-1.0*rand()/32767*(a[3]-1);
其中rand()和srand()为Linux操作系统提供的
函数分别进行初始化和产生随机数,多次重复使用这5条指令,产生以后的指
令序列。
(3)将指令序列变换成页面地址流:
假设,页面大小为1KB;
用户实存容量(内存
区容量)为4页或32页;
用户虚存容量(逻辑地址空间容量)为32KB;
用户虚
存容量32KB,每1KB中放10条指令,共320条指令序列,按其地址0~9在0页,
10~19在1页,…….,310~319在31页。
(4)使用不同的页面调度算法处理缺页中断,并计算不同实存容量下的命中率:
先
进先出(FIFO)算法;
最近最少使用(LRU)算法;
命中率的算法为:
命中率
=1-(缺页中断次数/页地址流长度)。
本实验中,页地址流长度为320,缺页
中断次数为每次访问相应指令时,该指令所对应的页不在内存的次数。
四、具体实现:
4.1流程图
4.2添加函数的代码
#include<
stdio.h>
stdlib.h>
time.h>
#defineMAXNUM920/*程序的大小,以字为单位*/
#defineN_TEST100//
inta[N_TEST];
/*a[N_TEST]中存放产生的随机数*/
int*a_p;
/*a_p是指向队列的指针*/
intpage=10;
/*页面大小*/
intmem=100;
/*主存容量*/
intm=10;
/*主存页数*/
intpoint=0;
inthit=0;
/*命中次数*/
/*FIFO*/
voidfifo()
{
inti;
hit=0;
point=0;
for(i=0;
i<
N_TEST;
i++)
{
intj;
inttemp=1;
for(j=0;
j<
m;
j++)
{
if((a[i]/page)==a_p[j])
temp=0;
}
if(temp)
a_p[(point++)%m]=a[i]/page;
else
hit++;
}
printf("
命中率为:
%.3f%%\n"
(float)hit/(float)N_TEST*100);
}
/*LRU*/
voidlru()
for(j=0;
m-1;
{
a_p[(point+j)%m]=a_p[(point+1+j)%m];
}
a_p[(point+j)%m]=a[i]/page;
%f\n"
(float)hit/N_TEST*100);
intmain()
intflag=1;
while(flag)
inti;
intselect;
/*选择用哪种算法*/
printf("
FIFO算法请输入0,LRU算法请输入1:
\n"
);
scanf("
%d"
&
select);
/*为指向队列的指针动态分配内存*/
a_p=(int*)malloc(m*sizeof(int));
/*产生随机数种子*/
srand((unsignedint)time(NULL));
//srand(400);
/*a_p初始化*/
for(i=0;
i++)
a_p[i]=10001;
/*:
50%的指令是顺序执行;
25%的指令均匀分布在前地址部分;
25%的指令均匀分布在后地址部分。
*/
a[i++]=1.0*rand()/RAND_MAX*(MAXNUM-1)+1;
a[i++]=a[0]+1;
a[i++]=1.0*rand()/RAND_MAX*(a[1]-1)+1;
a[i++]=a[2]+1;
a[i]=MAXNUM-1.0*rand()/RAND_MAX*(a[3]-1);
printf("
%d\n"
a[i]);
if(!
select)
fifo();
lru();
继续请按1,推出请按0\n"
flag);
if(0==flag)
exit(0);
return0;
五、调试运行结果:
(1)
(2)
六、所遇问题及解决方法:
开始时不知道该如何构造线程,在查看了老师分享的资料之后,开始稍微有些明白了,在后面慢慢的实践过程中,逐步对线程的创建和使用等有了更加深入的了解。
在分页存储管理中,不明白指令应如何生成,后来经过与同学的讨论,终于明白了大意,再就是FIFO和LRU分页算法,虽然上课时感觉听的还算可以,可是在实际动手编程时还是有些迷茫,主要还是动手比较少,以后应加强这方面的锻炼。
七、实验总结:
1.在理解线程的相关概念的实验中,应注意shared的全局性和局部性,而且在作为局部变量时,应注意print_thread_id()函数和pthread_create()函数的使用,因为后者的第四个参数是指针型变量,故在传递shared的值时应注意指针的使用。
2.在请求分页存储管理设计实验中,首先应先生成一定数目的指令,然后再构建相应的FIFO和LRU算法,然后分别使用不同的分页算法,比较不同算法的命中率。