操作系统实验报告-理解线程和请求分页存储管理设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告三
实验名称:理解线程和请求分页存储管理设计日期:2011/5/25 班级:学号:姓名:
一、实验目的:
1. 理解当操作系统引入线程的概念后,进程是操作系统独立分配资源的单位,
线程成为系统调度的单位,也是系统并发运行的独立单位。同一个进程中的
各个线程共享进程的地址空间。
2. 模拟存储管理常用的请求分页存储管理技术,通过本实验使学生更加深入的
理解虚拟内存的思想和主要的页面淘汰算法。
二、实验内容:
1. (1)编写一个程序,在其main()函数中创建一个(或多个)线程,观察该
线程是如何与主线程并发运行的。输出每次操作后的结果;
(2)在main()函数外定义一个变量int shared(全局变量),在main()中创建
一个线程,在main()中和新线程shared 进行循环加/减操作,观察该变量的变化;
(3)修改程序把int shared 变量定义到main()函数之内,重复第(2)步操作,观察该变量的变化。
(4)编写一个程序,在其main()函数中创建至少两个线程,在这些线程中分别说明(定义)名称相同的整型变量(例如,int x;),分别在各个线程中修改这些变量,试观察这些变量值的变化。
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操作系统提供
指令序列。
(3) 将指令序列变换成页面地址流:假设,页面大小为1KB;用户实存容量(内
存区容量)为4页或32页;用户虚存容量(逻辑地址空间容量)为32KB;用
户虚存容量32KB,每1KB中放10条指令,共320条指令序列,按其地址0~9在
0页,10~19在1页,…….,310~319在31页。
(4) 使用不同的页面调度算法处理缺页中断,并计算不同实存容量下的命中
率:先进先出(FIFO)算法;最近最少使用(LRU)算法;命中率的算法为:
命中率= 1 - (缺页中断次数/页地址流长度)。本实验中,页地址流长度为
320,缺页中断次数为每次访问相应指令时,该指令所对应的页不在内存的次
数。
三、项目要求及分析:
1.在同一进程中的各个线程,都可以共享该进程所拥有的资源,这表现在:所有线程
都具有相同的地址空间(进程的地址空间)。此外我们应该还要用控制语句,控制线程的同步执行。
2. 这个实验是要求我们采用算法模拟分页存储管理技术的FIFO和LRU算法。所以我们
应该先生成地址序列,有了地址序列,我们要找到它所在的虚页,然后通过查找实页,再判断下一步动作。假如要访问的虚页不在内存中,不命中,我们要替换实页内容。根据FIFO算法,直接替换最早进入内存中的那一页就可以了。所以可以设立一个循环指针,记录那个最早进入内存中的那页。而对于LRU算法,我们要替换是到现在为止最长时间没被访问的页,在这里我们可以用一个队列来表示内存。把最久没使用的页放在队头,然后替换进去的页放在队尾就可以了。假如要访问的虚页在内存中,明显是命中。对于FIFO算法,不处理,而对于LRU算法,我们还要把他的权值置0。
四、具体实现:
1.实验程序:1.1
结果:
1.2
结果:1.3
结果:1.4
结果:
2. 源程序:
#include "stdio.h"
#include "stdlib.h"
#include "time.h"
#define MAXPAGE 4
int page[MAXPAGE]={-1,-1,-1,-1}; int num1,num2,num3;
int exist(int n)
{
int i;
for(i=0;i { if(n==page[i]) } return -1; } void main() { int i,j,t,k,temp; int a[320]; int key=0; int b[4]={0}; srand(time(NULL)); a[0]=1.0*rand()/RAND_MAX*319+1; for(i=1;i<320;i++) { if(i%4==1) a[i]=a[i-1]+1; if(i%4==2) a[i]=1.0*rand()/RAND_MAX*(a[i-1]-1)+1; if(i%4==3) a[i]=a[i-1]+1; if(i%4==0) a[i]=319-1.0*rand()/RAND_MAX*(a[i-1]-1); } for(i=0;i<320;i++) { printf("hello,the current page float is %d %d %d %d",page[0],page[1],page[2],page[3]); //如果命中的话,返回命中的页数,并且置命中页数的权值为,其余加一。 if((k=exist(a[i]/10))!=-1) { b[k]=0; for(j=0;j<4;j++) { if(j!=k) ++b[j]; } printf("hello,we hit it,the page float is %d %d %d %d \n",page[0],page[1],page[2],page[3]); continue; } else { //如果没有命中,我们就替换最少使用的,页数置,其余的加一 temp=-10; for(j=0;j<4;j++) { if(b[j]>temp)