操作系统实验报告范文模板.docx
《操作系统实验报告范文模板.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告范文模板.docx(15页珍藏版)》请在冰豆网上搜索。
操作系统实验报告范文模板
操作系统实验报告范文模板
这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。
里面的程序都是我运行过的。
操作系统上机
实验报告
班级:
学号:
姓名:
实验地点:
实验时间:
这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。
里面的程序都是我运行过的。
实验一进程的建立
【实验目的】
创建进程及子进程在父子进程间实现进程通信【实验软硬件环境】
Linu某、Window98、Window2000【实验内容】
创建进程并显示标识等进程控制块的属性信息;显示父子进程的通信信息和相应的应答信息。
(进程间通信机制任选)
【实验程序及分析】
编程思路:
首先本程序在Linu某用C语言完成的,父子进程的创建用fork函数来实现,然后是父子进程间的通信,这里用pipe实现。
可以定义chan1[2],chan1[2],chan某[0]表示读,chan某[1]表示写。
他们配合使用。
【实验截图】
【实验心得体会】
通过这次上机练习,我熟悉了用c++实现进程的创建,销毁,父子进程间的通讯等一系列课程中需要学习的内容。
本来进程的概念在一开始我始终无法清晰地理解,但是通过自己用mfc的方法去实现它后,我开始慢慢地理解操作系统的进程的运作机制。
虽然,我只是实现了一个父子进程的创建和通讯,但是,管中窥豹,我想自己开始明白一个操作系统正是由很多这种进程实现功能的。
其中,系统整体的进程调度,管理等等还有很多东西等着我们去进一步学习、理解。
实验二进程间的同步
【实验目的】
这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。
里面的程序都是我运行过的。
理解进程同步和互斥模型及其应用【实验软硬件环境】
Linu某、Window98、Window2000【实验内容】
利用通信API实现进程之间的同步:
建立司机和售票员进程;并实现他们间的同步运行。
【实验程序及分析】
程序总体思路:
由于本次试验时用PV操作实现的互斥与同步模型,所以先实现P、V操作的函数,然后在主程序中利用PV操作函数实现司机和售票员的同步。
司机和售票员分别为父进程和子进程,假设司机停车开门,此时为父进程中运行,然后申请开车,但是此时乘客没上车,所以只能阻塞。
此时进入子进程,乘客上车,关门,售票员检票,释放开车,然后死机开车,到站,释放开车门。
如此循环。
示意图
#include
#include
这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。
里面的程序都是我运行过的。
#include#include#include#include#include
#include//这些是完成以下操作所需要的头文件intrunid=0,topid=0;
intP(intemid)//P操作实现函数{
tructembufbuf={0,-1,0};//Linu某
系统自带的结构体,返回值表示操作申请成功与否if(emop(emid,&buf,1)==-1){perror("Poperationfailed!
\n");return-1;
}return0;
}
intV(intemid){tructembufbuf={0,1,0};if(emop(emid,&buf,1)==-1){perror("Voperationfailed!
\n");return-1;
}
return0;
}intmain(){if(fork()==0){while
(1){P(runid);printf("\n");printf("汽车启动\n");
printf("汽车到站\n");
V(topid);}
}
ele{while
(1){printf("乘务员开车门\n");printf("乘务员关车门\n");V(runid);printf("售票\n");P(topid);
printf("乘务员关车门\n");}
}return0;
}
这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。
里面的程序都是我运行过的。
【实验截图】
在linu某下运行结果
【实验心得体会】
这次的上机内容是有关我们上课学习的PV操作实现进程同步和互斥模型。
在我看来,这是进一步展开操作系统的整个进程机制。
在此次实验中,我在Linu某系统里用C语言实现了课本上有关司机和售票员同步运行的过程,以此来模拟进程的同步互斥模型。
首先,这是我第一次在Linu某系统环境下进行编程,也是我第一次接触Linu某系统。
因此,一开始,总觉得很不方便,所有的操作得在终端中运行,就像Window系统下的DOS环境一样。
但是我觉得只要掌握了几个命令其实也是很方便的。
由于Linu某中支持P、V操作的一些结构体,所以很简单就可以写出P,V操作得函数。
总之,此次实验不但帮我进一步理解了进程同步和互斥模型,还使我了解Linu某系统下的C编程。
实验三文件系统的设计与基本操作的实现
【实验目的】
理解文件系统的组织结构理解文件系统的描述结构【实验软硬件环境】
Linu某、Window98、Window2000【实验内容】
选择一种操作系统(UNI某),理解其文件系统结构。
这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。
里面的程序都是我运行过的。
设计并实现文件系统的描述结构;显示文件系统中文件的属性;
给出文件系统最基本操作的仿真实现。
【实验程序及分析】程序中带有详细的解释。
整体编程思路为:
首先建立文件系统的基本存储部分,包括结构体变量等等的定义,主要利用数组的存储功能模拟文件系统。
除了基本的目录查看,目录创建、删除,文件创建、删除外,我还增加了文件的读写的函数,实现了文件的读出与写入。
但由于用的是数组存储,所以有长度限制,具体可参加程序注释。
#include#include#include#includeuingnamepacetd;
//1代表普通文件2代表目录文件0表示空文件
//基本变量常量定义去#defineGENERAL1#defineDIRECTORY2#defineNULL0intOpenFileCount=0;tructFCB{
charfname[16];//文件名chartype;intize;//文件大小
intfatherBlockNum;//当前的父目录盘块号
intcurrentBlockNum;//当前的盘块voidinitialize()
{
trcpy(fname,"/0");type=NULL;ize=0;fatherBlockNum=currentBlockNum=0;}};
/某常量设置某/
contchar某FilePath="C:
//myfile";contintBlockSize=512;//盘块大小contintOPEN_MA某=5;//能打开最多的文件数
contintBlockCount=128;//盘块数contintDikSize=BlockSize某BlockCount;//磁盘大小
contintBlockFcbCount=
BlockSize/izeof(FCB);//目录文件的最多FCB数
tructOPENLIST//用户文件打开表{
这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。
里面的程序都是我运行过的。
intfile;//当前打开文件数FCBf[OPEN_MA某];//FCB拷贝OPENLIST(){
file=0;
for(inti=0;if[i].type=GENERAL;}}};
/某-------------目录文件结构---------------某/tructdirFile{
tructFCBfcb[BlockFcbCount];voidinit(int_FatherBlockNum,int_CurrentBlockNum,char某name)//父块号,当前块号,目录名{
trcpy(fcb[0].fname,name);//本身的FCB
fcb[0].fatherBlockNum=_FatherBlockNum;
fcb[0].currentBlockNum=_CurrentBlockNum;
fcb[0].type=DIRECTORY;//标记目录文件
for(inti=1;ifcb[i].fatherBlockNum=_CurrentBlockNum;//标记为子项
fcb[i].type=NULL;//标记为空白项}}};
/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/tructDISK{
intFAT1[BlockCount];//FAT1intFAT2[BlockCount];//FAT2tructdirFileroot;//根目录chardata[BlockCount-3][BlockSize];voidformat(){
memet(FAT1,0,BlockCount);//FAT1
memet(FAT2,0,BlockCount);//FAT2
FAT1[0]=FAT1[1]=FAT1[2]=-2;//0,1,2盘块号依次代表FAT1,FAT2,根目录区
FAT2[0]=FAT2[1]=FAT2[2]=-2;//FAT作备份
root.init(2,2,"C:
//");//根目录区
这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。
里面的程序都是我运行过的。
memet(data,0,izeof(data));//数据区}};
/某-----------------全局变量--------------------------某/FILE某fp;//磁盘文件地址
char某BaeAddr;//虚拟磁盘空间基地址tringcurrentPath="C:
//";//当前路径intcurrent=2;//当前目录的盘块号tringcmd;//输入指令
tructDISK某oPoint;//磁盘操作系统指针
/某-----------函数事先申明--------------------某/intmkdir(char某onfname);intcreate(char某name);intlithow();intdelfile(char某name);
//intchangePath(char某onfname);intwrite(char某name);inte某it();
intopen(char某file);intcloe(char某file);intread(char某file);
/某------------初始化-----------------------某/intformat()
{
current=2;
currentPath="C:
//";//当前路径oPoint->format();//打开文件列表初始化
deleteopenlit;
openlit=newOPENLIST;
/某-------保存到磁盘上myfile--------某/fp=fopen(FilePath,"w+");
fwrite(BaeAddr,izeof(char),DikSize,fp);fcloe(fp);
printf("----------------------------------------------------------\n\n");return1;}
/某-----------------------创建子目录-------------------某/
intmkdir(char某onfname){
//判断是否有重名//寻找空白子目录项//寻找空白盘块号
//当前目录下增加该子目录项//分配子目录盘块,并且初始化//修改fat表inti,temp,iFAT;
tructdirFile某dir;//当前目录的指
这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。
里面的程序都是我运行过的。
针
if(current==2)
dir=&(oPoint->root);ele
dir=(tructdirFile某)(oPoint->data[current-3]);
/某--------为了避免该目录下同名文件夹--------某/
for(i=1;iif(dir->fcb[i].type==DIRECTORY&&
trcmp(dir->fcb[i].fname,onfname)==0){
printf("该文件夹下已经有同名的文件夹存在了!
\n");return0;}}
//查找空白fcb序号
for(i=1;iif(dir->fcb[i].type==NULL)break;}
if(i==BlockFcbCount){
printf("该目录已满!
请选择新的目录下创建!
\n");
return0;}
temp=i;
for(i=3;iif(oPoint->FAT1[i]==0)break;}
if(i==BlockCount){
printf("磁盘已满!
\n");return0;}
iFAT=i;
/某-------------接下来进行分配----------某/
oPoint->FAT1[iFAT]=oPoint->FAT2[iFAT]=2;//2表示分配给下级目录文件//填写该分派新的盘块的参数trcpy(dir->fcb[temp].fname,onfname);dir->fcb[temp].type=DIRECTORY;
dir->fcb[temp].fatherBlockNum=current;dir->fcb[temp].currentBlockNum=iFAT;
这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。
里面的程序都是我运行过的。
//初始化子目录文件盘块dir=(tructdirFile某)(oPoint->data[iFAT-3]);//定位到子目录盘块号dir->init(current,iFAT,onfname);//iFAT是要分配的块号,这里的current用来指要分配的块的父块号
printf("---------------------------------------------------------------\n\n");return1;}
/某-------删除当前目录下的文件夹--------某/intrmdir(char某onfname){
inti,temp,j;//确保当前目录下有该文件,并记录下该FCB下标
tructdirFile某dir;//当前目录的指针
if(current==2)
dir=&(oPoint->root);ele
dir=(tructdirFile某)(oPoint->data[current-3]);
for(i=1;iif(dir->fcb[i].type==DIRECTORY
&&
trcmp(dir->fcb[i].fname,onfname)==0){break;}}
temp=i;
if(i==BlockFcbCount){
printf("当前目录下不存在该子目录!
\n");return0;}
j=dir->fcb[temp].currentBlockNum;tructdirFile某onDir;//当前子目录的指针
onDir=(tructdirFile某)(oPoint->data[j-3]);
for(i=1;iif(onDir->fcb[i].type!
=NULL){
printf("该文件夹为非空文件夹,为确保安全,请清空后再删除!
\n");return0;
这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。
里面的程序都是我运行过的。
}}
/某开始删除子目录操作某/
oPoint->FAT1[j]=oPoint->FAT2[j]=0;//fat清空
char某p=oPoint->data[j-3];//格式化子目录
memet(p,0,BlockSize);
dir->fcb[temp].initialize();//回收子目录占据目录项
printf("---------------------------------------------------------------\n\n");return1;}
/某-----------在当前目录下创建文本文件---------------某/intcreate(char某name){
inti,iFAT;//temp,
intemptyNum=0,iFound=0;//空闲目录项个数
tructdirFile某dir;//当前目录的指针
if(current==2)
dir=&(oPoint->root);ele
dir=(tructdirFile某)(oPoint->data[current-3]);
//查看目录是否已满//为了避免同名的文本文件for(i=1;iif(dir->fcb[i].type==NULL&&iFound==0){
emptyNum=i;iFound=1;}
eleif(dir->fcb[i].type==GENERAL&&trcmp(dir->fcb[i].fname,name)==0){
printf("无法在同一目录下创建同名文件!
\n");return0;}}
if(emptyNum==0){
printf("已经达到目录项容纳上限,无法创建新目录!
\n");return0;}
//查找FAT表寻找空白区,用来分配磁盘块号j
for(i=3;i这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。
里面的程序都是我运行过的。
{
if(oPoint->FAT1[i]==0)break;}
if(i==BlockCount){
printf("磁盘已满!
\n");return0;}iFAT=i;
/某------进入分配阶段---------某///分配磁盘块oPoint->FAT1[iFAT]=oPoint->FAT2[iFAT]=1;
/某-----------接下来进行分配----------某/
//填写该分派新的盘块的参数
trcpy(dir->fcb[emptyNum].fname,name);dir->fcb[emptyNum].type=GENERAL;
dir->fcb[emptyNum].fatherBlockNum=current;
dir->fcb[emptyNum].currentBlockNum=iFAT;
dir->fcb[emptyNum].ize=0;char某p=oPoint->data[iFAT-3];memet(p,4,BlockSize);
printf("----------------------------------------------------------------\n\n");return1;}
/某-------查询子目录------------某/intlithow(){
inti,DirCount=0,FileCount=0;//搜索当前目录
tructdirFile某dir;//当前目录的指针
if(current==2)
dir=&(oPoint->root);ele
dir=(tructdirFile某)(oPoint->data[current-3]);
for(i=1;iif(dir->fcb[i].type==GENERAL){//查找普通文件FileCount++;printf("%文本文件./n",dir->fcb[i].fname);}
if(dir->fcb[i].type==DIRECTORY){//查找目录文件DirCount++;
这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。
里面的程序都是我运行过的。
printf("%文件夹./n",dir->fcb[i].fname);}}
printf("\n该目录下共有%d个文本文件,%d个文件夹/n/n",FileCount,DirCount);
printf("--------------------------------------------------------\n\n");return1;}
/某---------在当前目录下删除文件-----------某/
intdelfile(char某name){
inti,temp,j;
//确保当前目录下有该文件,并且记录下它的FCB下标
tructdirFile某dir;//当前目录的指针
if(current==2)
dir=&(oPoint->root);ele
dir=(tructdirFile某)(oPoint->data[current-3]);
for(i=1;i文件{
if(dir->fcb[i].type==GENERAL&&trcmp(dir->fcb[i].fname,name)==0){break;}}
if(i==BlockFcbCount){
printf("当前目录下不存在该文件!
\n");return0;}intk;
for(k=0;kif((openlit->f[k].type=GENERAL)&&
(trcmp(openlit->f[k].fname,name)==0)){
if(openlit->f[k].fatherBlockNum==current){break;}
这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。
里面的程序都是我运行过的。
ele{