2022年操作系统课程设计模拟文件系统.docx
操作系统课程设计模拟文件系统学专院:业:运算机科学技术运算机科学与技术(工)班级:计 10- 1 班姓名:曲艳波学号:202117020218指导老师:葛建梅2021 年 07 月 16 日操作系统原理课程设计任务书(运算机科学与技术专业10-1 )一、课程设计题目(任选一个题目)1. 模拟进程治理2. 模拟处理机调度3. 模拟储备器治理4. 模拟文件系统5. 模拟磁盘调度二、设计目地和要求1. 设计目地操作系统原理课程设计是网络工程专业实践性环节之一,是学习完操作系统原理课程后进行地一次较全面地综合练习.其目地在于加深对操作系统地理论、方法和基础学问地懂得,把握操作系统结构、实现机理和各种典型算法,系统地明白操作系统地设计和实现思路,培育同学地系统设计才能,并明白操作系统地进展动向和趋势.2. 基本要求:1挑选课程设计题目中地一个课题,独立完成. 2良好地沟通和合作才能3充分运用前序课所学地软件工程、程序设计、数据结构等相关学问4充分运用调试和排错技术(5) 简洁测试驱动模块和桩模块地编写(6) 查阅相关资料,自学具体课题中涉及到地新学问.(7) 课题完成后必需按要求提交课程设计报告,格式规范,内容详实.三、设计内容及步骤1. 依据设计题目地要求,充分地分析和懂得问题,明确问题要求做什么.2. 依据实现地功能,划分出合理地模块,明确模块间地关系.3. 编程实现所设计地模块.4. 程序调试与测试.采纳自底向上,分模块进行,即先调试低层函数.能够娴熟把握调试工具地各种功能,设计测试数据确定疑点,通过修改程序来证明它或绕过它.调试正确后,仔细整理源程序及其注释,形成格式和风格良好地源程序清单和结果;5. 结果分析 .程序运行结果包括正确地输入及其输出结果和含有错误地输入及其输出结果.目录1. 课程设计地目地12. 课程设计地要求13. 需求分析13.1 问题描述13.2 数据结构13.2.1 类13.2.2 结构23.2.3 函数23.3 系统运行环境24. 概要设计34.1 创建文件操作34.2 删除文件操作34.3 查看文件块号45 具体设计45.1 创建文件45.2 删除文件75.3 查看文件块号106.总结12参考文献13附录151. 课程设计地目地把握模拟文件系统地设计方法,具备初步地独立分析和设计才能. 初步把握软件开发过程地问题分析、系统设计、程序编码、测试等基本方法和技能.提高综合运用所学地理论学问和方法以及独立分析和解决问题地才能.训练用系统地观点和软件开发地一般规范进行软件开发,培育软件工作者所应具备地科学地工作方法和作风. 理论联系实践提高运算机专业综合水平.2. 课程设计地要求将所要设计地文件系统确定化,并设计出该确定化地模拟文件系统程序,要求程序有效不显现死循环,具有实际应用意义. 按操作由键盘输入所要执行地命令地代号,并输入相应要求地内容 . 依据命令执行,并输出结果.3. 需求分析3.1 问题描述模拟文件系统试验内容和步骤:建立一个用户接口,其功能包括能依据用户地挑选,运行相应地程序模块,实现诸如改名文件、删除文件、显示文件等功能.3.2 数据结构3.2.1 类class Cuser3.2.2 结构typedef struct UFD/储备文件信息char name10;int attribute;/ 文件属性int length;int a10;int *p1;/ 一级索引int *p2100;/ 二级索引struct UFD *next;/指向文件链表中此文件结点地下一个结点UFD;3.2.3 函数UFD *Fhead;/ 文件链表地头结点int dis_file;/ 显示文件所占外存块号int dele_fileUFD *f;/ 删除文件地具体实现部分int new_file;int open_file;int first_dele_file;/ 实现删除文件地前部分工作3.3 系统运行环境操作系统: Windows XP运行软件: Microsoft Visual C+ 6.04. 概要设计4.1 创建文件操作由于创建文件必需要有文件名,所以空路径和路径“”在此成为错误 . 而且正由于如此,在此模块中需要分解出文件名,再把不含文件名地路径传递给“查找模块”,其次,开头输入 2输入文件名,长度,属性NOp->length<disk_emptyYESp->length<110p->length < 10NONOYESYES采纳三级索引采纳二级索引采纳一级索引创建胜利完成其中涉及了创建文件地操作,它包括:在找到目录中地nextf中添加一项并把文件地指针指向目录,即给文件赋值等操作. 具体流程如 4-1-1所示:图 4-1-1创建文件流程图4.2 删除文件操作删除文件必需有文件名,所以不答应空路径或路径文“”在此模块中分解出文件名,对不含文件名地路径进行处理. 删除操作在找到上一级目录后,再找出上一级目录,将之后地指针向前移一位,文件被删除.4.3 查看文件块号文件地内存空间为1000 块,每当创建一个文件安排连续地储备块号给此文件,查看地时候先输入要查询地文件名依据用户输入地文件名找到此文件和相应地块号.5 具体设计5.1 创建文件在创建文件文件时要考虑文件地大小是否满意当前磁盘地剩余空间,只有当期望创建文件地大小小于磁盘剩余空间才可创建. 具体实现程序:int Cuse:new_fileint i=0,j=0;UFD *p=0;p=new UFD;ifp=0cout<<"内存空间已满,创建文件失败!"<<endl ;return 1;cout<<"请输入建立地文件地名称,长度,属性(0: 只读, 1: 读写) "<<endl ;cin>>p->name>>p->length>>p->attribute;ifp->length>disk_emptycout<<"作业太大,当前硬盘可用空间为:"<<disk_empty<<endl;delete p;return 0;fori=0;i<p->length&&i<10;i+ forj;j<10000 ;j+ifdisk_blockj=0p->ai=j;disk_blockj=1j+;break;p->p1=0 ;p->p2=0 ;ifp->length>10/一级索引地实现p->p1=new int100;fori=10;i<p->length&&i<110;i+ forj;j<10000 ;j+ifdisk_blockj=0 p->p1i-10=j;disk_blockj=1;j+ ;break ;ifp->length>110/二级索引地实现p->p2=new int100100;fori=110;i<p->length; i+ forj;j<10000 ;j+ifdisk_blockj=0int m=i-110/100 ;int k=i-110%100;p->p2mk=j;disk_blockj=1;j+ ;break ;ifnow=0p->next=Fhead ;Fhead=p;elsep->next=now->File_head;now->File_head=p;DIR *h=now ;whileh.=0h->length+=p->length;h=h->above ;cout<<" 文件创建胜利! "<<endl ;disk_empty=disk_empty-p->length;length+=p->length;return 1;具体调试界面如下图所示:图 5-1-1图 5-1-25.2 删除文件具体实现程序:int Cuse:first_dele_filechar temp10;cout<<"请输入你要删除地文件名:"<<endl ;cin>>temp;UFD *f=Fhead;UFD *above=0;ifnow.=0f=now->File_head;whilef.=0if.strcmpf->name,temp break;above=f;f=f->next;iff=0cout<<"此文件不存在! "<<endl ;return 0;disk_empty+=f->length;ifnow=0iff=FheadFhead=Fhead->next;elseabove->next=f->next;elseDIR *d=now;whiled.=0/修改删除文件后各级目录地大小d->length-=f->length;d=d->above;iff=now->File_head/删除文件结点now->File_head=now->File_head->next;elseabove->next=f->next;length-=f->length;this->dele_filef;cout<<"删除胜利 "<<endl ;return 1;int Cuse:dele_fileUFD *fint i=0,m;fori=0;i<10&&i<f->length;i+m=f->ai;disk_blockm=0;iff->p1.=0fori=10;i<110&&i<f->length;i+m=f->p1i-10;disk_blockm=0;delete f->p1;iff->p2.=0fori=110;i<f->length;i+m=f->p2i-110/100i-110%100;disk_blockm=0;delete f->p2;delete f;f=0;return 1;具体调试如图 5-2-1 所示:图 5-2-15.3 查看文件块号具体实现程序:int Cuse:dis_fileint i;char n10;UFD *f=Fhead;ifnow.=0f=now->File_head;cout<<"请输入你要查看地文件地名称:"<<endl ;cin>>n;whilef.=0if.strcmpn,f->name break;f=f->next;iff=0cout<<"当前目录下没有这个文件:"<<endl ;return 0;cout<<"此文件占用硬盘块号如下:"<<endl ;fori=0;i<f->length&&i<10;i+cout<<setw6<<f->ai;ifi+1%10=0cout<<endl;fori=10;i<f->length&&i<110;i+/显示一级索引块号cout<<setw6<<f->p1i-10;ifi+1%10=0cout<<endl;fori=110; i<f->length;i+/显示二级索引块号cout<<setw6<<f->p2i-110/100i-110%100;ifi+1%10=0cout<<endl ;cout<<endl;return 1;具体调试如图 5-3-1 所示:图 5-3-16. 总结本次课程设计使知道了如何定义类来实现相应地功能,运用链表、指针等设计出了一个简洁有用地文件治理系统同时也使以前所学学问得到巩固. 操作系统是一门将硬件功能、程序设计语言、数据结构、算法、运算机体系结构、软件工程等运算机学问紧密结合在一起地学科,它将对我今后地学习和工作产生庞大地帮忙.参考文献1 汤小丹 .运算机操作系统(第三版). 西安:西安电子科技高校出版社,2007.52 谭浩强 . C+ 程序设计 .北京:清华高校出版社,2004附录课设全部程序:#include "disk.h" #include<string.h> #include<iostream.h> #include<iomanip.h>/int disk_block10000;/int disk_empty;Cdisk:Cdiskint i=0;char code10="123456";fori=0;i<10000 ;i+ disk_blocki=0;this->user0.set_user"jun","123";disk_empty=10000;cout.setfios:left;Cdisk:Cdiskint Cdisk:dele_userint iCuse C;C=useri;useri.dele_user;return 1;int Cdisk:dis_diskint i=0;cout<<setw14<<"用户名 "<<setw14<<"占用空间大小 "<<endl ;fori=0;i<5 ;i+ ifuseri.get_status=1cout<<setw14<<useri.get_name<<setw14<<useri.get_length<<endl;cout<<"已 用空间 :"<<10000-disk_empty<<endl<<"剩 余 空间 :"<<disk_empty<<endl;return 1;int Cdisk:loginchar n10,c10;int i;cout<<" 请输入用户名与密码,中间用空格隔开"<<endl ;cin>>n>>c ;fori=0;i<5 ;i+ifuseri.get_statusif.strcmpn,useri.get_nameif.strcmpc,useri.get_codecout<<" 登陆胜利! "<<endl ;cout<<"欢 迎 "<<useri.get_name<<"登 陆"<<endl ;return i;elsecout<<" 密码错误: "<<endl ;return -1;cout<<" 不存在用户 "<<endl ;return -1;int Cdisk:set_codechar temp110,temp210;cout<<"请输入密码: "<<endl ;cin>>temp1;ifstrcmptemp1,codecout<<"密码错误! "<<endl ;return 0;while1cout<<"请输入新密码: "<<endl ;cin>>temp1;cout<<"请再次输入新密码: "<<endl ;cin>>temp2;ifstrcmptemp1,temp2cout<<"密码设置出错! "<<endl ;break;cout<<"密码设置胜利! "<<endl ;strcpycode,temp1;return 1;int Cdisk:new_userchar n10,c10;int i=0;fori=0;i<5 ;i+ ifuseri.get_status=0break;ifi=5cout<<" 用户名额已满,创建不胜利!"<<endl ;return 0;useri.set_status1;cout<<" 请输入用户名称:"<<endl ;cin>>n ;cout<<" 请输入密码: "<<endl ;cin>>c ;useri.set_usern,c; cout<<" 用户创建胜利! "<<endl ;return 1;int Cdisk:first_dele_userchar n10,c;int i;cout<<"请输入你要删除地用户地名称:"<<endl ;cin>>n;fori=0;i<5 ;i+ if.strcmpuseri.get_name,n&&useri.get_statusbreak;ifi=5cout<<" 此用户不存在! "<<endl ;return 0;cout<<" 确认删除此用户 .确认请按 Y,取消请按其它键"<<endl ;cin>>c ;ifc.='Y'cout<<" 已经取消删除! "<<endl ;return 0;this->dele_useri;cout<<" 用户删除胜利! "<<endl ;return 1;Cuse:Cusestatus=0;length=0;now=0;Fhead=0;Dhead=0;Cuse:Cusedisk_empty+=length;length=0; UFD *f=Fhead;DIR *d=Dhead;whilef.=0iff->next=0this->dele_filef;f=0;break;whilef->next->next.=0 f=f->next;this->dele_filef->next;f->next=0;f=Fhead;whiled.=0ifd->next=0this->dele_dird;d=0;break;whiled->next->next.=0 d=d->next;this->dele_dird->next;d->next=0;d=Dhead;int Cuse:new_fileint i=0,j=0;UFD *p=0;p=new UFD;ifp=0cout<<"内存空间已满,创建文件失败!"<<endl ;return 1;cout<<"请输入建立地文件地名称,长度,属性(0: 只读, 1: 读写) "<<endl ;cin>>p->name>>p->length>>p->attribute;ifp->length>disk_emptycout<<"作业太大,当前硬盘可用空间为:"<<disk_empty<<endl;delete p;return 0;fori=0;i<p->length&&i<10;i+ forj; j<10000 ;j+ifdisk_blockj=0p->ai=j;disk_blockj=1j+;break;p->p1=0 ;p->p2=0 ;ifp->length>10/一级索引地实现p->p1=new int100;fori=10;i<p->length&&i<110;i+ forj;j<10000 ;j+ifdisk_blockj=0 p->p1i-10=j;disk_blockj=1;j+ ;break ;ifp->length>110/二级索引地实现p->p2=new int100100;fori=110;i<p->length; i+ forj;j<10000 ;j+ifdisk_blockj=0intm=i-110/100 ;intk=i-110%100;p->p2mk=j;disk_blockj=1;j+ ;break ;ifnow=0p->next=Fhead ;Fhead=p;elsep->next=now->File_head;now->File_head=p;DIR *h=now ;whileh.=0h->length+=p->length;h=h->above ;cout<<" 文件创建胜利! "<<endl ;disk_empty=disk_empty-p->length;length+=p->length;return 1;int Cuse:new_dirDIR *p,*h;cout<<"请输入新目录地名称:"<<endl ;p=new DIR;cin>>p->name;p->Dir_head=0;p->length=0;p->File_head=0;ifnow=0 h=Dhead;elseh=now->Dir_head;whileh.=0if.strcmph->name,p->namecout<<"此目录已经存在 "<<endl ;return 0;h=h->next;ifnow=0p->above=0;p->next=Dhead;Dhead=p;elsep->above=now ;p->next=now->Dir_head;now->Dir_head=p ;cout<<"目录创建胜利! "<<endl ;return 1;int Cuse:gobackifnow=0cout<<"主目录,不能再次向上"<<endl ;return 0;now=now->above;return 1;int Cuse:open_dirchar name10;DIR *p;ifnow=0 p=Dhead;elsep=now->Dir_head;cout<<"请输入你要打开地目录名称:"<<endl ;cin>>name;int flag=0;whilep.=0ifstrcmpp->name,name=0now=p;return 1;p=p->next;cout<<"当前目录中不存在该目录"<<endl ;return 0;int Cuse:first_dele_filechar temp10;cout<<"请输入你要删除地文件名:"<<endl ;cin>>temp;UFD *f=Fhead;UFD *above=0;ifnow.=0f=now->File_head;whilef.=0if.strcmpf->name,temp break;above=f;f=f->next;iff=0cout<<"此文件不存在! "<<endl ;return 0;disk_empty+=f->length;ifnow=0iff=FheadFhead=Fhead->next;elseabove->next=f->next;elseDIR *d=now;whiled.=0/修改删除文件后各级目录地大小d->length-=f->length;d=d->above;iff=now->File_head/删除文件结点now->File_head=now->File_head->next;elseabove->next=f->next;length-=f->length;this->dele_filef;cout<<"删除胜利 "<<endl ;return 1;int Cuse:dele_fileUFD *fint i=0,m;fori=0;i<10&&i<f->length;i+m=f->ai;disk_blockm=0;iff->p1.=0fori=10;i<110&&i<f->length;i+m=f->p1i-10;disk_blockm=0;delete f->p1;iff->p2.=0fori=110;i<f->length;i+m=f->p2i-110/100i-110%100;disk_blockm=0;delete f->p2;delete f;f=0;return 1;int Cuse:first_dele_dirchar n10;char c;DIR *p,*above=0;p=Dhead; ifnow.=0p=now->Dir_head;cout<<"请输入你要删除地目录地名称:"<<endl ;cin>>n;whilep.=0if.strcmpp->name,n break;above=p;p=p->next;ifp=0cout<<"没有这个目录 "<<endl ;return 0;cout<<"你确定要删除当前目录及此目标下面地全部信息吗?按0 确定,按其它键取消 "<<endl ;cin>>c;ifc.='0'return 0;disk_empty+=p->length;ifnow=0ifp=DheadDhead=Dhead->next;elseabove->next=p->next;elseifp=now->Dir_headnow->Dir_head=now->Dir_head->next;elseabove->next=p->next;above=now;whileabove.=0/修改删除目录后各级目录地大小above->length-=p->length;above=above->above;length-=p->length;this->dele_dirp;p=0;cout<<"删除胜利! "<<endl ;return 1;int Cuse:dele_dirDIR *pint flag=0;DIR *d=p->Dir_head;UFD *f=p->File_head;iff.=0whilep->File_head->next.=0/删除此目录下地文件f=p->File_head;whilef->next->next.=0/查找最终一个文件结点f=f->next;this->dele_filef->next;f->next=0;ifp->File_head->next=0this->dele_filep->File_head;p->File_head=0;ifd.=0whilep->Dir_head->next.=0/删除此目录下地目录d=p->Dir_head;whiled->next->next.=0/查找最终一个文件结点d=d->next;this->dele_dird->next;/ 递归调用此函数d->next=0;ifp->Dir_head->next=0this->dele_dirp->Dir_head;p->Dir_head=0;delete p;p=0; return 1;int Cuse:dis_nowDIR *d=Dhead ;UFD *f=Fhead ;