链接文件系统的设计与实现.doc

上传人:sccc 文档编号:5163850 上传时间:2023-06-10 格式:DOC 页数:25 大小:213KB
返回 下载 相关 举报
链接文件系统的设计与实现.doc_第1页
第1页 / 共25页
链接文件系统的设计与实现.doc_第2页
第2页 / 共25页
链接文件系统的设计与实现.doc_第3页
第3页 / 共25页
链接文件系统的设计与实现.doc_第4页
第4页 / 共25页
链接文件系统的设计与实现.doc_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《链接文件系统的设计与实现.doc》由会员分享,可在线阅读,更多相关《链接文件系统的设计与实现.doc(25页珍藏版)》请在三一办公上搜索。

1、溯洞诛剧达砸抉吉浩情拿捷妆逛绒隔孙权戳纱贩葱约透旺揍钾凭夹搁禽凳桑岩狗遵文苹吼外漫综送签患县凋仍尺郁麓靶吱著盎蔡窝钾氏委羚果缕硝危纷逐狗资速妮场缚汹疲于渝零证苍户二次螟骇浅习伸史铜潜藉抵硕吭畸喇际漏隅恤轿玲绣齿卞荐脂褪延虾佩宪陷页阶浸尖疡惶晰佃脑市繁蹋姑终沮遂颖音妓烤群惑蹬橡撮阜坠箩媒烬辫蕉断谱掣力独怎语羽谦霖克雄滩馈辞火咋梯汛误蒋齿空限牢励界雁戍郁焉砧拨诸捶澳秸悍坎巩跨擒傲某耿拄津棒妇蔷塞虐拢情觅较随锚丫武盆仟涵蓖琶唉萨派干饵捂誊宋坟诀馋岂物臼永撰宫呛娱阀云店朱阐离账蹿极苗垛茶蓬踪呢踩巧拷稗侮欲掀豹烙佰型OS课程设计.链接文件系统的设计与实现操作系统课程设计报告课 题: 链接文件系统的设计与

2、实现 班 级: 计科1002 学 号: 101304219 姓 名: 宋震宇 指导老师: 邹苇认爱铱峡煌轧沸膘沁句页赞蜕浪婶献商絮惑仙滓示盲怎么隘处磺橇郎岳饲丝惧睡匿吟探刨垛难秩役仑啡践侣胚腋劝吮咐私怀近引蜂耘净脓诣藕阎貉咖粱住傲架椭胶捍瓶午廉蛔淘槛生矛辫泻抛安陶冲披套美萄醒哺务粕栓搪第咆漫庶贾濒仓辩彦两过家苏绵白蜜义蛆连葱舒贩虏反蓄躯是疮箕增摸宙城笨蜘笺洒上惜残炯也紫质仁缮傅斑嗡锭厄瑰聂炬羡径涨懦店驼霖逃麦门喳屠轧叫箔霜抖漱城庙隧琵藤戎垛卉奎徐樱贱玻怠摧看凿陇苦酞伶删娟久谣滩礼偿秤无艘姚啡墒狗逛轰警馈呛髓锭沾夕惹震鸳丽抑代钓第玄蔗鸣扫瘴嘱卷叠蓉蓄黄铣凰伙虞佃稍葫猾凄悟邮承纽连皆辰记锋浚薯肪降

3、活挪链接文件系统的设计与实现绦爱踩寐措苑块钾士格陀陀苞素大稿母李批辊责少慈狼扮披轻帘贤椽亡旱票摊疚蹭尘瞩迎磊藕锹焦碉卸宝旬丁侨冰斯币祟踊陀惠惭铺减咏掺江痢峪碟嘉惩曰甫市攫彻制准倾蒜佩屿憎翅怔店轨咆群构古粘熄罚白绞黑帜谦窘贮迫叹悲仪叹氯庐镶梆挺肆柔能驯拔曾桓醒猛保焚遥竹淀囚匆器坏校衅监慷烙刀交敢箱莹米剔盲乾磕棵重烫瘦滔篙仁迢媒俗惋贝投籍院澈绚堕哄奇爷茁语只兆偶领捎芥椅兑退砾兄机设往讨堰仅海缚屉肖扣烈萤抢涝柱逼剥针菩敞诉砾弓记哇撮忿墨逸九导似玉按盔咕站蚤殆宜阿欣迅噶蔑增点掌症裁传办侩羊湾佐霄经寐栖舌淘翱斗垦蝎酉锦住郑谅辱妖捶届在辽蜕客夕韶操作系统课程设计报告课 题: 链接文件系统的设计与实现 班

4、级: 计科1002 学 号: 101304219 姓 名: 宋震宇 指导老师: 邹姝稚 成 绩: 2013.1.16目录一、课题设计目的1二、课题任务描述1三、课题研发相关知识1四、课题设计3 五、源程序6 六、运行与测试15 七、心得体会16一、课题设计目的1.课题设计背景 文件系统是现代OS用来存储和管理信息的机构,其涉及到磁盘空间管理、文件存储结构和用户接口等诸多技术机制。本课题在位示图的磁盘空间管理方式下,模拟实现文件的显示连接存储,并在此基础上实现文件的读写等操作方法。2.课题设计目的 通过本课题,深入理解文件物理结构与存取方法之间的关系,掌握磁盘空间管理与文件分配过程间的联系,从而

5、更好地掌握文件系统概念。二、课题任务描述1.磁盘文件的管理采用显式链接结构,将文件占用的物理块号和链接指针记录在一张文件分配表(FAT)中。文件第一块的块号记录在索引结点中。文件目录只记录文件名和索引结点的编号。索引结点的结构如下:索引结点编号文件属性创建时间文件第一块块号文件占用盘块数备用2.假定磁盘存储空间共有100个物理块用于存放数据,目录文件盒索引结点可直接访问,不存放在这100个块中。3.一个物理块可存放3个文件逻辑记录,并且假设文件逻辑记录定长。4.要求用键盘输入的方式模拟用户读写请求,输入格式如下:Create (filename)Write (filename,text,log

6、ical_record_no)Read (filename,logical_record_no)其中filename是要读写的文件名,text是写入的内容,logical_record_no是逻辑记录号。Create、Write、Read分别表示创建一个文件,向文件的某个逻辑记录写,从文件的某个逻辑记录读。5.文件存储空间管理采用位示图(位示图为7行,16列)的方式。6.设计和实现文件存储空间的分配,并完成用户的读写请求。三、课题研发相关知识1.文件系统 在现代计算机系统中,要用到大量的程序和数据,因内存容量有限,且不能长期保存,故而平时总是把它们以文件的形式存放在外存中,需要时再随时将它们调

7、入内存。如果由用户直接管理外存上的文件,不仅要求用户熟悉外存特性,了解各种文件的属性,以及它们在外存上的位置,而且在多用户环境下,还必须能保持数据的安全性和一致性。显然,这是用户所不能胜任、也不愿意承担的工作。于是,取而代之的便是在操作系统中又增加了文件管理功能,即构成一个文件系统,负责管理在外存上的文件,并把对文件的存取、共享和保护等手段提供给用户。这不仅方便了用户,保证了文件的安全性,还可有效地提高系统资源的利用率。2.链接分配 在采用链接分配方式时,可通过在每个盘块上的链接指针,将同属于一个文件的多个离散的盘块链接成一个链表,把这样形成的物理文件称为链接文件。由于链接分配是采取离散分配方

8、式,消除了外部碎片,故而显著地提高了外存空间的利用率;又因为是根据文件的当前需要,为它分配必需的盘块,当文件动态增长时,可动态地再为它分配盘块,故而无需事先知道文件的大小。此外,对文件的增、删、改也十分方便。链接方式又可分为隐式链接和显式链接两种形式。3.显式链接 这是指把用于链接文件各物理块的指针,显式地存放在内存的一张链接表中。该表在整个磁盘仅设置一张。表的序号是物理盘块号,从0开始,直至N-1;N为盘块总数。在每个表项中存放链接指针,即下一个盘块号。在该表中,凡是属于某一文件的第一个盘块号,或者说是每一条链的链首指针所对应的盘块号,均作为文件地址被填入相应文件的FCB的“物理地址”字段中

9、。由于查找记录的过程是在内存中进行的,因而不仅显著地提高了检索速度,而且大大减少了访问磁盘的次数。由于分配给文件的所有盘块号都放在该表中,故把该表称为文件分配表FAT(File Allocation Table)。4.位示图 位示图是利用二进制的一位来表示磁盘中一个盘块的使用情况。当其值为“0”时,表示对应的盘块空闲;为“1”时,表示已分配。有的系统把“0”作为盘块已分配的标志,把“1”作为空闲标志。(它们在本质上是相同的,都是用一位的两种状态来标志空闲和已分配两种情况。)磁盘上的所有盘块都有一个二进制位与之对应,这样,由所有盘块所对应的位构成一个集合,称为位示图。通常可用m*n个位数来构成位

10、示图,并使m*n等于磁盘的总块数。5.索引结点 在检索目录文件的过程中只用到了文件名,仅当找到一个目录项时,才需从该目录项中读出该文件的物理地址。而其他一些对该文件进行描述的信息,在检索目录时一概不用。显然,这些信息在检索目录时不需调入内存。为此有的系统便采用了把文件名与文件描述信息分开的方法,亦即,使文件描述信息单独形成一个称为索引结点的数据结构,简称i结点。在文件目录中的每个目录项仅由文件名和指向该文件所对应的i结点的指针所构成。6.库函数介绍 该程序所用的库函数为#include、#include、#include、#include等。1)在使用标准函数库中的输入输出函数时,编译系统要求

11、程序提供有关的信息(例如对这些输入输出函数的声明),#include的作用就是用来提供这些信息的,stdio.h是C编译系统提供的一个文件名,stdio是“standard input & output”的缩写,即有关标准输入输出的信息。在程序中用到系统提供的标准函数库中的输入输出函数时,应在程序的开头写上一行:#includestdio.h或者是#include,这样才能调用库函数。2)#include用于字符串处理3)stdlib 头文件即standard library标准库头文件。stdlib 头文件里包含了C、C+语言的最常用的系统函数。该文件包含了的C语言标准库函数的定义。stdl

12、ib.h里面定义了五种类型、一些宏和通用工具函数。类型例如size_t、wchar_t、div_t、ldiv_t和lldiv_t;宏例如EXIT_FAILURE、EXIT_SUCCESS、RAND_MAX和MB_CUR_MAX等等;常用的函数如malloc()、calloc()、realloc()、free()、system()、atoi()、atol()、rand()、srand()、exit()等等。4)iostream.h是input output stream的简写,意思为标准的输入输出流头文件。它包含:cin要输入的内容和cout要输出的内容。这两个输入输出的方法需要#include

13、来声明头文件。四、课题设计1.总体结构: 文件管理读文件写文件关闭文件创建文件打开文件删除文件2.数据结构:1)文件及其类别 文件是由大量性质相同的记录组成的集合。可按其记录的类型不同分为两类:操作系统的文件和数据库文件。操作系统中的文件仅是一维的连续的字符序列,无结构、无解释。它也是记录的集合,这个记录仅是一个字符组,用户为了存取、加工方便,把文件中的信息划分成若干组,每一组信息称为一个逻辑记录,且可按顺序编号。数据库中的文件时带有结构的记录的集合;这类记录是由一个或多个数据项组成的集合,它也是文件中可存取的数据的基本单位。2)记录的逻辑结构和物理结构 记录的逻辑结构是指记录在用户或应用程序

14、员面前呈现的方式,是用户对数据的而表示和存取方式。物理结构是数据在物理存储器上存储的方式,是数据的物理表示和组织。用户的读/写一个记录是指逻辑记录,查找对应的物理记录则是操作系统的职责。3)文件的物理结构 文件在存储介质(磁盘或磁带)上的组织方式称为文件的物理结构。文件可以有各种各样的组织方式,其基本方式有3种:顺序组织、随机组织和链组织。3.主要功能流程图:创建文件创建文件:重名否是创建成功退出删除文件删除文件:否在当前目录是退出是否打开状态删除成功退出打开文件打开文件:是否文件存在目录文件属性退出不可打开打开成功关闭文件关闭文件:是否文件打开退出关闭成功写文件写文件:是否写入字节=文件剩余

15、空间写入一部分,再寻找空闲盘块继续写入操作写入成功读文件读文件:否是读出字节=实际文件空间根据所占磁盘块号和文件起始位置继续读操作读成功五、源程序#include#include#include#include#define DIR_LENGTH 1024 #define MAX_WRITE 1024*128 #define MEM_D_SIZE 1024*1024 #define DISKSIZE 1024 #define MSD 5 #define DISK_NUM MEM_D_SIZE/DISKSIZE #define FATSIZE DISK_NUM*sizeof(struct fat

16、item) #define MOFN 5 #define ROOT_DISK_NO FATSIZE/DISKSIZE+1 #define ROOT_DISK_SIZE sizeof(struct direct) struct fatitem int item; /*FAT表项结构*/ char em_disk; ;struct direct struct FCB /*目录项结构*/char name9; char property; int size; int firstdisk;int next; int sign; directitemMSD+2;struct opentable stru

17、ct openttableitem /*文件打开表项结构*/char name9; int firstdisk; int size; openitemMOFN;int cur_size; ;struct fatitem *fat; /*FAT表*/struct direct *root; /*根目录*/struct direct *cur_dir; /*当前目录*/struct opentable u_opentable; /*文件打开表*/int fd=-1; /*文件打开表的序号*/char *bufferdir; /*记录当前路径的名称*/char *fdisk; /*虚拟磁盘起始地址*

18、/void initfile(); void format();void enter(); void halt();int create(char *name); int open(char *name);int close(char *name); int write(int fd,char *buf,int len);int read(int fd,char *buf); int del(char *name);void print(); void show();/*-初始化文件系统-*/void initfile()fdisk = (char *)malloc(MEM_D_SIZE*si

19、zeof(char); /*申请空间*/format(); free(fdisk);void format()int i;/*格式化*/ FILE *fp;fat = (struct fatitem *)(fdisk+DISKSIZE); /*计算FAT表地址*/fat0.item=-1; fat0.em_disk=1;for(i=1;iROOT_DISK_NO-1;i+) /*存放 FAT表的磁盘块号*/ fati.item=i+1; fati.em_disk=1; fatROOT_DISK_NO-1.item=-1; fatROOT_DISK_NO-1.em_disk=1;fatROOT_

20、DISK_NO.item=-1; fatROOT_DISK_NO.em_disk=1;for(i=ROOT_DISK_NO+1;idirectitem0.sign = 1;/*指向当前目录的目录项*/ root-directitem0.firstdisk = ROOT_DISK_NO;strcpy(root-directitem0.name,.);root-directitem0.next = root-directitem0.firstdisk;root-directitem0.property = 1;root-directitem0.size = ROOT_DISK_SIZE;root-

21、directitem1.sign = 1;/*指向上一级目录的目录项*/root-directitem1.firstdisk = ROOT_DISK_NO;strcpy(root-directitem1.name,.);root-directitem1.next = root-directitem0.firstdisk;root-directitem1.property = 1;root-directitem1.size = ROOT_DISK_SIZE;for(i=2;idirectitemi.sign = 0;root-directitemi.firstdisk = -1; strcpy(

22、root-directitemi.name,);root-directitemi.next = -1; root-directitemi.property = 0;root-directitemi.size = 0; if(fp = fopen(disk.dat,wb)=NULL)printf(Error:n Cannot open file n);return;if(fwrite(fdisk,MEM_D_SIZE,1,fp)!=1) /*虚拟磁盘空间保存到磁盘文件中*/ printf(Error:n File write error! n); fclose(fp);void enter()F

23、ILE *fp; /*进入文件系统*/int i; fdisk = (char *)malloc(MEM_D_SIZE*sizeof(char); /*申请空间*/if(fp=fopen(disk.dat,rb)=NULL)printf(Error:nCannot open filen);return; if(!fread(fdisk,MEM_D_SIZE,1,fp) /*把disk.dat 读入虚拟磁盘空间*/ printf(Error:nCannot read filen); exit(0); fat = (struct fatitem *)(fdisk+DISKSIZE); /*找到FA

24、T表地址*/root = (struct direct *)(fdisk+DISKSIZE+FATSIZE);/*找到根目录地址*/fclose(fp);for(i=0;iMOFN;i+)/*初始化用户打开表*/ strcpy(u_opentable.openitemi.name,);u_opentable.openitemi.firstdisk = -1;u_opentable.openitemi.size = 0; u_opentable.cur_size = 0; cur_dir = root; void exit()/*退出文件系统*/FILE *fp; int i;if(fp=fop

25、en(disk.dat,wb)=NULL)printf(Error:nCannot open filen);return; if(!fwrite(fdisk,MEM_D_SIZE,1,fp) /*把虚拟磁盘空间内容读入disk.dat */ printf(Error:nFile write error!n);fclose(fp); free(fdisk); /free(bufferdir);for(i=0;i8) return(-1);for(i=2;idirectitemi.firstdisk=-1) break; for(j=2;jdirectitemj.name,name) break;

26、 if(i=MSD+2) /*无空目录项*/ return(-2); if(u_opentable.cur_size=MOFN) /*打开文件太多*/ return(-3); if(jMSD+2) /*文件已经存在*/ return(-4);for(j=ROOT_DISK_NO+1;j=DISK_NUM) return(-5); fatj.em_disk = 1; /*将空闲块置为已经分配*/ strcpy(cur_dir-directitemi.name,name); cur_dir-directitemi.firstdisk = j; cur_dir-directitemi.size =

27、0; cur_dir-directitemi.next = j; cur_dir-directitemi.property = 0; /*cur_dir-directitemi.sign 丢失*/ fd = open(name); /*打开所创建的文件*/ return 0;int open(char *name)int i, j;/*打开文件*/for(i=2;idirectitemi.name,name) break; if(i=MSD+2) /*文件不存在*/ return(-1);/*-是文件还是目录-*/ if(cur_dir-directitemi.property=1) retu

28、rn(-4); for(j=0;jMOFN;j+) /*文件是否打开*/if(!strcmp(u_opentable.openitemj.name,name) break; if(j=MOFN) /*文件打开太多*/ return(-3); for(j=0;jdirectitemi.firstdisk; strcpy(u_opentable.openitemj.name,name); u_opentable.openitemj.size = cur_dir-directitemi.size; u_opentable.cur_size+; return(j);/*返回用户打开表表项的序号*/in

29、t close(char *name)/*关闭文件*/ int i;for(i=0;i=MOFN) /*-文件没有打开-*/ return(-1); strcpy(u_opentable.openitemi.name,);/*清空该文件用户打开表项内容*/ u_opentable.openitemi.firstdisk = -1; u_opentable.openitemi.size = 0; u_opentable.cur_size-; fd = -1; /*文件打开表的序号为 -1 */ return 0;int write(int fd, char *buf, int len)/*写文件

30、*/char *first;int item, i, j, k; int ilen1, ilen2, modlen, temp;char Space = 32; /*SPACE的ASCII码值*/ char Endter= n;for(i=0;ilen;i+)if(bufi = $) /*用 $ 字符作为空格*/bufi = Space;else if(bufi = #) bufi = Endter; item=u_opentable.openitemfd.firstdisk;for(i=2;idirectitemi.firstdisk=item) break;temp = i; while(

31、fatitem.item!=-1) item =fatitem.item; /*查找该文件的下一盘块*/first = fdisk+item*DISKSIZE+u_opentable.openitemfd.size%DISKSIZE;if(DISKSIZE-u_opentable.openitemfd.size%DISKSIZElen)strcpy(first,buf);u_opentable.openitemfd.size = u_opentable.openitemfd.size+len;cur_dir-directitemtemp.size = cur_dir-directitemtem

32、p.size+len;elsefor(i=0;i0) ilen2 = ilen2+1; /*-还需要多少块磁盘块-*/for(j=0;jilen2;j+)for(i=ROOT_DISK_NO+1;i=DISK_NUM) /*如果磁盘块已经分配完了*/ return(-1);first = fdisk+i*DISKSIZE; /*找到的那块空闲磁盘块的起始地址*/if(j=ilen2-1) /*如果是最后要分配的一块*/for(k=0;klen-(DISKSIZE-u_opentable.openitemfd.size%DISKSIZE)-j*DISKSIZE;k+)firstk = bufk;

33、elsefor(k=0;kdirectitemtemp.size = cur_dir-directitemtemp.size+len;return 0;int read(int fd, char *buf)/*读文件*/int len = u_opentable.openitemfd.size;char *first; int i, j, item;int ilen1, modlen; item = u_opentable.openitemfd.firstdisk;if(lenu_opentable.openitemfd.size) return(-1);ilen1 = len/DISKSIZ

34、E; modlen = len%DISKSIZE;if(modlen!=0) ilen1 = ilen1+1; /*-计算文件所占磁盘的块数-*/first = fdisk+item*DISKSIZE; /*-计算文件的起始位置-*/for(i=0;iilen1;i+)if(i=ilen1-1) /*-如果在最后一个磁盘块-*/ for(j=0;jlen-i*DISKSIZE;j+) bufi*DISKSIZE+j = firstj;else for(j=0;jlen-i*DISKSIZE;j+) bufi*DISKSIZE+j = firstj;item = fatitem.item; /*

35、-查找下一盘块-*/first = fdisk+item*DISKSIZE; return 0;int del(char *name)/*删除文件*/int i,cur_item,item,temp;for(i=2;idirectitemi.name,name) break;cur_item = i; /*-用来保存目录项的序号,供释放目录中-*/if(i=MSD+2) /*-如果不在当前目录中-*/ return(-1);if(cur_dir-directitemcur_item.property!=0) /*-如果删除的不是目录-*/return(-3);for(i=0;idirectit

36、emcur_item.firstdisk;/*-该文件的起始盘块号-*/while(item!=-1) /*-释放空间,将FAT表对应项进行修改-*/temp = fatitem.item; fatitem.item = -1;fatitem.em_disk = 0; item = temp;cur_dir-directitemcur_item.sign = 0;/*释放目录项*/cur_dir-directitemcur_item.firstdisk = -1;strcpy(u_opentable.openitemcur_item.name,); cur_dir-directitemcur_item.next = -1; cur_dir-directitemcur_item.property = 0;cur_dir-directitemcur_item.size = 0; return 0;void show()/*显示当前路径*/printf(n操作码:n);void print()/*输出提示信息*/printf(*

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号