操作系统原理文件管理文档格式.docx
- 文档编号:18223937
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:36
- 大小:324.01KB
操作系统原理文件管理文档格式.docx
《操作系统原理文件管理文档格式.docx》由会员分享,可在线阅读,更多相关《操作系统原理文件管理文档格式.docx(36页珍藏版)》请在冰豆网上搜索。
2007年6月29日下午,验收或总结。
指导教师签章:
教研室主任签章
操作系统原理课程设计指导教师评语与成绩
指导教师评语:
课程设计表现成绩:
课程设计验收成绩:
课程设计报告成绩:
课程设计总成绩:
指导教师签章
2007年7月10日
一概述
1.课程设计的目的
1.理解重要数据结构的意义
2.掌握文件系统的工作原理
3.通过本次课程设计加深文件系统内部功能及内部实现的理解
2.课程设计的要求
1.需要的基本知识:
文件:
一组带标志的在逻辑上有完整意义的信息项的序列,这个标识为文件名。
文件系统:
操作系统中统一管理信息资源的一种软件,管理文件的存储、检索、更新。
提供安全可靠的共享和保护手段,并且方便用户使用。
2.技能:
具有用C语言编程的能力,懂得文件系统调用处理的算法及一些操作系统文件系统的实现的基本思想。
3.尚未掌握的知识点:
高速缓存管理和磁盘管理算法
4.参阅操作系统原理书籍中文件管理的相关知识。
5.老师提出的要求:
在理解文件系统的层次结构,掌握高速缓存管理和磁盘管理的基本思想和算法的基础上,掌握文件系统的系统调用处理算法和运用,分析流行操作系统文件系统的实现的基本思想,尝试设计简单的文件系统
3.课程设计的主要设计思想
在任一OS下,建立一个大文件,把它假想成一张盘,在其中实现一个简单的模拟UNIX(LINUX)文件系统。
本次文件系统具有以下的功能:
1、初始化
2、建立文件(需给出文件名,文件长度)
3、建立子目录
4、打开文件(显示文件所占的盘块)
5、删除文件
6、删除目录
7、显示目录(即显示目录下的信息,包括文件、子目录等)
8、显示整个系统信息
二总体方案设计
2.1算法的整体思路
进入UNIX文件系统界面,提示有初始化,查看当前目录文件列表,查看文件,查看系统信息,创建目录、文件,删除目录、文件,进入当前目录的指定目录,返回上一级目录,显示帮助命令和退出文件模拟12项功能,根据各个命令的提示命令,输入命令提示符,运行各个动能。
2.2主要特点
此课程设计的功能完善,由于学习过在LINUX的环境编程,此课程设计仿照LINUX环境,命令符并未改变,这样可以使同学们很快的熟悉在此程序的环境中练习。
2.3我所承担的设计工作是整个文件系统。
以下是整体框图。
整体框图
N
Y
图2.3框图
三详细设计
3.1所完成的具体功能
初始化,查看当前目录文件列表,查看文件,查看系统信息,创建目录、文件,删除目录、文件,进入当前目录的指定目录,返回上一级目录,显示帮助命令和退出文件模拟12项功能。
3.2程序流程图
3.2.1Format()
1.超级块初始化
图3.2.1.1
2.信息初始化
图3.2.1.2
3.存储空间初始化
图3.2.1.3
4.将空闲块的信息用成组链接的方法写进每组的最后一个块中
图3.2.1.4
3.2.2Callback(intlength)
图3.2.2
3.2.3Allot(intlength)
图3.2.3
3.2.4create_file(charfilename[],intlength)
图
图3.2.4
3.2.5del_file(charfilename[])
图3.2.5
3.2.6del_dir(charfilename[])
图3.2.6
3.2.7voiddisplay_curdir()
图3.2.7
3.2.8display_dir(charfilename[])
图3.2.8
3.2.9voidopen_file(charfilename[]
图3.2.9
四程序的调试与运行结果说明
经过调试,程序运行一切正常。
运行结果如下
进入界面
建立目录,建立文件,查看,进入子目录等功能界面
五课程设计总结
此次的课程设计从总体上来看,功能比较齐全,并能准确的模拟简单的UNIX文件系统。
但是由于时间原因和经验的知识的匮乏,踏还是存在不少功能上的不足和不完善。
在登录正规的文件系统时,都会有用户登录界面和退出登录的界面,但是此文件系统课程设计中就缺少这一功能。
这一问题需要有用户帐号和密码。
解决这一个问题,就要加入一个代码,即登录代码和退出代码。
代码如下:
intlogin(uid,passwd)
unsignedshortuid;
char*passwd;
{inti,j;
for(i=0;
i<
PWDNUM;
i++)
{if((uid==pwd[i].p_uid)&
&
(!
strcmp(passwd,pwd[i].password)))
{
for(j=0;
j<
USERNUM;
j++)
if(user[j].u_uid==0)
break;
}
if(j==USERNUM)
{printf("
\ntoomuchuserinthesystem,pleasewaittologin\n"
);
return0;
else
user[j].u_uid=uid;
user[j].u_gid=pwd[i].p_gid;
user[j].u_default_mode=DEFAULTMODE;
}
if(i==PWDNUM)
\nincorrectpassword\n"
return1;
intlogout(uid)/*logout*/
{inti,j,k,sys_no;
structinode*inode;
for(k=0;
k<
k++)
if(uid==user[k].u_uid)
i=k;
if(k==USERNUM)
\nnosuchauser\n"
returnNULL;
for(j=0;
NOFILE;
{if(user[i].u_ofile[j]!
=SYSOPENFILE+1)
{/*iputtheinodefreethesys_ofileandcleartheuser_ofile*/
sys_no=user[i].u_ofile[j];
inode=sys_ofile[sys_no].f_inode;
iput(inode);
sys_ofile[sys_no].f_count--;
user[i].u_ofile[j]=SYSOPENFILE+1;
return1;
六后记
在老师和同学们的帮助下,顺利完成了本次的课程设计。
通过本次的课程设计,掌握了文件系统的工作原理,通过文件系统的设计,加深文件系统的内部功能及内部实现的理解。
在理解程序的过程中,对分配空间和磁盘管理方面的知识理解的不是很透彻。
此次的课程设计也涉及到了一些结构体和成组链接法方面的知识。
通过本次课程设计,我学到了很多知识,对我本身能力也是一种锻炼,锻炼了我分析与创新能力,借鉴成功人士的经验,并应用到自己的程序中,使得程序更加完善。
感谢学校给了我们这次机会,让我们自己独立的完成本次课程设计,感谢给我们这次机会锻炼自己。
另外我还要感谢我们的指导老师---张玲玲老师对我的帮助。
在编程过程中我们遇到了一些难题和困难。
对于一些技术难题给予了我们点拨和指导。
从而使我们的程序得到了顺利完成。
此外,我还要感谢一直帮助我的同学们!
最后,还请大家对我们的程序给予批评和指正!
七附录
/*HELLO.C--Hello,world*/
#include"
stdio.h"
#include<
stdlib.h>
conio.h>
string.h>
intphysic[300];
/*文件地址缓冲区*/
intstyle=1;
/*文件的类型*/
charcur_dir[10]="
c"
;
/*当前目录*/
structcommand
{
charcom[10];
}cmd[12];
structblock
intn;
/*空闲的盘快的个数*/
intfree[50];
/*存放空闲盘快的地址*/
inta;
/*模拟盘快是否被占用*/
}memory[200];
structblock_super
/*存放进入栈中的空闲块*/
intstack[50];
/*存放下一组空闲盘快的地址*/
}super_block;
structnode/*i结点信息*/
intfile_style;
/*i结点文件类型*/
intfile_length;
/*i结点文件长度*/
intfile_address[100];
/*i结点文件的物理地址*/
}i_node[64];
structdir/*目录项信息*/
charfile_name[10];
/*文件名*/
inti_num;
/*文件的结点号*/
chardir_name[10];
/*文件所在的目录*/
}c[64];
voidformat()/*格式化*/
inti,j,k;
super_block.n=50;
for(i=0;
50;
i++)/*超级块初始化*/
{
super_block.free[i]=i;
super_block.stack[i]=50+i;
/*存放下一组的盘块*/
64;
i++)/*i结点信息初始化*/
100;
i_node[i].file_address[j]=-1;
/*文件地址*/
i_node[i].file_length=-1;
/*文件长度*/
i_node[i].file_style=-1;
/*文件类型*/
i++)/*根目录区信息初始化*/
strcpy(c[i].file_name,"
"
c[i].i_num=-1;
strcpy(c[i].dir_name,"
}
200;
i++)/*存储空间初始化*/
memory[i].n=0;
/*必须有这个*/
memory[i].a=0;
memory[i].free[j]=-1;
i++)/*将空闲块的信息用成组链接的方法写进每组的最后一个块中*/
{/*存储空间初始化*/
if((i+1)%50==0)
k=i+1;
if(k<
200)
memory[i].free[j]=k;
/*下一组空闲地址*/
memory[i].n++;
/*下一组空闲个数注意在memory[i].n++之前要给其赋初值*/
k++;
/*标记为没有使用*/
continue;
/*处理完用于存储下一组盘块信息的特殊盘块后,跳过本次循环*/
printf("
已经初始化完毕\n"
欢迎进入UNIX文件模拟系统\n\n"
voidwrite_file(FILE*fp)/*将信息读入系统文件中*/
inti;
fp=fopen("
system"
"
wb"
fwrite(&
memory[i],sizeof(structblock),1,fp);
super_block,sizeof(structblock_super),1,fp);
i_node[i],sizeof(structnode),1,fp);
c[i],sizeof(structdir),1,fp);
fclose(fp);
voidread_file(FILE*fp)/*读出系统文件的信息*/
rb"
fread(&
voidcallback(intlength)/*回收磁盘空间*/
inti,j,k,m,q=0;
for(i=length-1;
i>
=0;
i--)
k=physic[i];
/*需要提供要回收的文件的地址*/
m=49-super_block.n;
/*回收到栈中的哪个位置*/
if(super_block.n==50)/*注意当super_block.n==50时m=-1;
的值*/
{/*super_block.n==50的时候栈满了,要将这个栈中的所有地址信息写进下一个地址中*/
memory[k].free[j]=super_block.free[j];
super_block.n=0;
memory[k].n=50;
memory[k].a=0;
if(m==-1)
m=49;
/*将下一个文件地址中的盘块号回收到栈底中,这个地址中存放着刚才满栈的地址
的信息*/
super_block.free[m]=physic[i];
/*将下一个文件地址中的盘块号回收到栈中*/
super_block.n++;
voidallot(intlength)/*分配空间*/
inti,j,k,m,p;
length;
k=50-super_block.n;
/*超级块中表示空闲块的指针*/
m=super_block.free[k];
/*栈中的相应盘块的地址*/
p=super_block.free[49];
/*栈中的最后一个盘块指向的地址*/
if(m==-1||memory[p].a==1)/*检测是否还有下一组盘块*/
内存不足,不能够分配空间\n"
callback(length);
if(super_block.n==1)
memory[m].a=1;
/*将最后一个盘块分配掉*/
physic[i]=m;
memory[m].n;
j++)/*从最后一个盘块中取出下一组盘块号写入栈中*/
super_block.free[j]=memory[m].free[j];
/*要跳过这次循环,下面的语句在IF中已经执行过*/
/*栈中的相应盘块的地址写进文件地址缓冲区*/
super_block.n--;
voidcreate_file(charfilename[],intlength)/*创建文件*/
inti,j;
if(strcmp(filename,c[i].file_name)==0)
文件已经存在,不允许建立重名的文件\n"
return;
if(c[i].i_num==-1)
c[i].i_num=i;
strcpy(c[i].file_name,filename);
strcpy(c[i].dir_name,cur_dir);
/*把当前目录名给新建立的文件*/
i_node[i].file_style=style;
i_node[i].file_length=length;
allot(length);
i_node[i].file_address[j]=physic[j];
voidcreate_dir(charfilename[])/*创建目录*/
style=0;
/*0代表文件类型是目录文件*/
create_file(filename,4);
style=1;
/*用完恢复初值,因为全局变量,否则*/
voiddel_file(charfilename[])/*删除文件*/
inti,j,k;
k=c[i].i_num;
i_node[k].file_length;
physic[j]=i_node[k].file_address[j];
callback(i_node[k].file_length);
/*调用回收函数*/
j++)/*删除文件后要将文件属性和目录项的各个值恢复初值*/
i_node[k].file_address[j]=-1;
/*地址恢复初值*/
/*文件名恢复初值*/
/*目录项的I结点信息恢复初值*/
/*目录项的文件目录信息恢复初值*/
i_node[k].file_length=-1;
/*文件长度恢复*/
i_node[k].file_style=-1;
/*文件类型恢复初值*/
if(i==64)
不存在这个文件\n"
voiddel_dir(charfilename[])/*删除目录需要判断目录下时候为空,不为空就不删除*/
i++)/*还要加条件判断要删除的目录是不是当前目录*/
/*找到目录名字*/
if(strcmp(c[i].file_name,filename)==0&
strcmp(cur_dir,filename)!
=0&
(i_node[k].file_style)==0)
if(strcmp(filename,c[j].dir_name)==0)
目录不为空不能直接删除\n"
if(j==64)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 原理 文件 管理