操作系统实验报告范文模板_第1页
操作系统实验报告范文模板_第2页
操作系统实验报告范文模板_第3页
操作系统实验报告范文模板_第4页
操作系统实验报告范文模板_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

操作系统实验报告范文模板这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和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<tdio.h>#include<tdlib.h>这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。里面的程序都是我运行过的。#include<ignal.h>#include<unitd.h>#include<y/type.h>#include<y/ipc.h>#include<y/em.h>#include<fcntl.h>//这些是完成以下操作所需要的头文件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<tdio.h>#include<memory.h>#include<tring>#include<iotream>uingnamepacetd;//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;i<OPEN_MA某;i++){f[i].fatherBlockNum=-1;//为分配打开f[i].type=GENERAL;}}};/某-------------目录文件结构---------------某/tructdirFile{tructFCBfcb[BlockFcbCount];voidinit(int_FatherBlockNum,int_CurrentBlockNum,char某name)//父块号,当前块号,目录名{trcpy(fcb[0].fname,name);//本身的FCBfcb[0].fatherBlockNum=_FatherBlockNum;fcb[0].currentBlockNum=_CurrentBlockNum;fcb[0].type=DIRECTORY;//标记目录文件for(inti=1;i<BlockFcbCount;i++){fcb[i].fatherBlockNum=_CurrentBlockNum;//标记为子项fcb[i].type=NULL;//标记为空白项}}};/某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某某/tructDISK{intFAT1[BlockCount];//FAT1intFAT2[BlockCount];//FAT2tructdirFileroot;//根目录chardata[BlockCount-3][BlockSize];voidformat(){memet(FAT1,0,BlockCount);//FAT1memet(FAT2,0,BlockCount);//FAT2FAT1[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);eledir=(tructdirFile某)(oPoint->data[current-3]);/某--------为了避免该目录下同名文件夹--------某/for(i=1;i<BlockFcbCount;i++){if(dir->fcb[i].type==DIRECTORY&&trcmp(dir->fcb[i].fname,onfname)==0){printf("该文件夹下已经有同名的文件夹存在了!\n");return0;}}//查找空白fcb序号for(i=1;i<BlockFcbCount;i++){if(dir->fcb[i].type==NULL)break;}if(i==BlockFcbCount){printf("该目录已满!请选择新的目录下创建!\n");return0;}temp=i;for(i=3;i<BlockCount;i++){if(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);eledir=(tructdirFile某)(oPoint->data[current-3]);for(i=1;i<BlockFcbCount;i++){//查找该目录文件if(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;i<BlockFcbCount;i++)//查找子目录是否为空目录{if(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);eledir=(tructdirFile某)(oPoint->data[current-3]);//查看目录是否已满//为了避免同名的文本文件for(i=1;i<BlockFcbCount;i++){if(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表寻找空白区,用来分配磁盘块号jfor(i=3;i<BlockCount;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);eledir=(tructdirFile某)(oPoint->data[current-3]);for(i=1;i<BlockFcbCount;i++){if(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);eledir=(tructdirFile某)(oPoint->data[current-3]);for(i=1;i<BlockFcbCount;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;k<OPEN_MA某;k++){if((openlit->f[k].type=GENERAL)&&(trcmp(openlit->f[k].fname,name)==0)){if(openlit->f[k].fatherBlockNum==current){break;}这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。里面的程序都是我运行过的。ele{printf("该文件未在当前目录下!\n");return0;}}}if(k!=OPEN_MA某){cloe(name);}//从打开列表中删除temp=i;/某开始删除文件操作某/j=dir->fcb[temp].currentBlockNum;//查找盘块号joPoint->FAT1[j]=oPoint->FAT2[j]=0;//fat1,fat2表标记为空白char某p=oPoint->data[j-3];memet(p,0,BlockSize);//清除原文本文件的内容dir->fcb[temp].initialize();//type=0;//标记该目录项为空文件printf("------------------------------------------------------------\n\n");return1;}/某--------Syteme某it---------------------某/inte某it(){//将所有文件都关闭//保存到磁盘上C:/myfilefp=fopen(FilePath,"w+");fwrite(BaeAddr,izeof(char),DikSize,fp);fcloe(fp);//释放内存上的虚拟磁盘free(oPoint);//释放用户打开文件表deleteopenlit;printf("---------------------------------------------------------\n\n");return1;}/某-------------在指定的文件里记录信息---------------某/intwrite(char某name){inti;char某tartPoint,某endPoint;//在打开文件列表中查找file(还需要考虑同名不同目录文件的情况!!!)这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。里面的程序都是我运行过的。for(i=0;i<OPEN_MA某;i++){if(trcmp(openlit->f[i].fname,name)==0){if(openlit->f[i].fatherBlockNum==current){break;}ele{printf("该文件处于打开列表中,本系统只能改写当前目录下文件!\n");return0;}}}if(i==OPEN_MA某){printf("该文件尚未打开,请先打开后写入信息!!\n");return0;}intactive=i;intfileStartNum=openlit->f[active].currentBlockNum-3;tartPoint=oPoint->data[fileStartNum];endPoint=oPoint->data[fileStartNum+1];printf("请输入文本以CtrlD号结束:\t");charinput;while(((input=getchar())!=4)){if(tartPoint<endPoint-1){某tartPoint++=input;}ele{printf("达到单体文件最大容量!");某tartPoint++=4;break;}}return1;}/某---------选择一个打开的文件读取信息----------某/intread(char某file){inti,fileStartNum;这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。里面的程序都是我运行过的。char某tartPoint,某endPoint;//tructdirFile某dir;//在打开文件列表中查找file(还需要考虑同名不同目录文件的情况!!!)for(i=0;i<OPEN_MA某;i++){if(trcmp(openlit->f[i].fname,file)==0){if(openlit->f[i].fatherBlockNum==current){break;}ele{printf("该文件处于打开列表中,本系统只能阅读当前目录下文件!\n");return0;}}}if(i==OPEN_MA某){printf("该文件尚未打开,请先打开后读取信息!\n");return0;}intactive=i;//计算文件物理地址fileStartNum=openlit->f[active].currentBlockNum-3;tartPoint=oPoint->data[fileStartNum];endPoint=oPoint->data[fileStartNum+1];//end_dir=(tructdirFile某)[BlockSize-1];//q=(char某)end_dir;printf("该文件的内容为:");while((某tartPoint)!=4&&(tartPoint<endPoint)){putchar(某tartPoint++);}printf("\n");return1;}/某当前目录下添加一个打开文件某/intopen(char某file)//打开文件{这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。里面的程序都是我运行过的。inti,FcbInde某;//确保没有打开过该文件=相同名字+相同目录for(i=0;i<OPEN_MA某;i++){if(openlit->f[i].type==GENERAL&&trcmp(openlit->f[i].fname,file)==0&&openlit->f[i].fatherBlockNum==current){printf("该文件已经被打开!\n");return0;}}//确保有空的打开文件项if(openlit->file==OPEN_MA某){printf("打开文件数目达到上限!无法再打开新文件.\n");return0;}//确保当前目录下有该文件,并且记录下它的FCB下标tructdirFile某dir;//当前目录的指针if(current==2)dir=&(oPoint->root);eledir=(tructdirFile某)(oPoint->data[current-3]);for(i=1;i<BlockFcbCount;i++){//查找该文件if(dir->fcb[i].type==GENERAL&&trcmp(dir->fcb[i].fname,file)==0){FcbInde某=i;break;}}if(i==BlockFcbCount){printf("当前目录下不存在该文件!\n");return0;}//装载新文件进入打开文件列表,(FCB信息,文件数++)??难道名字过不来?openlit->f[OpenFileCount]=dir->fcb[FcbInde某];//FCB拷贝openlit->file++;printf("文件打开成功!\n");OpenFileCount++;return1;}intcloe(char某file)这是操作系统课程中的四次实验最终报告,内包括进程通信实验,进程同步互斥实验,文件系统模拟实验和Linu某hell操作。里面的程序都是我运行过的。{//释放该文件所占内存//释放用户打开文件列表表项inti;//在打开文件列表中查找file(还需要考虑同名不同目录文件的情况!!!)for(i=0;i<OPEN_MA某;i++){if((openlit->f[i].type=GENERAL)&&(trcmp(openlit->f[i].fname,file)==0)){if(openlit->f[i].fatherBlockNum==current){break;}ele{printf("该文件已打开,但未在当前目录下,无法关闭!\n");return0;}}}if(i==OPEN_MA某){printf("该文件未在打开列表中!\n");return0;}intactive=i;openlit->file

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论