操作系统实验报告.docx
《操作系统实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告.docx(28页珍藏版)》请在冰豆网上搜索。
操作系统实验报告
陕西省高等教育自学考试
操作系统课程
实践环节考核报告
准考证号:
考生姓名:
所学专业:
计算机及应用专业层次:
本科
考核地点:
西安电子科技大学考核时间:
2015/11/22
实践考核评语及成绩评定(由指导教师填写)
教师签名:
年月日
主考院校:
西安电子科技大学
实验内容
实验一、模拟分页式存储管理中硬件的地址转换和用先进先出调度算法(FIFO)处理缺页中断。
#include"stdio.h"
#definesize1024
structplist
{
intnumber;
intflag;
intblock;
intmodify;
intlocation;
};
structplistp1[7]={{0,1,5,0,010},{1,1,8,0,012},{2,1,9,0,013},{3,1,1,0,021},{4,0,-1,0,022},{5,0,-1,0,023},{6,0,-1,0,121}};
structilist
{
charoperation[10];
intpagenumber;
intaddress;
};
structilistp2[12]={{"+",0,70},{"+",1,50},{"*",2,15},{"存",3,21},
{"取",0,56},{"-",6,40},{"移位",4,53},{"+",5,23},
{"存",1,37},{"取",2,78},{"+",4,1},{"存",6,84}};
main()
{
inti,lpage,pflage,replacedpage,pmodify;///////////////////////////////////////////////////////////////////////////////////
intp[4]={0,1,2,3};
intk=0;
intm=4;
longmemaddress;
printf("\n操作\t页号\t页内地址标志绝对地址修改页号主存块号绝对地址\n");
for(i=0;i<12;i++)
{
lpage=p2[i].pagenumber;
pflage=p1[lpage].flag;
if(pflage==0)
{
replacedpage=p[k];
pmodify=p1[replacedpage].modify;
p[k]=lpage;
k=(k+1)%m;
p1[lpage].flag=1;//标志位改为1
p1[lpage].block=p1[replacedpage].block;
p1[replacedpage].block=-1;
p1[replacedpage].flag=0;
p1[replacedpage].modify=0;
}
memaddress=p1[lpage].block*size+p2[i].address;
if(p2[i].operation=="save")
p1[lpage].modify=1;
printf("%s\t",p2[i].operation);
printf("%d\t",p2[i].pagenumber);
printf("%d\t",p2[i].address);
printf("%d\t",pflage);
if(pflage==1)
printf("%d\t",memaddress);
else
printf("*%d\t",p2[i].pagenumber);
if(pflage==1)
printf("\t");
else
printf("%d->%d\t",p2[i].pagenumber,replacedpage);
printf("%d\t",p1[lpage].block);
printf("%d\t",memaddress);
printf("\n");
}
}
实验二、模拟采用二级目录结构的磁盘文件系统中的文件操作。
1、数据结构设计
通过分析设计题目,具体设计出主要的三个数据结构。
UFD:
通过结构体,将文件名,文件属性,记录长度和文件的地址结合在一体。
UOF:
同样是通过结构体,将文件名,文件属性,记录长度,当前状态,读指针,写指针以及最后一块的指针结合在一起。
MFD:
通过一个类来实现其功能。
类中包括用户名,UFD及UOF中的文件个数,以及与用户相对应的UFD和UOF。
另外还包括两个初始化函数。
模拟二级目录结构时,第一级为主文件目录MFD,第二级为用户文件目录UFD。
假定系统可同时管理N个用户的文件,每个用户最多在磁盘上保存L个文件,则二级目录结构可用如下形式表示:
用户名
用户文件目录
文件名
文件属性
记录长度
文件地址
NL
栏栏
主文件目录MFD用户文件目录UFD
整个系统只有一张主文件目录表,但有N张用户文件目录表。
用户文件UFD中的“文件属性”规定文件的使用权限为“只可读”或“只可写”或“可读可写”。
可为每个用户设置一张“用户已打开文件表(UOF)”,用以说明该用户当前正在使用文件的情况。
如果用最多同时打开或建立S个文件,那么,用户已打开文件表UOF应该有S个登记栏,其结构如下:
文件名
文件属性
记录长度
状态(打开/建立)
读指针
写指针
S
栏
用户请求打开或建立一个文件时,相应的文件操作把在关该文件的信息登记到UOF中,读指针和写指针用于指出对文件的进行存取的当前位置。
2、程序流程设计
1、程序结构框图:
文件系统提供的文件操作有建立文件(create),打开文件(open),关闭文件(close),读文件(read),写文件(write)和撤消文件(delete)。
在模拟程序中可从键盘上输入文件操作命令来模拟各用户程序中所调用的各种文件操作,用一个结束命令(end)停止程序的执行,其程序的结构图如下:
撤消
立
2、用输入命令来模拟用户程序中调用的文件操作,这些命令的格式和处理要求如下:
(1).建立文件:
create(文件名,记录长度,文件属性)
模拟文件系统进行“建立文件”的处理流程如下:
“建立文件”模拟流程:
显示:
建立成功
在该用户的UOF中登记
状态:
=建立写指针:
=d
在UFD登记栏中文件地址:
=d
找一磁盘空闲块D:
=找到的块号
在UFD和UOF中登记文件名,记录长度,文件属性
在UFD和UOF中找空登记栏
UFD中有该文件
查该用户的UFD
开始
显示:
同名文件不能建立
返
回
返回
(2).打开文件:
open(文件名,操作类型)
其中操作类型指出文件打开后用户将对文件进行读还是写。
约定操作类型与文
属性不符合或正处于“建立”状态的文件不允许打开,处理流程如下:
“打开文件”模拟流程
是
(3).读文件:
Read(文件名,读文件)
文件打开后,可用“读文件”操作请求读指定文件中的若干记录,既可顺序读写也可随机读。
这里约定总是顺序读文件中的记录本,读长度表示本次操作需计的记录个数。
处理流程如下:
“读文件”模拟流程:
开始
查用户UOF
文件已打开?
否
是
显示:
文件未打开,不能读
从“读指针”得到当前起始地址
返回
按读长度把把信息读出传送给用户(用显示物理块号来模拟)
修改“读指针”
显示:
“读文件”成功
返回
否
(4).关闭文件:
close(文件名)
对某个文件不需要再读或写时,用户应关闭文件。
若关闭一个新建立的文件,则要建立文件的结束标志。
对链接文件来说,最后一块中的链接字应为“0”。
关闭文件的工作流程如下:
“关闭文件”模拟流程
开始
查用户UOF
文件为“建立”状态?
是
否
置文件结束标志
文件为“打开”状态?
消除该文件在UOF中的登记栏
否
显示:
“关闭文件”成功
显示:
文件已关闭
返回
是
是
(5).删除文件:
delete(文件名)
把请求撤消的文件从用户文件目录表中除名,收回该文件占用的存储区域。
处理流程如下:
“删除文件”模拟流程
开始
查该用目录表UFD
UFD中有该文件?
是
显示:
文件已撤消
查该用户的UOF
否
UOF中有该文件?
返回
是
否
在UOF中清除该文件的登记栏
归还文件所占的存储区域
在UFD中清除该文件登记栏
(6).写文件:
write(文件名,记录号)
执行写文件操作时要区分两种情况,第一种是在执行create后要求写。
第二种是在执行open后要求写的。
对第二种情况可认为用户要对一个已建立好的文件进行修改。
一个文件可以分多次写,既可按记录顺序写也可随机写一个记录,采用顺序写时可省略记录号。
模拟写文件操作的工作的流程图如下:
“写文件”模拟流程
显示:
文件尚未建立或打开,不能写
文件属性为“只读”?
找出存放指定记录的块号
取出“写指针”指出的块号
查用户的UOF
开始
UOF中有该文件
否
是
该文件为“建立”状态?
返回
是
是
把记录信息写到“写指针”指出的物理块中(用显示物理块号来模拟)
显示:
操作不合法,不能写
是
否
顺序修改?
返回
是
是
把修改后的信息写入找到的物理块中
修改“写指针”
显示:
“写文件”成功
返回
是
是
是
是
是
注:
流程图中“寻找空闲块”的工作可以用取一个随机数来模拟,取到的随机灵敏即为空闲块号
五:
源程序及注释如下:
#defineS10
#defineL20
#defineN30
#include"stdio.h"
#include"string.h"
#include"stdlib.h"
structUFD{
charfname[20];
charshuxing[20];
intlength;
intaddr;
};
structUOF{
charfname[20];
charshuxing[10];
intlength;
charstate[10];
int*w,*r;
};
structMFD{
charuname[25];
structUFDufd[L];
structUOFuof[S];
};
structMFDmfd[N];
create(intx);
open(intx);
close(intx);
Read(intx);
write(intx);
delete(intx);
main()
{
charnamestr[20],order[20];
inti,j;
/*chushihuaMFD*/
/************************************************************/
strcpy(mfd[0].uname,"zhangjian");
strcpy(mfd[0].ufd[0].fname,"wenjian1");
strcpy(mfd[0].ufd[0].shuxing,"read");
mfd[0].ufd[0].length=25;
mfd[0].ufd[0].addr=6120;
/*printf("uname:
%s,fname:
%s,shuxing:
%s,length:
%d,address:
%d\n",mfd[0].uname,mfd[0].ufd[0].fname,mfd[0].ufd[0].shuxing,mfd[0].ufd[0].length,mfd[0].ufd[0].addr);*/
strcpy(mfd[0].ufd[1].fname,"wenjian2");
strcpy(mfd[0].ufd[1].shuxing,"rw");
mfd[0].ufd[1].length=20;
mfd[0].ufd[1].addr=0;
strcpy(mfd[0].ufd[2].fname,"wenjian3");
strcpy(mfd[0].ufd[2].shuxing,"rw");
mfd[0].ufd[2].length=20;
mfd[0].ufd[2].addr=1000;
strcpy(mfd[1].uname,"hey");
strcpy(mfd[1].ufd[0].fname,"wenjian5");
strcpy(mfd[1].ufd[0].shuxing,"read");
mfd[1].ufd[0].length=30;
mfd[1].ufd[0].addr=4020;
strcpy(mfd[1].ufd[1].fname,"wenjian8");
strcpy(mfd[1].ufd[1].shuxing,"rw");
mfd[1].ufd[1].length=21;
mfd[1].ufd[1].addr=1;
/*chushihuaUOF*/
strcpy(mfd[0].uof[0].fname,"wenjian1");
strcpy(mfd[0].uof[0].shuxing,mfd[0].ufd[0].shuxing);
mfd[0].uof[0].length=mfd[0].ufd[0].length;
strcpy(mfd[0].uof[0].state,"open");
mfd[0].uof[0].w=mfd[0].ufd[0].addr;
mfd[0].uof[0].r=mfd[0].ufd[0].addr;
strcpy(mfd[0].uof[1].fname,"wenjian3");
strcpy(mfd[0].uof[1].shuxing,mfd[0].ufd[2].shuxing);
mfd[0].uof[1].length=mfd[0].ufd[2].length;
strcpy(mfd[0].uof[1].state,"open");
mfd[0].uof[1].w=mfd[0].ufd[2].addr;
mfd[0].uof[1].r=mfd[0].ufd[2].addr;
/*printf("w=%d",mfd[0].uof[0].w);*/
/*******************************************************/
shuru:
printf("Initialhasfinished.Pleaseinputyournametologin:
\n");
scanf("%s",namestr);
for(i=0;i{if(!
strcmp(namestr,mfd[i].uname))/*xiangdeng*/
break;
}/*for*/
if(i>=N)
{
printf("Thenameyouhaveinputediswrong!
\n");
gotoshuru;
}
instructions:
printf("Welcome!
Inputyourinstruction:
\n");
printf("create———→createafile\n");
printf("open———→openafile\n");
printf("close———→closeafile\n");
printf("read———→readafile\n");
printf("write———→writeafile\n");
printf("delete———→deleteafile\n");
printf("end———→quitthesystem\n");
printf("---------Andyourchoiceis--------\n");
scanf("%s",order);
if(!
strcmp(order,"create"))
{create(i);
gotoinstructions;}
elseif(!
strcmp(order,"open"))
{open(i);
gotoinstructions;
}
elseif(!
strcmp(order,"close"))
{close(i);
gotoinstructions;
}
elseif(!
strcmp(order,"read"))
{Read(i);
gotoinstructions;
}
elseif(!
strcmp(order,"delete"))
{delete(i);
gotoinstructions;
}
elseif(!
strcmp(order,"write"))
{write(i);
gotoinstructions;
}
elseif(!
strcmp(order,"end"))
{printf("Youhavecanceledthisoperation!
\n");
return(0);
}
else
{printf("Wronginstruction!
Pleaseinputtherightone!
!
\n");
gotoinstructions;
}
}
/*-------------zhuhanshu------------------*/
/*=================create()====================*/
create(intx){
charfilename[20];
intj;
intlength;
charprority[20];
intaddress;
rand();/*chushihuasuijihanshu*/
printf("Youhavechosetocreateanewfile!
\n");
printf("Pleaseinputthenameofthefile:
\n");
scanf("%s",&filename);
for(j=0;j{if(!
strcmp(mfd[x].ufd[j].fname,filename))/*yicunzai*/
{printf("Thenamehasexist!
\n");
break;
}/*if*/
elseif(strlen(mfd[x].ufd[j].fname)==0)/*bucunzai*/
{strcpy(mfd[x].ufd[j].fname,filename);
printf("Inputtheinformationofthenewfile!
\n");
printf("Inputitslengthbelow:
\n");
scanf("%d",&length);
mfd[x].ufd[j].length=length;
printf("Inputitsproritybelow:
read,writeorrw\n");
scanf("%s",&prority);
strcpy(mfd[x].ufd[j].shuxing,prority);
mfd[x].ufd[j].addr=rand();
mfd[x].uof[j].w=mfd[x].ufd[j].addr;
strcpy(mfd[x].uof[j].state,"create");
printf("Youhavecreatedafilesuccessful!
!
\n");
break;
}/*else*/
}/*for*/
}
/*================create=====================*/
/*================open()=====================*/
open(intx)
{
intj,k;
charfilename[20];
printf("Youhavechosetoopenanewfile!
\n");
printf("Pleaseinputthenameofthefile:
\n");
scanf("%s",&filename);
for(j=0;j{if(!
strcmp(mfd[x].ufd[j].fname,filename))/*yicunzai*/
{/*if*/
for(k=0;k
{if(!
strcmp(mfd[x].uof[k].fname,filename))/*cunzaiuof*/
{if(!
strcmp(mfd[x].uof[k].state,"create"))/*zaijianli*/
printf("Thefileisbeingcreated!
Youcannotopenit.\n");
else
printf("Thefilehasopened!
\n");
break;
}/*cunzaiuof*/
elseif(strlen(mfd[x].uof[k].fname)==0)/*bucunzaiuof*/
{printf("Theprorityofthefileis:
\n");
printf("%s\n",mfd[x].ufd[j].shuxing);
if(strcmp(mfd[x].ufd[j].shuxing,"rw")==0||strcmp(mfd[x].ufd[j].shuxing,"read")==0||strcmp(mfd[x].ufd[j].shuxing,"write")==0||strcmp(mfd[x].ufd[j].shuxing,"rw")==0)
{strcpy(mfd[x].uof[k].fname,filename);
mfd[x].uof[k].length=mfd[x].ufd[j].length;
strcpy(mfd[x].uof[k].shuxing,mfd[x].ufd[j].shuxing);
strcpy(mfd[x].uof[k].state,"open");
mfd[x