操作系统第四次实验报告_文件系统(附代码)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

实验四文件系统实验介绍本实验要求在假设的I/O系统之上开发一个简单的文件系统,这样做既能让实验者对文件系统有整体了解,又避免了涉及过多细节。用户通过create,open,read等命令与文件系统交互。文件系统把磁盘视为顺序编号的逻辑块序列,逻辑块的编号为0至L-1。I/O系统利用内存中的数组模拟磁盘。实际物理磁盘的结构是多维的:有柱面、磁道、扇区等概念。I/O系统的任务是隐藏磁盘的结构细节,把磁盘以逻辑块的面目呈现给文件系统。逻辑块顺序编号,编号取值范围为0至L-1,其中L表示磁盘的存储块总数。实验中,我们可以利用字符数组ldisk[L][B]构建磁盘模型,其中B表示每个存储块的长度。I/O系统从文件系统接收命令,根据命令指定的逻辑块号把磁盘块的内容读入命令指定的内存区域,或者把命令指定的内存区域内容写入磁盘块。内存区域内容写入磁盘块。整体组织注:我定义的文件系统中,磁盘分为两大部分:数据区和保留区。其中保留区中又包含位图区和文件描述符区,数据区的首部是文件的目录项,也就是说,文件的目录项在文件创建时会创建相应的目录项在数据区的文件首部;而位图区用于表征数据的占用情况,例如数据区的第N块被分配了,那么位图区中也要做相应的改变。文件描述符注:文件描述符位于保留区后半部,用于分为两类型,即表示目录的0号描述符和1号以后的描述符,用于表示文件的长度和分配块情况,具体看上图。目录项注:目录项位于数据区的首部,目录项的0位用于保存文件描述符的序号,1号以后用于存放文件名总结:一个文件的所有存放于由位视图,文件描述符,目录项和数据区表征。①对磁盘的操作:字符数组(L*B)模拟磁盘,考虑到文件系统和I/O系统(磁盘)不是同一层,故将所有对磁盘的操作只能规约为这二者之间的接口来操作:voidread_block(int,char*);//文件系统与IO设备的接口函数,读取块voidwrite_block(int,char*);//文件系统与IO设备的接口函数,写入块(代码详见源文件)也就是说,之后的文件的创建,删除,打开,关闭,指针定位等操作,里面牵扯到磁盘内容读写的步骤,全部需要用这两个接口完成,然后这两个接口对磁盘的操作是以块为单位的,所以例如某些操作,只要更改磁盘中的某一块中的某一位,则需要先读取某一块存于零时数组中,然后修改这个数组的某一位,然后再将这个数组写回磁盘。②对文件的操作:文件的创建intcreate(char*).找一空闲文件描述符.在文件目录里为新创建的文件分配一个目录项,(可能需要为目录文件分配新的磁盘块).在分配到的目录项里记录文件名以及描述符编号.返回状态信息文件的删除intdestroy(char*).在目录里搜索该文件的描述符编号.删除该文件对应的目录项,并更新位图.释放文件描述符.返回状态信息文件的打开intopen(char*).搜索目录找到文件对应的描述符序号.在打开文件表中分配一个表目.在分配到的表目中把读写指针置为0,并记录描述符编号.读入文件的第一块到读写缓冲区中.返回分配到的表目在打开文件表中的索引号文件的关闭intclose(int).把缓冲区的内容写入磁盘.释放该文件再打开文件表中对应的表目.返回状态信息文件的写intwrite(int,int,int).写的内容若小于缓冲区内容,则直接写入缓冲区,完成写操作(关闭的时候会将缓冲区写入文件).入写入的内容,缓冲区无法一次装完,则需要填满缓冲区,然后将缓冲区写入文件,腾出缓冲区,然后再写入缓冲区,碰到缓冲区满的情况便写入文件,腾出缓冲区,以便文件的写入,完成写操作。.返回状态信息文件的读intread(int,int,int).将文件整个内容整个取出在一个临时字符数组中.根据要求的读取参数定位读写位置,输出读取内容,完成读操作.返回状态信息文件指针定位intlseek(int,int).把文件的读写指针移动到pos指定的位置。pos.是一个整数,表示从文件开始位置的偏移量。文件打开时,读写指针.自动设置为0。每次读写操作之后,它指向最后被访问的字节的下一.个位置。lseek能够在不进行读写操作的情况下改变读写指针能位置。实验过程该文件系统根据输入的指令来对文件系统的操作此时该文件系统会初始化新建文件操作:(create)显示目录文件:(dir)文件的删除:delete打开文件:(open)打开文件表:(oplist)文件的写操作:(write)关闭文件:close打开和读取lmjorz:后台查看磁盘数组的内容,可以查看实时情况命令(ldisk)实验源代码:operation.h#includestdio.h#includestdlib.h#includestring.h//辅¡§助¨²函¡¥数ºyintshow_openlist();//显?示º?打䨰开a文?件t表À¨ª,返¤¦Ì回?打䨰开a文?件t个?数ºyvoiddirectory();//显?示º?目?录?文?件t详¨º细?信?息¡évoidshow_help();//该?文?件t系¦Ì统ª3的Ì?帮ã?助¨²voidshow_ldisk();//显?示º?磁ä?盘¨¬内¨²容¨Y(ꡧ辅¡§助¨²用®?)ê?//核?心?函¡¥数ºyvoidread_block(int,char*);//文?件t系¦Ì统ª3与®?IO设¦¨¨备À?的Ì?接¨®口¨²函¡¥数ºy,ê?读¨¢取¨?块¨¦voidwrite_block(int,char*);//文?件t系¦Ì统ª3与®?IO设¦¨¨备À?的Ì?接¨®口¨²函¡¥数ºy,ê?写¡ä入¨?块¨¦voidInit();//初?始º?化¡¥文?件t系¦Ì统ª3intcreate(char*);//创ä¡ä建¡§文?件tintdestroy(char*);//删¦?除y文?件tintopen(char*);//打䨰开a文?件tintclose(int);//关?闭À?文?件tintread(int,int,int);//读¨¢文?件tintwrite(int,int,int);//写¡ä文?件tintwrite_buffer(int,int);//把ã?缓o冲?区?内¨²容¨Y写¡ä入¨?文?件tintlseek(int,int);//定¡§位?文?件t指?针?voidInit_block(char,int);//初?始º?化¡¥字Á?符¤?数ºy组Á¨¦块¨¦(ꡧ辅¡§助¨²)ê?voidread_block(inti,char*p)/**************************读¨¢磁ä?盘¨¬块¨¦该?函¡¥数ºy把ã?逻?辑-块¨¦i的Ì?内¨²容¨Y读¨¢入¨?到Ì?指?针?p指?向¨°的Ì?内¨²存ä?位?置?拷?贝À¡ä的Ì?字Á?符¤?个?数ºy为a存ä?储ä¡é块¨¦的Ì?长¡è度¨¨B。¡ê***************************/{char*temp=(char*)malloc(sizeof(char));temp=p;for(inta=0;aB;){*temp=ldisk[i][a];a++;temp++;}}voidwrite_block(inti,char*p)/**************************写¡ä磁ä?盘¨¬块¨¦该?函¡¥数ºy把ã?指?针?p指?向¨°的Ì?内¨²容¨Y写¡ä入¨?逻?辑-块¨¦i拷?贝À¡ä的Ì?字Á?符¤?个?数ºy为a存ä?储ä¡é块¨¦的Ì?长¡è度¨¨B。¡ê***************************/{char*temp=(char*)malloc(sizeof(char));temp=p;for(inta=0;aB;){ldisk[i][a]=*temp;a++;temp++;}}voidInit_block(char*temp,intlength)/**************************初?始º?化¡¥一°?个?字Á?符¤?数ºy组Á¨¦块¨¦处ä|理¤¨ª的Ì?字Á?符¤?数ºy组Á¨¦块¨¦长¡è度¨¨为aB内¨²容¨Y为a'\0'***************************/{inti;for(i=0;ilength;i++){temp[i]='\0';}}intwrite_buffer(intindex,intlist){inti;intj;intfreed;chartemp[B];intbuffer_length=BUFFER_LENGTH;for(i=0;iBUFFER_LENGTH;i++){if(open_list[list].buffer[i]=='\0'){buffer_length=i;//缓o冲?区?有®D效¡ì长¡è度¨¨break;}}intx=open_list[list].pointer[0];inty=open_list[list].pointer[1];intz=B-y;//当Ì¡À前¡ã块¨¦空?闲D容¨Y量¢?//printf(W:buffer_length:%dx:%dy:%dz:%d\n,buffer_length,x,y,z);if(buffer_lengthz)//块¨¦容¨Y量¢?可¨¦写¡ä入¨?缓o冲?区?不?需¨¨要°a再¨´分¤?配?{read_block(x,temp);strncat(temp+y,open_list[list].buffer,buffer_length);//缓o冲?区?接¨®入¨?//printf(temp[0]:%c\n,temp[0]);write_block(x,temp);read_block(index+FILE_SIGN_AREA,temp);//更¨¹改?文?件t长¡è度¨¨//printf(temp[1]=%d\n,temp[1]);temp[1]+=buffer_length;//printf(temp[1]=%d\n,temp[1]);write_block(index+FILE_SIGN_AREA,temp);open_list[list].pointer[0]=x;open_list[list].pointer[1]=y+buffer_length;//更¨¹新?文?件t读¨¢写¡ä指?针?}else//大䨮于®¨²,ê?需¨¨要°a分¤?配?新?块¨¦{read_block(index+FILE_SIGN_AREA,temp);if(temp[2]+(buffer_length-z)/B+1FILE_BLOCK_LENGTH){printf(文?件t分¤?配?数ºy组Á¨¦不?够?分¤?配?\n);returnERROR;}//分¤?别Àe三¨y部?分¤?//第̨²一°?部?分¤?填¬?满¨²read_block(x,temp);strncat(temp+y,open_list[list].buffer,z);//缓o冲?区?接¨®入¨?z的Ì?长¡è度¨¨,ê?填¬?满¨²当Ì¡À前¡ã块¨¦write_block(x,temp);//第̨²二t部?分¤?还1需¨¨要°a分¤?配?(buffer_length-z)/B+1块¨¦//******************寻¡ã找¨°文?件t区?(ꡧ目?录?项?之?后¨®)ê?的Ì?空?闲D块¨¦,ê?分¤?配?新?块¨¦for(i=0;i(buffer_length-z)/B;i++){for(j=K+FILE_NUM;jL;j++){read_block((j-K)/B,temp);if(temp[(j-K)%B]==FREE){freed=j;//printf(freed=:%d\n,freed);break;}}if(j==L){printf(磁ä?盘¨¬已°?满¨²,ê?分¤?配?失º¡ì败㨹\n);returnERROR;}Init_block(temp,B);s

1 / 34
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功