操作系统课程设计基于java二级文件系统.docx

上传人:b****5 文档编号:8788624 上传时间:2023-05-15 格式:DOCX 页数:17 大小:282.07KB
下载 相关 举报
操作系统课程设计基于java二级文件系统.docx_第1页
第1页 / 共17页
操作系统课程设计基于java二级文件系统.docx_第2页
第2页 / 共17页
操作系统课程设计基于java二级文件系统.docx_第3页
第3页 / 共17页
操作系统课程设计基于java二级文件系统.docx_第4页
第4页 / 共17页
操作系统课程设计基于java二级文件系统.docx_第5页
第5页 / 共17页
操作系统课程设计基于java二级文件系统.docx_第6页
第6页 / 共17页
操作系统课程设计基于java二级文件系统.docx_第7页
第7页 / 共17页
操作系统课程设计基于java二级文件系统.docx_第8页
第8页 / 共17页
操作系统课程设计基于java二级文件系统.docx_第9页
第9页 / 共17页
操作系统课程设计基于java二级文件系统.docx_第10页
第10页 / 共17页
操作系统课程设计基于java二级文件系统.docx_第11页
第11页 / 共17页
操作系统课程设计基于java二级文件系统.docx_第12页
第12页 / 共17页
操作系统课程设计基于java二级文件系统.docx_第13页
第13页 / 共17页
操作系统课程设计基于java二级文件系统.docx_第14页
第14页 / 共17页
操作系统课程设计基于java二级文件系统.docx_第15页
第15页 / 共17页
操作系统课程设计基于java二级文件系统.docx_第16页
第16页 / 共17页
操作系统课程设计基于java二级文件系统.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

操作系统课程设计基于java二级文件系统.docx

《操作系统课程设计基于java二级文件系统.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计基于java二级文件系统.docx(17页珍藏版)》请在冰点文库上搜索。

操作系统课程设计基于java二级文件系统.docx

操作系统课程设计基于java二级文件系统

操作系统课程设计报告

题  目:

 文件系统的模拟设计

姓名:

崔峰海

学号:

200925501132

指导老师:

翟一鸣

学校:

烟台大学

时间:

20120901

一、设计目的

本课程设计是学习完“操作系统原理”课程后进行的一次全面的综合训练,通过课程设计,更好地掌握操作系统的原理及实现方法,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。

二、设计内容

(1)概述

为Linux系统设计一个简单的二级文件系统。

要求做到以下几点:

1.可以实现下列几条命令:

login    用户登录

dir     列目录

create   创建文件

delete   删除文件

open    打开文件

close    关闭文件

read    读文件

write    写文件

cd     进出目录

2.列目录时要列出文件名,物理地址,保护码和文件长度

3.源文件可以进行读写保护

(2)设计原理和系统总体功能框架图

1、在内存中开辟一个虚拟磁盘空间作为文件存储器,在其上实现一个多用户多目录的文件系统。

2、文件物理结构可采用显式链接或其他方法。

3、磁盘空闲空间的管理可选择位示图或其他方法。

如果采用位示图来管理文件存储空间,并采用显式链接分配方式,则可以将位示图合并到FAT中。

4、文件目录结构采用多用户多级目录结构,每个目录项包含文件名、物理地址、长度等信息,还可以通过目录项实现对文件的读和写的保护。

5、对文件或目录的操作采用windows系统的API函数来实现。

6、设计一个较实用的用户界面,方便用户使用。

要求提供以下相关文件操作:

用户登录、创建目录、删除目录、创建文件、删除文件、读文件、写文件、复制文件、移动文件、返回根目录、退出。

功能结构图如图1.0所示:

 

(3)详细设计及少数重要编码的说明

这次课程设计中,我负责4个板块,分别是显示列表函数和目录、创建函数文件创建函数、打开文件函数和关闭文件系统函数。

1、显示列表函数和目录

流程图如图1.1所示

2、文件创建函数

算法:

查找当前目录下是否有同名文件,是则退出,否则让用户输入文本文件内容,以‘###’结束。

申请inode空间(ialloc函数),申请硬盘block空间(balloc函数),申请失败则结束。

将文件内容写入inode空间和block空间。

修改当前目录的结构,修改inode位图,block位图,写入模拟硬盘。

详细过程如流程图1.2所示:

③、打开文件函数

对文件进行关闭操作,若此时文件不存在或处于读状态或写状态,则返回关闭失败信息;若此时文件处于空闲状态,则调用Close函数进行关闭操作。

流程图如图1.3所示:

 

④、关闭文件系统函数

对文件进行打开操作,若此时文件不存在或已处于打开状态或读状态或写状态,则返回打开失败信息;若此时文件处于空闲状态,则调用Open函数进行打开操作。

流程图如图1.4所示:

(4)运行结果分析

程序结果如图1.5-1.7所示

图1.5

图1.6

图1.7

(5)设计小结

操作系统课程设计是本课程重要的实践教学环节。

课程设计的目的,一方面使学生更透彻地理解操作系统的基本概念和原理,使之由抽象到具体;另一方面,通过课程设计加强学生的实验手段与实践技能,培养学生独立分析问题、解决问题、应用知识的能力和创新精神。

与本课程的实验教学相比,课程设计独立设课,具有更多的学时,给学生更多自行设计、自主实验的机会,充分放手让学生真正培养学生的实践动手能力,全面提高学生的综合素质。

对于本次操作系统课程设,由于Linux比较陌生,刚起步阶段花了很大时间去查阅各种资料。

当完成设计时,感觉掌握了以前学到的知识,并且还对操作系统应用有了更深入的认识。

对二级文件系统也有了很好的了解,熟练C语言布局的使用,如何解决实现里面功能的各种问题。

(6)参考文献

[1]计算机操作系统(第3版),汤小丹,西安电子科技大学出版社,2007年7月

[2]C语言程序设计,孟庆昌,人民邮电出版社,2006年4月

[3]计算机操作系统教程(第3版)习题解答与实验指导,张尧学,清华大学出版社,2006年11月

(7)附源代码

12、显示列表函数dir()和目录创建函数mkdir()等(文件名dir.c)

#include"stdio.h"

#include"string.h"

#include"filesys.h"

_dir()   /*dir*/

{ unsignedintdi_mode;

inti,j,one;

structinode*temp_inode;

printf("\nCURRENTDIRECTORY:

\n");

for(i=0;i

{if(!

(strcmp(dir.direct[i].d_name,""))&&(dir.direct[i].d_ino==0))

{dir.size=i;break;}}

for(i=0;i

{if(dir.direct[i].d_ino!

=DIEMPTY)

{ printf("%14s ,dir.direct[%d].d_ino=%d,属性:

",dir.direct[i].d_name,i,dir.direct[i].d_ino);

temp_inode=iget(dir.direct[i].d_ino);

di_mode=temp_inode->di_mode;

for(j=0;j<12;j++)

{ one=di_mode%2;

di_mode=di_mode/2;

if(one)

printf("x");

else

printf("-");}

if(temp_inode->di_mode&DIFILE)

{ printf(" %d bytes\n",temp_inode->di_size);

printf("blockchainofthefile:

");

for(j=0;jdi_size/BLOCKSIZ+1;j++)

printf("%d--",temp_inode->di_addr[j]);

printf("end\n");}

else

printf("

\n");

iput(temp_inode);}

}}

mkdir(dirname)  /*mkdir*/

char*dirname;

{ intdirid,dirpos;

structinode*inode;

structdirectbuf[BLOCKSIZ/(DIRSIZ+2)];

unsignedintblock;

memset(buf,0,(BLOCKSIZ/(DIRSIZ+2))*sizeof(structdirect));

dirid=namei(dirname);

if(dirid!

=NULL)

{  inode=iget(dirid);

if(inode->di_mode&DIDIR)

printf("\ndirectoryalreadyexisted!

!

\n");

else

printf("\n%sisafilename,&can'tcreatadirthesamename",dirname);

iput(inode);

return;}

dirpos=iname(dirname);

inode=ialloc();

// inode->i_ino=dirid;

dir.direct[dirpos].d_ino=inode->i_ino;

dir.size++;

/*fillthenewdirbuf*/

strcpy(buf[0].d_name,".");

buf[0].d_ino=inode->i_ino;

strcpy(buf[1].d_name,"..");

buf[1].d_ino=cur_path_inode->i_ino;

block=balloc();

fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);

fwrite(buf,1,BLOCKSIZ,fd);

inode->di_size=2*sizeof(structdirect);

inode->di_number=1;

inode->di_mode=user[user_id].u_default_mode;

inode->di_uid=user[user_id].u_uid|DIDIR;

inode->di_gid=user[user_id].u_gid;

inode->di_addr[0]=block;

iput(inode);

return;}

chdir(dirname) /*chdir*/

char*dirname;

{ unsignedintdirid;

structinode*inode;

unsignedshortblock;

inti,j,low=0,high=0;

dirid=namei(dirname);

if(dirid==NULL)

{ printf("\n%sdoesnotexisted\n",dirname);

return;}

inode=iget(dir.direct[dirid].d_ino);

if(!

access(user_id,inode,user[user_id].u_default_mode))

{ printf("\nThedirectory%s,Permission deny",dirname);

iput(inode);

return;}

/*packthecurrentdirectory

for(i=0;i

{for(;j

{printf("\nInchdir(%s),j=%d",dirname,j);

if(dir.direct[j].d_ino==0) break;}

printf("\nInchdir(%s),j2=%d",dirname,j);

memcpy(&dir.direct[i],&dir.direct[j],DIRSIZ+2);

dir.direct[j].d_ino=0;

}

*/

/*writebackthecurrentdirectory */

//for(i=0;idi_size/BLOCKSIZ+1;i++)

// bfree(cur_path_inode->di_addr[i]);

for(i=0;i

{if(i>0)

{block=balloc();

cur_path_inode->di_addr[i]=block;

fseek(fd,DATASTART+block*BLOCKSIZ,SEEK_SET);

fwrite(&dir.direct[i],1,BLOCKSIZ,fd);}

else

{fseek(fd,DATASTART+cur_path_inode->di_addr[0]*BLOCKSIZ,SEEK_SET);

fwrite(&dir.direct[0],1,BLOCKSIZ,fd);}}

cur_path_inode->di_size=dir.size*(sizeof(structdirect));

iput(cur_path_inode);

cur_path_inode=inode;

/*readthechangedirfromdisk*/

j=0;

for(i=0;idi_size/BLOCKSIZ+1;i++)

{ fseek(fd,DATASTART+inode->di_addr[i]*BLOCKSIZ,SEEK_SET);

fread(&dir.direct[j],1,BLOCKSIZ,fd);

j+=BLOCKSIZ/(DIRSIZ+2);}

return;}

13、文件创建函数creat()    (文件名creat.c)

#include"stdio.h"

#include"filesys.h"

creat(user_id,filename,mode)

unsignedintuser_id;

char*filename;

unsignedshortmode;

{unsignedintdi_ith,di_ino;

structinode*inode;

inti,j,k,user_p;

for(user_p=0;user_p

if(user[user_p].u_uid==user_id)

{k=user_p;

break;}

di_ino=namei(filename);

if(di_ino!

=NULL)   /*alreadyexisted*/

{ inode=iget(di_ino);

if(access(user_id,inode,mode)==0)

{ iput(inode);

printf("\ncreataccessnotallowed\n");

return;}

/*freealltheblockoftheoldfile*/

for(i=0;idi_size/BLOCKSIZ+1;i++)

bfree(inode->di_addr[i]);

/*todo:

addcodeheretoupdatethepointerofthesys_file*/

for(i=0;i

if(sys_ofile[i].f_inode==inode)

sys_ofile[i].f_off=0;

for(i=0;i

if(user[k].u_ofile[i]=SYSOPENFILE+1)

{ user[k].u_uid=inode->di_uid;

user[k].u_gid=inode->di_gid;

for(j=0;j

if(sys_ofile[j].f_count=0)

{user[k].u_ofile[i]=j;

sys_ofile[j].f_flag=mode;}

returni;}}

else   /*notexistedbefore*/

{inode=ialloc();

di_ith=iname(filename);

dir.size++;

dir.direct[di_ith].d_ino=inode->i_ino;

inode->di_mode=user[k].u_default_mode|DIFILE;

inode->di_uid=user[k].u_uid;

inode->di_gid=user[k].u_gid;

inode->di_addr[0]=balloc();

inode->di_size=0;

inode->di_number=1;

for(i=0;i

if(sys_ofile[i].f_count==0)

break;

for(j=0;j

if(user[k].u_ofile[j]==SYSOPENFILE+1)

break;

user[k].u_ofile[j]=i;

sys_ofile[i].f_flag=mode;

sys_ofile[i].f_count=0;

sys_ofile[i].f_off=0;

sys_ofile[i].f_inode=inode;

returnj;}}

14、打开文件函数open()   (文件名open.c)

#include"stdio.h"

#include"filesys.h"

unsignedshortopen(user_id,filename,openmode)

intuser_id;

char*filename;

unsignedshortopenmode;

{ unsignedintdirid;

structinode*inode;

inti,j,k;

dirid=namei(filename);

if(dirid==NULL)  /*nosuchfile*/

{ printf("\nfiledoesnotexisted!

!

!

\n");

returnNULL;}

inode=iget(dir.direct[dirid].d_ino);

if(!

access(user_id,inode,openmode))  /*accessdenied*/

{ printf("\nfileopenhasnotaccess!

!

!

");

iput(inode);

returnNULL;}

/*allocthesys_ofileitem*/

for(i=1;i

if(sys_ofile[i].f_count==0) break;

if(i==SYSOPENFILE)

{ printf("\nsystemopenfiletoomuch\n");

iput(inode);

returnNULL;}

sys_ofile[i].f_inode=inode;

sys_ofile[i].f_flag=openmode;

sys_ofile[i].f_count=1;

if(openmode&FAPPEND)

sys_ofile[i].f_off=inode->di_size;

else

sys_ofile[i].f_off=0;

/*alloctheuseropenfileitem*/

for(j=0;j

if(user[j].u_uid==user_id)

{k=j;break;}

for(j=0;j

if(user[k].u_ofile[j]==SYSOPENFILE+1)break;

if(j==NOFILE)

{ printf("\nuseropenfiletoomuch!

!

!

\n");

sys_ofile[i].f_count=0;

iput(inode);

returnNULL;}

user[k].u_ofile[j]=i;//记录用户打开的文件在sys_ofile[]中的位置

/*ifAPPEND,freetheblockofthefilebefore*/

if(openmode&FAPPEND)

{ for(i=0;idi_size/BLOCKSIZ+1;i++)

bfree(inode->di_addr[i]);

inode->di_size=0;}

returnj;}

15、关闭文件函数close()   (文件名close.c)

#include"stdio.h"

#include"filesys.h"

close(user_id,cfd)    /*close*/

unsignedintuser_id;

unsignedshortcfd;

{ structinode*inode;

intj,k;

for(j=0;j

if(user[j].u_uid==user_id)

{

k=j;

break;}

inode=sys_ofile[user[k].u_ofile[cfd]].f_inode;

iput(inode);

sys_ofile[user[k].u_ofile[cfd]].f_count--;

user[k].u_ofile[cfd]=SYSOPENFILE+1;}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2