学位论文操作系统课程设计模拟文件系统.docx
《学位论文操作系统课程设计模拟文件系统.docx》由会员分享,可在线阅读,更多相关《学位论文操作系统课程设计模拟文件系统.docx(46页珍藏版)》请在冰豆网上搜索。
学位论文操作系统课程设计模拟文件系统
操作系统课程设计
模拟文件系统
学院:
计算机科学技术
专业:
计算机科学与技术(工)
班级:
计10-1班
姓名:
曲艳波
学号:
201017020118
指导教师:
葛建梅
2013年07月16日
《操作系统原理》课程设计任务书
(计算机科学与技术专业10-1)
一、课程设计题目(任选一个题目)
1.模拟进程管理
2.模拟处理机调度
3.模拟存储器管理
4.模拟文件系统
5.模拟磁盘调度
二、设计目的和要求
1.设计目的
《操作系统原理》课程设计是网络工程专业实践性环节之一,是学习完《操作系统原理》课程后进行的一次较全面的综合练习。
其目的在于加深对操作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。
2.基本要求:
(1)选择课程设计题目中的一个课题,独立完成。
(2)良好的沟通和合作能力
(3)充分运用前序课所学的软件工程、程序设计、数据结构等相关知识
(4)充分运用调试和排错技术
(5)简单测试驱动模块和桩模块的编写
(6)查阅相关资料,自学具体课题中涉及到的新知识。
(7)课题完成后必须按要求提交课程设计报告,格式规范,内容详实。
三、设计内容及步骤
1.根据设计题目的要求,充分地分析和理解问题,明确问题要求做什么。
2.根据实现的功能,划分出合理的模块,明确模块间的关系。
3.编程实现所设计的模块。
4.程序调试与测试。
采用自底向上,分模块进行,即先调试低层函数。
能够熟练掌握调试工具的各种功能,设计测试数据确定疑点,通过修改程序来证实它或绕过它。
调试正确后,认真整理源程序及其注释,形成格式和风格良好的源程序清单和结果;
5.结果分析。
程序运行结果包括正确的输入及其输出结果和含有错误的输入及其输出结果。
1.课程设计的目的
掌握模拟文件系统的设计方法,具备初步的独立分析和设计能力。
初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能。
提高综合运用所学的理论知识和方法以及独立分析和解决问题的能力。
训练用系统的观点和软件开发的一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。
理论联系实践提高计算机专业综合水平。
2.课程设计的要求
将所要设计的文件系统确定化,并设计出该确定化的模拟文件系统程序,要求程序有效不出现死循环,具有实际应用意义。
按操作由键盘输入所要执行的命令的代号,并输入相应要求的内容。
根据命令执行,并输出结果。
3.需求分析
3.1问题描述
模拟文件系统
实验内容和步骤:
建立一个用户接口,其功能包括能根据用户的选择,运行相应的程序模块,实现诸如改名文件、删除文件、显示文件等功能。
3.2数据结构
3.2.1类
classCuser
3.2.2结构
typedefstructUFD//存储文件信息
{
charname[10];
intattribute;//文件属性
intlength;
inta[10];
int*p1;//一级索引
int(*p2)[100];//二级索引
structUFD*next;//指向文件链表中此文件结点的下一个结点
}UFD;
3.2.3函数
UFD*Fhead;//文件链表的头结点
intdis_file();//显示文件所占外存块号
intdele_file(UFD*f);//删除文件的具体实现部分
intnew_file();
intopen_file();
intfirst_dele_file();//实现删除文件的前部分工作
3.3系统运行环境
操作系统:
WindowsXP
运行软件:
MicrosoftVisualC++6.0
4.概要设计
4.1创建文件操作
由于创建文件必须要有文件名,所以空路径和路径“\”在此成为错误。
而且正因为如此,在此模块中需要分解出文件名,再把不含文件名的路径传递给“查找模块”,其次,其中涉及了创建文件的操作,它包括:
在找到目录中的nextf中添加一项并把文件的指针指向目录,即给文件赋值等操作。
具体流程如4-1-1所示:
图4-1-1创建文件流程图
4.2删除文件操作
删除文件必须有文件名,所以不允许空路径或路径文“/”在此模块中分解出文件名,对不含文件名的路径进行处理。
删除操作在找到上一级目录后,再找出上一级目录,将之后的指针向前移一位,文件被删除。
4.3查看文件块号
文件的内存空间为1000块,每当创建一个文件分配连续的存储块号给此文件,查看的时候先输入要查询的文件名根据用户输入的文件名找到此文件和相应的块号。
5详细设计
5.1创建文件
在创建文件文件时要考虑文件的大小是否满足当前磁盘的剩余空间,只有当希望创建文件的大小小于磁盘剩余空间才可创建。
具体实现程序:
intCuse:
:
new_file()
{
inti=0,j=0;
UFD*p=0;
p=newUFD;
if(p==0)
{
cout<<"内存空间已满,创建文件失败!
"<return1;
}
cout<<"请输入建立的文件的名称,长度,属性(0:
只读,1:
读写)"<cin>>p->name>>p->length>>p->attribute;
if(p->length>disk_empty)
{
cout<<"作业太大,当前硬盘可用空间为:
"<deletep;
return0;
}
for(i=0;ilength&&i<10;i++)
for(j;j<10000;j++)
if(disk_block[j]==0)
{
p->a[i]=j;
disk_block[j]=1;
j++;
break;
}
p->p1=0;
p->p2=0;
if(p->length>10)//一级索引的实现
{
p->p1=newint[100];
for(i=10;ilength&&i<110;i++)
for(j;j<10000;j++)
if(disk_block[j]==0)
{
(p->p1)[i-10]=j;
disk_block[j]=1;
j++;
break;
}
if(p->length>110)//二级索引的实现
{
p->p2=newint[100][100];
for(i=110;ilength;i++)
for(j;j<10000;j++)
if(disk_block[j]==0)
{
intm=(i-110)/100;
intk=(i-110)%100;
p->p2[m][k]=j;
disk_block[j]=1;
j++;
break;
}
}
}
if(now==0)
{
p->next=Fhead;
Fhead=p;
}
else
{
p->next=now->File_head;
now->File_head=p;
DIR*h=now;
while(h!
=0)
{
h->length+=p->length;
h=h->above;
}
}
cout<<"文件创建成功!
"<disk_empty=disk_empty-p->length;
length+=p->length;
return1;
}
具体调试界面如下图所示:
图5-1-1
图5-1-2
5.2删除文件
具体实现程序:
intCuse:
:
first_dele_file()
{
chartemp[10];
cout<<"请输入你要删除的文件名:
"<cin>>temp;
UFD*f=Fhead;
UFD*above=0;
if(now!
=0)
f=now->File_head;
while(f!
=0)
{
if(!
strcmp(f->name,temp))
break;
above=f;
f=f->next;
}
if(f==0)
{
cout<<"此文件不存在!
"<return0;
}
disk_empty+=f->length;
if(now==0)
{
if(f==Fhead)
Fhead=Fhead->next;
else
above->next=f->next;
}
else
{
DIR*d=now;
while(d!
=0)//修改删除文件后各级目录的大小
{
d->length-=f->length;
d=d->above;
}
if(f==now->File_head)//删除文件结点
now->File_head=now->File_head->next;
else
above->next=f->next;
}
length-=f->length;
this->dele_file(f);
cout<<"删除成功"<return1;
}
intCuse:
:
dele_file(UFD*f)
{
inti=0,m;
for(i=0;i<10&&ilength;i++)
{
m=f->a[i];
disk_block[m]=0;
}
if(f->p1!
=0)
{
for(i=10;i<110&&ilength;i++)
{
m=f->p1[i-10];
disk_block[m]=0;
}
delete[](f->p1);
}
if(f->p2!
=0)
{
for(i=110;ilength;i++)
{
m=(f->p2)[(i-110)/100][(i-110)%100];
disk_block[m]=0;
}
delete[](f->p2);
deletef;
}
f=0;
return1;
}
具体调试如图5-2-1所示:
图5-2-1
5.3查看文件块号
具体实现程序:
intCuse:
:
dis_file()
{
inti;
charn[10];
UFD*f=Fhead;
if(now!
=0)
f=now->File_head;
cout<<"请输入你要查看的文件的名称:
"<cin>>n;
while(f!
=0)
{
if(!
strcmp(n,f->name))
break;
f=f->next;
}
if(f==0)
{
cout<<"当前目录下没有这个文件:
"<return0;
}
cout<<"此文件占用硬盘块号如下:
"<for(i=0;ilength&&i<10;i++)
{
cout<a[i];
if((i+1)%10==0)
cout<}
for(i=10;ilength&&i<110;i++)//显示一级索引块号
{
cout<p1[i-10];
if((i+1)%10==0)
cout<}
for(i=110;ilength;i++)//显示二级索引块号
{
cout<p2[(i-110)/100][(i-110)%100];
if((i+1)%10==0)
cout<}
cout<return1;
}
具体调试如图5-3-1所示:
图5-3-1
6.总结
本次课程设计使知道了如何定义类来实现相应的功能,运用链表、指针等设计出了一个简单实用的文件管理系统同时也使以前所学知识得到巩固。
操作系统是一门将硬件功能、程序设计语言、数据结构、算法、计算机体系结构、软件工程等计算机知识紧密结合在一起的学科,它将对我今后的学习和工作产生巨大的帮助。
参考文献
[1]汤小丹.计算机操作系统(第三版).西安:
西安电子科技大学出版社,2007.5
[2]谭浩强.C++程序设计.北京:
清华大学出版社,2004
附录
课设全部程序:
#include"disk.h"
#include
#include
#include//
intdisk_block[10000];//
intdisk_empty;
Cdisk:
:
Cdisk()
{
inti=0;
charcode[10]="123456";
for(i=0;i<10000;i++)
disk_block[i]=0;
this->user[0].set_user("jun","123");
disk_empty=10000;
cout.setf(ios:
:
left);
}
Cdisk:
:
~Cdisk()
{
}
intCdisk:
:
dele_user(inti)
{
CuseC;
C=user[i];
user[i].dele_user();
return1;
}
intCdisk:
:
dis_disk()
{
inti=0;
cout<for(i=0;i<5;i++)
if(user[i].get_status()==1)
cout<cout<<"已用空间:
"<<10000-disk_empty<"<return1;
}
intCdisk:
:
login()
{
charn[10],c[10];
inti;
cout<<"请输入用户名与密码,中间用空格隔开"<cin>>n>>c;
for(i=0;i<5;i++)
{
if(user[i].get_status())
if(!
strcmp(n,user[i].get_name()))
if(!
strcmp(c,user[i].get_code()))
{
cout<<"登陆成功!
"<cout<<"欢迎"<returni;
}
else
{
cout<<"密码错误:
"<return-1;
}
}
cout<<"不存在用户"<return-1;
}
intCdisk:
:
set_code()
{
chartemp1[10],temp2[10];
cout<<"请输入密码:
"<cin>>temp1;
if(strcmp(temp1,code))
{
cout<<"密码错误!
"<return0;
}
while
(1)
{
cout<<"请输入新密码:
"<cin>>temp1;
cout<<"请再次输入新密码:
"<cin>>temp2;
if(strcmp(temp1,temp2))
{
cout<<"密码设置出错!
"<break;
}
cout<<"密码设置成功!
"<strcpy(code,temp1);
}
return1;
}
intCdisk:
:
new_user()
{
charn[10],c[10];
inti=0;
for(i=0;i<5;i++)
if(user[i].get_status()==0)
break;
if(i==5)
{
cout<<"用户名额已满,创建不成功!
"<return0;
}
user[i].set_status
(1);
cout<<"请输入用户名称:
"<cin>>n;
cout<<"请输入密码:
"<cin>>c;
user[i].set_user(n,c);
cout<<"用户创建成功!
"<return1;
}
intCdisk:
:
first_dele_user()
{
charn[10],c;
inti;
cout<<"请输入你要删除的用户的名称:
"<cin>>n;
for(i=0;i<5;i++)
if(!
strcmp(user[i].get_name(),n)&&user[i].get_status())
break;
if(i==5)
{
cout<<"此用户不存在!
"<return0;
}
cout<<"确认删除此用户?
确认请按Y,取消请按其它键"<cin>>c;
if(c!
='Y')
{
cout<<"已经取消删除!
"<return0;
}
this->dele_user(i);
cout<<"用户删除成功!
"<return1;
}
Cuse:
:
Cuse()
{
status=0;
length=0;
now=0;
Fhead=0;
Dhead=0;
}
Cuse:
:
~Cuse()
{
disk_empty+=length;
length=0;
UFD*f=Fhead;
DIR*d=Dhead;
while(f!
=0)
{
if(f->next==0)
{
this->dele_file(f);
f=0;
break;
}
while(f->next->next!
=0)
f=f->next;
this->dele_file(f->next);
f->next=0;
f=Fhead;
}
while(d!
=0)
{
if(d->next==0)
{
this->dele_dir(d);
d=0;
break;
}
while(d->next->next!
=0)
d=d->next;
this->dele_dir(d->next);
d->next=0;
d=Dhead;
}
}
intCuse:
:
new_file()
{
inti=0,j=0;
UFD*p=0;
p=newUFD;
if(p==0)
{
cout<<"内存空间已满,创建文件失败!
"<return1;
}
cout<<"请输入建立的文件的名称,长度,属性(0:
只读,1:
读写)"<cin>>p->name>>p->length>>p->attribute;
if(p->length>disk_empty)
{
cout<<"作业太大,当前硬盘可用空间为:
"<deletep;
return0;
}
for(i=0;ilength&&i<10;i++)
for(j;j<10000;j++)
if(disk_block[j]==0)
{
p->a[i]=j;
disk_block[j]=1;
j++;
break;
}
p->p1=0;
p->p2=0;
if(p->length>10)//一级索引的实现
{
p->p1=newint[100];
for(i=10;ilength&&i<110;i++)
for(j;j<10000;j++)
if(disk_block[j]==0)
{
(p->p1)[i-10]=j;
disk_block[j]=1;
j++;
break;
}
if(p->length>110)//二级索引的实现
{
p->p2=newint[100][100];
for(i=110;ilength;i++)
for(j;j<10000;j++)
if(disk_block[j]==0)
{
intm=(i-110)/100;
intk=(i-110)%100;
p->p2[m][k]=j;
disk_block[j]=1;
j++;
break;
}
}
}
if(now==0)
{
p->next=Fhead;
Fhead=p;
}
else
{
p->next=now->File_head;
now->File_head=p;
DIR*h=now;
while(h!
=0)
{
h->length+=p->length;
h=h->above;
}
}
cout<<"文件创建成功!
"<disk_empty=disk_empty-p->length;
length+=p->length