操作系统.docx
- 文档编号:7272195
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:20
- 大小:514.61KB
操作系统.docx
《操作系统.docx》由会员分享,可在线阅读,更多相关《操作系统.docx(20页珍藏版)》请在冰豆网上搜索。
操作系统
陕西省高等教育自学考试
操作系统课程
实践环节考核报告
准考证号:
考生姓名:
所学专业:
计算机及应用专业层次:
本科
考核地点:
西安电子科技大学考核时间:
2012-5-21
实践考核评语及成绩评定(由指导教师填写)
教师签名:
年月日
主考院校:
西安电子科技大学
操作系统实验报告
一.实验目的
操作系统是一门工程性很强的课程,它不仅要求学生掌握操作系统的工作原理和理论知识,也要求培养学生的实际动手能力。
二.实验环境
操作系统:
WindowsXp
开发语言:
C++
开发工具:
MicrosoftVisualC++
三.实验内容以及要求
实验题目一
1.题目要求
模拟分页式虚拟存储管理中硬件的地址转换和用先进先出调度算法(FIFO)处理缺页中断。
2.实验分析
请求页式存储管理主要需要解决以下问题:
系统如何获知进程当前所需页面不在主存;当发现缺页时,如何把所缺页面调入主存;当主存中没有空闲的页框时,为了要接受一个新页,需要把老的一页淘汰出去,根据什么策略选择欲淘汰的页面。
本程序中采用先来先服务的淘汰方式。
各进程的虚拟空间被划分成若干个长度相等的页。
页长的划分和内存外存之间的数据传输速度以及内存大小等有关。
页式管理还把内存空间也按页的大小划分为页面,然后把页式虚拟地址与内存页面物理地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地址变换问题。
在作业或进程开始执行之前,把该作业或进程的程序段和数据全部装入内存的各个页面中,并通过页表和硬件地址变换机构实现虚拟地址到内存物理地址的地址映射。
3.设计思想
页式虚拟存储管理是在页式存储管理的基础上实现的,首先把作业信息作为副本存放在磁盘上,作业执行时,把作业信息的部分页面装入主存储器,作业执行时若所访问的页面已经在主存中,则进行地址转换,得到绝对地址,否则产生“缺页中断”由操作系统把当前所需的页面装入主存。
在页式虚拟存储系统中,把虚拟空间分成页,称为逻辑页;内存空间也分成同样大小的页,称为物理页。
假设逻辑页号为0,1,2,……,m,物理页号为0,1,……,n,显然有m>n。
由于页的大小都取2的整数幂个字,所以,页的起点都落在低字段为零的地址上。
因此,虚存地址分为两个字段:
高位字段为逻辑页号,低位字段为页内行地址,实存地地址也分两个字段:
高位字段为物理页号,低位字段为页内行地址。
由于两者的页面大小一样,所以页内行地址相等。
虚拟地址到主存实地址的变换是由放在主页的页表来实现。
在页表中,对应每一个虚存逻辑页号有一个表目,表目内容至少要包含该逻辑页所在的主存页面地址(物理页号),用它作为主存地址的高字段,与虚存地址的页内行地址字段相拼接,就产生了完整的实主存地址据此来访问主存。
页式管理的地址变换如图1所示。
如访问该逻辑页就要产生页面失效中断,启动输入输出子系统,根据页表项目中查得的外存地址,由磁盘等外存中读出新的页到主存中来。
修改位指出主存页面中的内容是否被修改过,替换时是否要写主存,替换控制位指出需替换的页等。
4.实验系统结构
1.实验算法流程图
2.算法设计
(1)该程序可分为以下几个模块:
intmain();//主函数
voidInit();//初始化程序
voidDisplay();//显示页表情况的函数
voidInput();//输入指令程序
voidCheck(intt);//查页表程序
voidInter(intm);//缺页中断处理程序
voidComp(intw);//处理绝对地址函数
voidChange();//修改页表函数
(2)主要函数模块分析
1)地址变换函数:
输入指令进行操作的页号和单元号,判断该页是否在主存中。
若在,则直接计算绝对地址并输出,否则发生缺页中断。
输出指令执行后的页表情况后再询问用户是否还有后继指令。
voidComp(intw){//绝对地址函数
intaddress=Page[w][2]*1024+unit;//计算绝对地址
if(oper=='C'){Page[w][3]=1;}//C代表存,如果是存指令,置L页的修改标志为1
cout<<"绝对地址:
"<
cout<<"-----------------指令执行后页表情况如下------------------"< Display();//输出指令执行后的页表情况 cout< 有,0: 无"< cin>>temp; } 2)缺页中断处理函数: 当用户输入操作判断该页不在主存上时,发生缺页中断,输出“该页页号*”,并模拟FIFO进行页面调度算法把该作业中最先进入主存的一页调出,存放在磁盘上,然后再把当前要访问的页装入该块。 voidInter(intm){//缺页中断处理程序 cout<<"该页页号*"< //模拟FIFO页面调度 J=P[k];//暂存P[k]值 if(Page[J][3]==1)//判断J页的修改标志是否为1 cout<<"OUT"< cout<<"IN"< 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),是所有算法里最简单的。 但通过这次实践,相信我会更深刻的理解别的算法。 在这次实验中,使我有了更深刻层次的理解,对缺页中断及地址转换都提高了认识。 在实验之前,我已经预习了本次实验,使得上级操作比较顺利,程序稍加调试就能运行,并达到了理想的效果。 不过,这次程序的实验,只是了解了一部分操作系统的实现细节,我知道,要正真的学习好这门课程,还有很多东西要掌握,我会继续加强这方面的练习。 通过这次实验,我了解到操作系统不仅是理论性很强的课程,而且也是技术性和实践性很强的课程。 过去在操作系统学习中,只了解到一些基本原理,总是感到学习内容很空洞。 很多命令、工具不会用,系统程序设计能力很差。 这次的实验使我学到了很多在平时的学习中学习不到的东西,对自己的实际动手能力和应用所学知识的能力都是一个很好的锻炼,以后要多多加强这方面的尝试。 在这次实践中我充分认识到这种轻视实践和技术的思想,我将在以后的学习和工作中改正这种思想,做一个理论结合实践的人。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统