资源描述
操作系统课程设计
模拟文件系统
学 院: 计算机科学技术
专 业: 计算机科学与技术(工)
班 级: 计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.课程设计的目的 1
2.课程设计的要求 1
3.需求分析 1
3.1问题描述 1
3.2数据结构 1
3.2.1 类 1
3.2.2 结构 2
3.2.3 函数 2
3.3系统运行环境 2
4.概要设计 3
4.1创建文件操作 3
4.2删除文件操作 4
4.3查看文件块号 4
5 详细设计 4
5.1创建文件 4
5.2删除文件 7
5.3查看文件块号 10
6.总结 12
参考文献 14
附录 15
II
1.课程设计的目的
掌握模拟文件系统的设计方法,具备初步的独立分析和设计能力。初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能。
提高综合运用所学的理论知识和方法以及独立分析和解决问题的能力。
训练用系统的观点和软件开发的一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。理论联系实践提高计算机专业综合水平。
2.课程设计的要求
将所要设计的文件系统确定化,并设计出该确定化的模拟文件系统程序,要求程序有效不出现死循环,具有实际应用意义。按操作由键盘输入所要执行的命令的代号,并输入相应要求的内容。根据命令执行,并输出结果。
3.需求分析
3.1问题描述
模拟文件系统
实验内容和步骤:建立一个用户接口,其功能包括能根据用户的选择,运行相应的程序模块,实现诸如改名文件、删除文件、显示文件等功能。
3.2数据结构
3.2.1 类
class Cuser
3.2.2结构
typedef struct UFD//存储文件信息
{
char name[10];
int attribute;//文件属性
int length;
int a[10];
int *p1;//一级索引
int (*p2)[100];//二级索引
struct UFD *next;// 指向文件链表中此文件结点的下一个结点
}UFD;
3.2.3 函数
UFD *Fhead;//文件链表的头结点
int dis_file();//显示文件所占外存块号
int dele_file(UFD *f);//删除文件的具体实现部分
int new_file();
int open_file();
int first_dele_file();//实现删除文件的前部分工作
3.3系统运行环境
操作系统:Windows XP
运行软件:Microsoft Visual C++ 6.0
4.概要设计
4.1创建文件操作
由于创建文件必须要有文件名,所以空路径和路径“\”在此成为错误。而且正因为如此,在此模块中需要分解出文件名,再把不含文件名的路径传递给“查找模块”,其次,其中涉及了创建文件的操作,它包括:在找到目录中的nextf中添加一项并把文件的指针指向目录,即给文件赋值等操作。具体流程如4-1-1所示:开始
输入2
输入文件名,长度,属性
p->length<disk_empty
p->length < 10
p->length<110
采用一级索引
采用二级索引
采用三级索引
创建成功
完成
NO
YES
NO
NO
YES
YES
图4-1-1 创建文件流程图
4.2删除文件操作
删除文件必须有文件名,所以不允许空路径或路径文“/”在此模块中分解出文件名,对不含文件名的路径进行处理。删除操作在找到上一级目录后,再找出上一级目录,将之后的指针向前移一位,文件被删除。
4.3查看文件块号
文件的内存空间为1000块,每当创建一个文件分配连续的存储块号给此文件,查看的时候先输入要查询的文件名根据用户输入的文件名找到此文件和相应的块号。
5 详细设计
5.1创建文件
在创建文件文件时要考虑文件的大小是否满足当前磁盘的剩余空间,只有当希望创建文件的大小小于磁盘剩余空间才可创建。具体实现程序:
int Cuse::new_file()
{
int i=0,j=0;
UFD *p=0;
p=new UFD;
if(p==0)
{
cout<<"内存空间已满,创建文件失败!"<<endl;
return 1;
}
cout<<"请输入建立的文件的名称,长度,属性(0:只读,1:读写)"<<endl;
cin>>p->name>>p->length>>p->attribute;
if(p->length>disk_empty)
{
cout<<"作业太大,当前硬盘可用空间为:"<<disk_empty<<endl;
delete p;
return 0;
}
for(i=0;i<p->length&&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=new int[100];
for(i=10;i<p->length&&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=new int[100][100];
for(i=110;i<p->length;i++)
for(j;j<10000;j++)
if(disk_block[j]==0)
{
int m=(i-110)/100;
int k=(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<<"文件创建成功!"<<endl;
disk_empty=disk_empty-p->length;
length+=p->length;
return 1;
}
具体调试界面如下图所示:
图5-1-1
图5-1-2
5.2删除文件
具体实现程序:
int Cuse::first_dele_file()
{
char temp[10];
cout<<"请输入你要删除的文件名:"<<endl;
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<<"此文件不存在!"<<endl;
return 0;
}
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<<"删除成功"<<endl;
return 1;
}
int Cuse::dele_file(UFD *f)
{
int i=0,m;
for(i=0;i<10&&i<f->length;i++)
{
m=f->a[i];
disk_block[m]=0;
}
if(f->p1!=0)
{
for(i=10;i<110&&i<f->length;i++)
{
m=f->p1[i-10];
disk_block[m]=0;
}
delete [](f->p1);
}
if(f->p2!=0)
{
for(i=110;i<f->length;i++)
{
m=(f->p2)[(i-110)/100][(i-110)%100];
disk_block[m]=0;
}
delete [](f->p2);
delete f;
}
f=0;
return 1;
}
具体调试如图5-2-1所示:
图5-2-1
5.3查看文件块号
具体实现程序:
int Cuse::dis_file()
{
int i;
char n[10];
UFD *f=Fhead;
if(now!=0)
f=now->File_head;
cout<<"请输入你要查看的文件的名称:"<<endl;
cin>>n;
while(f!=0)
{
if(!strcmp(n,f->name))
break;
f=f->next;
}
if(f==0)
{
cout<<"当前目录下没有这个文件:"<<endl;
return 0;
}
cout<<" 此文件占用硬盘块号如下:"<<endl;
for(i=0;i<f->length&&i<10;i++)
{
cout<<setw(6)<<f->a[i];
if((i+1)%10==0)
cout<<endl;
}
for(i=10;i<f->length&&i<110;i++)//显示一级索引块号
{
cout<<setw(6)<<f->p1[i-10];
if((i+1)%10==0)
cout<<endl;
}
for(i=110;i<f->length;i++)//显示二级索引块号
{
cout<<setw(6)<<f->p2[(i-110)/100][(i-110)%100];
if((i+1)%10==0)
cout<<endl;
}
cout<<endl;
return 1;
}
具体调试如图5-3-1所示:
图5-3-1
6.总结
本次课程设计使知道了如何定义类来实现相应的功能,运用链表、指针等设计出了一个简单实用的文件管理系统同时也使以前所学知识得到巩固。操作系统是一门将硬件功能、程序设计语言、数据结构、算法、计算机体系结构、软件工程等计算机知识紧密结合在一起的学科,它将对我今后的学习和工作产生巨大的帮助。
参考文献
[1] 汤小丹. 计算机操作系统(第三版).西安:西安电子科技大学出版社,2007.5
[2] 谭浩强. C++程序设计. 北京:清华大学出版社,2004
附录
课设全部程序:
#include "disk.h"
#include<string.h>
#include<iostream.h>
#include<iomanip.h>//
int disk_block[10000];//
int disk_empty;
Cdisk::Cdisk()
{
int i=0;
char code[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()
{
}
int Cdisk::dele_user(int i)
{
Cuse C;
C=user[i];
user[i].dele_user();
return 1;
}
int Cdisk::dis_disk()
{
int i=0;
cout<<setw(14)<<"用户名"<<setw(14)<<"占用空间大小"<<endl;
for(i=0;i<5;i++)
if(user[i].get_status()==1)
cout<<setw(14)<<user[i].get_name()<<setw(14)<<user[i].get_length()<<endl;
cout<<"已用空间:"<<10000-disk_empty<<endl<<"剩余空间 :"<<disk_empty<<endl;
return 1;
}
int Cdisk::login()
{
char n[10],c[10];
int i;
cout<<"请输入用户名与密码,中间用空格隔开"<<endl;
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<<"登陆成功!"<<endl;
cout<<"欢迎"<<user[i].get_name()<<"登陆"<<endl;
return i;
}
else
{
cout<<"密码错误:"<<endl;
return -1;
}
}
cout<<"不存在用户"<<endl;
return -1;
}
int Cdisk::set_code()
{
char temp1[10],temp2[10];
cout<<"请输入密码:"<<endl;
cin>>temp1;
if(strcmp(temp1,code))
{
cout<<"密码错误!"<<endl;
return 0;
}
while(1)
{
cout<<"请输入新密码:"<<endl;
cin>>temp1;
cout<<"请再次输入新密码:"<<endl;
cin>>temp2;
if(strcmp(temp1,temp2))
{
cout<<"密码设置出错!"<<endl;
break;
}
cout<<"密码设置成功!"<<endl;
strcpy(code,temp1);
}
return 1;
}
int Cdisk::new_user()
{
char n[10],c[10];
int i=0;
for(i=0;i<5;i++)
if(user[i].get_status()==0)
break;
if(i==5)
{
cout<<"用户名额已满,创建不成功!"<<endl;
return 0;
}
user[i].set_status(1);
cout<<"请输入用户名称:"<<endl;
cin>>n;
cout<<"请输入密码:"<<endl;
cin>>c;
user[i].set_user(n,c);
cout<<"用户创建成功!"<<endl;
return 1;
}
int Cdisk::first_dele_user()
{
char n[10],c;
int i;
cout<<"请输入你要删除的用户的名称:"<<endl;
cin>>n;
for(i=0;i<5;i++)
if(!strcmp(user[i].get_name(),n)&&user[i].get_status())
break;
if(i==5)
{
cout<<"此用户不存在!"<<endl;
return 0;
}
cout<<"确认删除此用户?确认请按Y,取消请按其它键"<<endl;
cin>>c;
if(c!='Y')
{
cout<<"已经取消删除!"<<endl;
return 0;
}
this->dele_user(i);
cout<<"用户删除成功!"<<endl;
return 1;
}
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;
}
}
int Cuse::new_file()
{
int i=0,j=0;
UFD *p=0;
p=new UFD;
if(p==0)
{
cout<<"内存空间已满,创建文件失败!"<<endl;
return 1;
}
cout<<"请输入建立的文件的名称,长度,属性(0:只读,1:读写)"<<endl;
cin>>p->name>>p->length>>p->attribute;
if(p->length>disk_empty)
{
cout<<"作业太大,当前硬盘可用空间为:"<<disk_empty<<endl;
delete p;
return 0;
}
for(i=0;i<p->length&&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=new int[100];
for(i=10;i<p->length&&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=new int[100][100];
for(i=110;i<p->length;i++)
for(j;j<10000;j++)
if(disk_block[j]==0)
{
int m=(i-110)/100;
int k=(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<<"文件创建成功!"<<endl;
disk_empty=disk_empty-p->length;
length+=p->length;
return 1;
}
int Cuse::new_dir()
{
DIR *p,*h;
cout<<"请输入新目录的名称:"<<endl;
p=new DIR;
cin>>p->name;
p->Dir_head=0;
p->length=0;
p->File_head=0;
if(now==0)
h=Dhead;
else
h=now->Dir_head;
while(h!=0)
{
if(!strcmp(h->name,p->name))
{
cout<<"此目录已经存在"<<endl;
return 0;
}
h=h->next;
}
if(now==0)
{
p->above=0;
p->next=Dhead;
Dhead=p;
}
else
{
p->above=now;
p->next=now->Dir_head;
now->Dir_head=p;
}
cout<<"目录创建成功!"<<endl;
return 1;
}
int Cuse::goback()
{
if(now==0)
{
cout<<"主目录,不能再次向上"<<endl;
return 0;
}
now=now->above;
return 1;
}
int Cuse::open_dir()
{
char name[10];
DIR *p;
if(now==0)
p=Dhead;
else
p=now->Dir_head;
cout<<"请输入你要打开的目录名称:"<<endl;
cin>>name;
int flag=0;
while(p!=0)
{
if(strcmp(p->name,name)==0)
{
now=p;
return 1;
}
p=p->next;
}
cout<<"当前目录中不存在该目录"<<endl;
return 0;
}
int Cuse::first_dele_file()
{
char temp[10];
cout<<"请输入你要删除的文件名:"<<endl;
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<<"此文件不存在!"<<endl;
return 0;
}
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<<"删除成功"<<endl;
return 1;
}
int Cuse::dele_file(UFD *f)
{
int i=0,m;
for(i=0;i<10&&i<f->length;i++)
{
m=f->a[i];
disk_block[m]=0;
}
if(f->p1!=0)
{
for(i=10;i<110&&i<f->length;i++)
{
m=f->p1[i-10];
disk_block[m]=0;
}
delete [](f->p1);
}
if(f->p2!=0)
{
for(i=110;i<f->length;i++)
{
m=(f->p2)[(i-110)/100][(i-110)%100];
disk_block[m]=0;
}
delete [](f->p2);
delete f;
}
f=0;
return 1;
}
int Cuse::first_dele_dir()
{
char n[10];
char c;
DIR *p,*above=0;
p=Dhead;
if(now!=0)
p=now->Dir_head;
cout<<"请输入你要删除的目录的名称:"<<endl;
展开阅读全文