P[k]=L;//修改P[k]为当前指令中的页号L
Change();//调用修改页表函数,进行页表修改
k=(k+1)%N_z;//k值修改
Check(L);//继续查看页表
}
3)修改页表函数:
当一个页面调出和装入后都需要修改页表中对应页的标志。
voidChange(){//修改页表函数
intp;
for(inti=1;i<=2;i++)
{p=Page[L][i];//修改页标志、主存块号
Page[L][i]=Page[J][i];
Page[J][i]=p;
}
}
5.实验运行结果
(1)运行程序得到初始化界面如下:
(2)用户按提示输入相应的指令,若指令输入后系统判断该页在主存上,则显示结果如下:
(3)若用户输入指令后系统判断该页不在主存上,此时显示结果如下:
(4)当运行完后,系统提示是否还有后继指令,若选择0:
无,则该系统自动关闭。
实验题目五
1.题目要求
设计实现一个自己的文件系统,该文件系统支持多级目录,每个文件具有文件的一些基本属性,并能对文件实施操作系统的基本操作。
(1)给出所设计文件系统的描述结构。
(2)显示文件系统中文件的属性。
(3)给出文件系统基本操作的运行结果。
2.程序设计思想
(1)主文件目录(MFD),包括用户名和文件目录指针;
structuserMFD[1]={{"0",0}};//MFD(用户名文件目录指针)
(2)用户文件目录(UFD),包括文件名、保护码以及文件长度;
structfileUFD[10];//用户文件目录(UFD-文件名保护码文件长度)
(3)打开文件目录(AFD),包括打开文件名、打开保护码以及读写指针。
采用数组形式存储打开的文件,数组每个元素保存一个打开文件的信息
StructfileAFD[5]={{"0",0,0,0},{"0",0,0,0},{"0",0,0,0},{"0",0,0,0},{"0",0,0,0}};//运行文件目录(AFD)——一次运行用户可以打开个文件
3.在此模拟文件管理系统中可以实现的操作有:
(1)用户登录:
login,用户通过登录从而使用系统功能;
(2)创建文件:
create,创建一个指定名字的新文件,即在目录中增加一项,不考虑文件的内容。
对于重名文件给出错误信息。
(3)删除文件:
delete,当没在用户使用指定文件时,将其删除。
文件不存在时给出错误信息。
(4)打开文件:
open,打开用户文件目录中已创建的文件,显示打开成功。
若文件不存在,则提示用户该输入有误。
(5)关闭文件:
close,关闭用户文件目录中存在并且已打开的文件,显示关闭成功。
若文件不存在,则提示用户该输入有误。
(6)读取文件:
read,系统先判断在用户文件目录上是否存在该文件,若存在则判断该文件是否已打开,接着判断该文件的权限,若能读取则显示“该文件的状态是正在读”,若权限不够,则提示该错误信息。
(7)写入文件:
write,若要写的文件既不是在用户文件目录上不存在的也不是未打开的,则接着判断该用户是否有权限写入文件有权
限,则显示出“文件的状态是正在写”,若无权限,则提示该错误信息。
(8)列出文件目录:
dir,显示出该目录下的所有文件。
(9)退出登录:
exit,输入exit命令可退出当前用户登录,使其他用户登录。
4.实验系统结构
1.实验算法流程图
2.算法设计
(1)该程序可分为以下几个模块:
voidlogin();
voiddir();
voidcreate();
voiddelet();
voidopen();
voidclose();
voidread();
voidwrite();
voidsave();
(2)主要函数模块分析
1)创建文件:
其中重点使用了strcmp函数,它是比较两个字符串的大小,返回比较的结果。
voidcreate()
{charname[10];
inti,j=0,flag;
for(i=0;i<10;i++)
{if(!
strcmp(UFD[i].name,"0"))
j++;}
if(j>9)
{cout<<"文件夹己满,请先删除"<dir();}
else{
do{cout<<"请输入文件名:
"<cin>>name;
flag=0;
for(i=0;i<10;i++)
{if(!
strcmp(UFD[i].name,name))//如果有重名的文件
{cout<<"文件名重复,请重新输入"<flag=1;break;}
}
}while(flag==1);
for(i=0;i<10;i++)
{if(!
strcmp(UFD[i].name,"0"))//找到第一个空的文件
{strcpy(UFD[i].name,name);
do
{cout<<"请输入保护码(选择-2,0-可读,-可写,-可读写):
"<cin>>UFD[i].code;
if(UFD[i].code!
=0&&UFD[i].code!
=1&&UFD[i].code!
=2)
cout<<"输入错误,重新输入保护码"<}while(UFD[i].code!
=0&&UFD[i].code!
=1&&UFD[i].code!
=2);
cout<<"请输入文件长度(选择数字):
"<cin>>UFD[i].size;
cout<<"己建立文件"<break;}
}
dir();
}
}
2)写文件:
voidwrite()
{charname[10];
intj,flag=0;
cout<<"请输入文件名:
"<cin>>name;
for(j=0;j<5;j++)
{
if(!
strcmp(AFD[j].name,name))//如果AFD有这个文件
{flag=1;break;
}
}
if(flag==1)
if(AFD[j].code==1||AFD[j].code==2)
{AFD[j].pwrite='W';
cout<<"文件的状态是正在写"<}
elsecout<<"无权限写此文件"<else
{cout<<"运行队列中无此文件,请先打开文件"<}
cout<dir();
}
5.实验运行结果
(1)运行程序得到初始化界面如下:
(2)当用户选择所要登录的文件后,系统调用dir()函数,列出该用户文件目录下的所有文件,并提示用户选择所需要进行的操作:
(3)用户通过输入相应的操作命令,进入到不同的界面。
当用户需要创建一个新的文件的时候,输入命令:
c,根据提示,输入正确的信息后,显示出以下内容:
(4)当需要删除时,用户输入操作命令d并输入想要删除的文件名,若该文件存在,则可顺利删除,如下图显示:
若输入的是不存在文件,则系统提示出错:
打开文件(o)和关闭文件(k)操作显示与删除操作类似。
(5)若想读取一个文件,则选择r操作,若该文件存在,已打开并且用户具备读的操作权限,则读操作成功,显示结果如下:
若该用户文件未打开,则显示结果如下,读操作不成功:
若该操作文件具备已存在在该文件目录下以及已经打开,但是用户不具备读的权限,读文件的操作还是失败,显示结果如下:
写入的操作与读操作类似。
(6)当输入的操作为:
s,则文件被保存,显示结果如下:
(7)当用户输入e操作时,系统将退出登录,返回初始页面。
实验题目七
1.题目要求
编程序模拟磁盘移动臂调度算法,假定磁盘有200个柱面,编号为0-199,当前存取臂的位置在143号柱面上,并刚刚完成了128号柱面的服务请求,如果请求队列的先后顺序是:
861459317995150103176132。
试分别采用:
1)先来先服务调度算法
2)最短查找时间优先算法3)单向扫描法
4)电梯调度算法
输出存取臂的移动顺序,并分别计算出存取臂的移动
2.程序流程图
3.程序代码
#include
#include"math.h"
voidfcfs(intf[],int);
voidsstf(intm[],int);
voidscan(intd[],int);
voideleattemper(inte[],int,int);
voidmain()
{inta[]={86,145,93,179,95,150,103,176,132};
constintbefor=143;
constintnow=128;
fcfs(a,now);
intaa[]={86,145,93,179,95,150,103,176,132};
sstf(aa,now);
intaaa[]={86,145,93,179,95,150,103,176,132};
scan(aaa,now);
intb[]={86,145,93,179,95,150,103,176,132};
eleattemper(b,now,befor);
}
voidfcfs(intf[],intbnow)
{cout<<"先来先服务调度算法(fcfs):
"<ints=bnow-f[0];
intt=fabs(s);
for(inti=0;i<8;i++)
{t=t+fabs(f[i]-f[i+1]);}
cout<cout<<"移动顺序:
"<for(i=0;i<9;i++)
{cout<cout<<"取臂移动总量:
"<}
voidsstf(intm[],intmnow)
{cout<<"最短查找时间优先算法(sstf):
"<ints=0;intc;intte;inty;
intmm[8];inttm=mnow;
for(inti=0;i<=8;i++)
{inttemp=fabs(tm-9999);
for(intj=0;j<=8;j++)
{te=fabs(tm-m[j]);
if(temp>te&&te!
=0{temp=te;
c=m[j];y=j;}
}
tm=c;mm[i]=c;m[y]=9999999;
}
s=mnow-mm[0];
intt=fabs(s);
for(i=0;i<8;i++)
{t=t+fabs(mm[i]-mm[i+1]);}
cout<<"移动顺序:
";
for(i=0;i<9;i++)
{cout<cout<cout<<"取臂移动总量:
"<}
voidscan(intd[],intdnow)
{cout<<"单向扫描法(scan):
"<intt;
for(inti=0;i<7;i++)
{for(intj=0;j<8-i;j++)
{if(d[j]>d[j+1])
{t=d[j];
d[j]=d[j+1];
d[j+1]=t;}
}
}
ints=dnow-d[0];
inte=fabs(s);
for(i=0;i<8;i++)
{e=e+fabs(d[i]-d[i+1]);}
cout<<"移动顺序:
";
for(i=0;i<9;i++)
{cout<cout<cout<<"取臂移动总量:
"<}
voideleattemper(inte[],intenow,intebefor)
{cout<<"电梯调度算法:
"<intt;
for(inti=0;i<7;i++)
{for(intj=0;j<8-i;j++)
{if(e[j]>e[j+1])
{t=e[j];
e[j]=e[j+1];
e[j+1]=t;};
};
}
intc;intx;
inttemp=fabs(enow-e[0]);
for(intj=0;j<=8;j++)
{intf=fabs(enow-e[j]);
if(temp>f)
{temp=f;
x=j;
}
}
cout<<"移动顺序:
"<if(ebefor>enow)
{ints=fabs(enow-e[x-1]);
for(i=x-1;i>=0;i--)
{cout<if(i!
=x&&i!
=0){s=s+fabs(e[i]-e[i-1]);}
}
s=s+fabs(e[0]-e[x]);
for(i=x;i<=8;i++)
{cout<if(i!
=8){s=s+fabs(e[i]-e[i+1]);}
}
cout<cout<<"取臂移动总量:
"<
}
else
{intss=fabs(enow-e[x]);
for(i=x;i<=8;i++)
{cout<if(i!
=x&&i!
=8){ss=ss+fabs(e[i]-e[i+1]);}
}
ss=ss+fabs(e[8]-e[x-1]);
for(i=x-1;i>=0;i--)
{cout<if(i!
=0){ss=ss+fabs(e[i]-e[i-1]);}
}
cout<cout<<"取臂移动总量:
"<}
}
实验心得
通过这次实践课程,使我更进一步了解了操作系统方面的应用知识,如文件系统的管理、应用和请求分页式存储管理的页面置换算法等。
虽然这次用的的页面置换算法先进先出调度算法(FIFO),是所有算法里最简单的。
但通过这次实践,相信我会更深刻的理解别的算法。
在这次实验中,使我有了更深刻层次的理解,对缺页中断及地址转换都提高了认识。
在实验之前,我已经预习了本次实验,使得上级操作比较顺利,程序稍加调试就能运行,并达到了理想的效果。
不过,这次程序的实验,只是了解了一部分操作系统的实现细节,我知道,要正真的学习好这门课程,还有很多东西要掌握,我会继续加强这方面的练习。
通过这次实验,我了解到操作系统不仅是理论性很强的课程,而且也是技术性和实践性很强的课程。
过去在操作系统学习中,只了解到一些基本原理,总是感到学习内容很空洞。
很多命令、工具不会用,系统程序设计能力很差。
这次的实验使我学到了很多在平时的学习中学习不到的东西,对自己的实际动手能力和应用所学知识的能力都是一个很好的锻炼,以后要多多加强这方面的尝试。
在这次实践中我充分认识到这种轻视实践和技术的思想,我将在以后的学习和工作中改正这种思想,做一个理论结合实践的人。