链接文件系统的设计与实现word资料16页.docx
- 文档编号:27545166
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:21
- 大小:84.35KB
链接文件系统的设计与实现word资料16页.docx
《链接文件系统的设计与实现word资料16页.docx》由会员分享,可在线阅读,更多相关《链接文件系统的设计与实现word资料16页.docx(21页珍藏版)》请在冰豆网上搜索。
链接文件系统的设计与实现word资料16页
操作系统
宋以后,京师所设小学馆和武学堂中的教师称谓皆称之为“教谕”。
至元明清之县学一律循之不变。
明朝入选翰林院的进士之师称“教习”。
到清末,学堂兴起,各科教师仍沿用“教习”一称。
其实“教谕”在明清时还有学官一意,即主管县一级的教育生员。
而相应府和州掌管教育生员者则谓“教授”和“学正”。
“教授”“学正”和“教谕”的副手一律称“训导”。
于民间,特别是汉代以后,对于在“校”或“学”中传授经学者也称为“经师”。
在一些特定的讲学场合,比如书院、皇室,也称教师为“院长、西席、讲席”等。
课程设计报告
教师范读的是阅读教学中不可缺少的部分,我常采用范读,让幼儿学习、模仿。
如领读,我读一句,让幼儿读一句,边读边记;第二通读,我大声读,我大声读,幼儿小声读,边学边仿;第三赏读,我借用录好配朗读磁带,一边放录音,一边幼儿反复倾听,在反复倾听中体验、品味。
课题:
链接文件系统的设计与实现
与当今“教师”一称最接近的“老师”概念,最早也要追溯至宋元时期。
金代元好问《示侄孙伯安》诗云:
“伯安入小学,颖悟非凡貌,属句有夙性,说字惊老师。
”于是看,宋元时期小学教师被称为“老师”有案可稽。
清代称主考官也为“老师”,而一般学堂里的先生则称为“教师”或“教习”。
可见,“教师”一说是比较晚的事了。
如今体会,“教师”的含义比之“老师”一说,具有资历和学识程度上较低一些的差别。
辛亥革命后,教师与其他官员一样依法令任命,故又称“教师”为“教员”。
班级:
计科1002
学号:
101304219
姓名:
宋震宇
指导老师:
邹姝稚
成绩:
2019.1.16
一、课题设计目的………………………………1
二、课题任务描述………………………………1
三、课题研发相关知识…………………………1
四、课题设计……………………………………3
五、源程序······························6
六、运行与测试…………………………………15
七、心得体会……………………………………16
一、课题设计目的
1.课题设计背景
文件系统是现代OS用来存储和管理信息的机构,其涉及到磁盘空间管理、文件存储结构和用户接口等诸多技术机制。
本课题在位示图的磁盘空间管理方式下,模拟实现文件的显示连接存储,并在此基础上实现文件的读写等操作方法。
2.课题设计目的
通过本课题,深入理解文件物理结构与存取方法之间的关系,掌握磁盘空间管理与文件分配过程间的联系,从而更好地掌握文件系统概念。
二、课题任务描述
1.磁盘文件的管理采用显式链接结构,将文件占用的物理块号和链接指针记录在一张文件分配表(FAT)中。
文件第一块的块号记录在索引结点中。
文件目录只记录文件名和索引结点的编号。
索引结点的结构如下:
索引结点编号
文件属性
创建时间
文件第一块块号
文件占用盘块数
备用
2.假定磁盘存储空间共有100个物理块用于存放数据,目录文件盒索引结点可直接访问,不存放在这100个块中。
3.一个物理块可存放3个文件逻辑记录,并且假设文件逻辑记录定长。
4.要求用键盘输入的方式模拟用户读写请求,输入格式如下:
Create(filename)
Write(filename,text,logical_record_no)
Read(filename,logical_record_no)
其中filename是要读写的文件名,text是写入的内容,logical_record_no是逻辑记录号。
Create、Write、Read分别表示创建一个文件,向文件的某个逻辑记录写,从文件的某个逻辑记录读。
5.文件存储空间管理采用位示图(位示图为7行,16列)的方式。
6.设计和实现文件存储空间的分配,并完成用户的读写请求。
三、课题研发相关知识
1.文件系统
在现代计算机系统中,要用到大量的程序和数据,因内存容量有限,且不能长期保存,故而平时总是把它们以文件的形式存放在外存中,需要时再随时将它们调入内存。
如果由用户直接管理外存上的文件,不仅要求用户熟悉外存特性,了解各种文件的属性,以及它们在外存上的位置,而且在多用户环境下,还必须能保持数据的安全性和一致性。
显然,这是用户所不能胜任、也不愿意承担的工作。
于是,取而代之的便是在操作系统中又增加了文件管理功能,即构成一个文件系统,负责管理在外存上的文件,并把对文件的存取、共享和保护等手段提供给用户。
这不仅方便了用户,保证了文件的安全性,还可有效地提高系统资源的利用率。
2.链接分配
在采用链接分配方式时,可通过在每个盘块上的链接指针,将同属于一个文件的多个离散的盘块链接成一个链表,把这样形成的物理文件称为链接文件。
由于链接分配是采取离散分配方式,消除了外部碎片,故而显著地提高了外存空间的利用率;又因为是根据文件的当前需要,为它分配必需的盘块,当文件动态增长时,可动态地再为它分配盘块,故而无需事先知道文件的大小。
此外,对文件的增、删、改也十分方便。
链接方式又可分为隐式链接和显式链接两种形式。
3.显式链接
这是指把用于链接文件各物理块的指针,显式地存放在内存的一张链接表中。
该表在整个磁盘仅设置一张。
表的序号是物理盘块号,从0开始,直至N-1;N为盘块总数。
在每个表项中存放链接指针,即下一个盘块号。
在该表中,凡是属于某一文件的第一个盘块号,或者说是每一条链的链首指针所对应的盘块号,均作为文件地址被填入相应文件的FCB的“物理地址”字段中。
由于查找记录的过程是在内存中进行的,因而不仅显著地提高了检索速度,而且大大减少了访问磁盘的次数。
由于分配给文件的所有盘块号都放在该表中,故把该表称为文件分配表FAT(FileAllocationTable)。
4.位示图
位示图是利用二进制的一位来表示磁盘中一个盘块的使用情况。
当其值为“0”时,表示对应的盘块空闲;为“1”时,表示已分配。
有的系统把“0”作为盘块已分配的标志,把“1”作为空闲标志。
(它们在本质上是相同的,都是用一位的两种状态来标志空闲和已分配两种情况。
)磁盘上的所有盘块都有一个二进制位与之对应,这样,由所有盘块所对应的位构成一个集合,称为位示图。
通常可用m*n个位数来构成位示图,并使m*n等于磁盘的总块数。
5.索引结点
在检索目录文件的过程中只用到了文件名,仅当找到一个目录项时,才需从该目录项中读出该文件的物理地址。
而其他一些对该文件进行描述的信息,在检索目录时一概不用。
显然,这些信息在检索目录时不需调入内存。
为此有的系统便采用了把文件名与文件描述信息分开的方法,亦即,使文件描述信息单独形成一个称为索引结点的数据结构,简称i结点。
在文件目录中的每个目录项仅由文件名和指向该文件所对应的i结点的指针所构成。
6.库函数介绍
该程序所用的库函数为#include
1)在使用标准函数库中的输入输出函数时,编译系统要求程序提供有关的信息(例如对这些输入输出函数的声明),#include
在程序中用到系统提供的标准函数库中的输入输出函数时,应在程序的开头写上一行:
#include"stdio.h"或者是#include
2)#include
3)stdlib头文件即standardlibrary标准库头文件。
stdlib头文件里包含了C、C++语言的最常用的系统函数。
该文件包含了的C语言标准库函数的定义。
stdlib.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是inputoutputstream的简写,意思为标准的输入输出流头文件。
它包含:
cin>>"要输入的内容"和cout<<"要输出的内容"。
这两个输入输出的方法需要#include
四、课题设计
1.总体结构:
2.数据结构:
1)文件及其类别
文件是由大量性质相同的记录组成的集合。
可按其记录的类型不同分为两类:
操作系统的文件和数据库文件。
操作系统中的文件仅是一维的连续的字符序列,无结构、无解释。
它也是记录的集合,这个记录仅是一个字符组,用户为了存取、加工方便,把文件中的信息划分成若干组,每一组信息称为一个逻辑记录,且可按顺序编号。
数据库中的文件时带有结构的记录的集合;这类记录是由一个或多个数据项组成的集合,它也是文件中可存取的数据的基本单位。
2)记录的逻辑结构和物理结构
记录的逻辑结构是指记录在用户或应用程序员面前呈现的方式,是用户对数据的而表示和存取方式。
物理结构是数据在物理存储器上存储的方式,是数据的物理表示和组织。
用户的读/写一个记录是指逻辑记录,查找对应的物理记录则是操作系统的职责。
3)文件的物理结构
文件在存储介质(磁盘或磁带)上的组织方式称为文件的物理结构。
文件可以有各种各样的组织方式,其基本方式有3种:
顺序组织、随机组织和链组织。
3.主要功能流程图:
创建文件:
删除文件:
打开文件:
关闭文件:
是
否
写文件:
是
否
读文件:
否
是
五、源程序
#include
#include
#include
#include
#defineDIR_LENGTH1024
#defineMAX_WRITE1024*128
#defineMEM_D_SIZE1024*1024
#defineDISKSIZE1024
#defineMSD5
#defineDISK_NUMMEM_D_SIZE/DISKSIZE
#defineFATSIZEDISK_NUM*sizeof(structfatitem)
#defineMOFN5
#defineROOT_DISK_NOFATSIZE/DISKSIZE+1
#defineROOT_DISK_SIZEsizeof(structdirect)
structfatitem{intitem;/*FAT表项结构*/
charem_disk;};
structdirect{structFCB{/*目录项结构*/
charname[9];charproperty;
intsize;intfirstdisk;
intnext;intsign;}
directitem[MSD+2];};
structopentable{structopenttableitem{/*文件打开表项结构*/
charname[9];intfirstdisk;
intsize;}
openitem[MOFN];
intcur_size;};
structfatitem*fat;/*FAT表*/
structdirect*root;/*根目录*/
structdirect*cur_dir;/*当前目录*/
structopentableu_opentable;/*文件打开表*/
intfd=-1;/*文件打开表的序号*/
//char*bufferdir;/*记录当前路径的名称*/
char*fdisk;/*虚拟磁盘起始地址*/
voidinitfile();voidformat();
voidenter();voidhalt();
intcreate(char*name);intopen(char*name);
intclose(char*name);intwrite(intfd,char*buf,intlen);
intread(intfd,char*buf);intdel(char*name);
voidprint();voidshow();
/*--------------初始化文件系统------------------*/
voidinitfile(){fdisk=(char*)malloc(MEM_D_SIZE*sizeof(char));/*申请空间*/
format();free(fdisk);}
voidformat(){inti;/*格式化*/FILE*fp;
fat=(structfatitem*)(fdisk+DISKSIZE);/*计算FAT表地址*/
fat[0].item=-1;fat[0].em_disk='1';
for(i=1;i {fat[i].item=i+1;fat[i].em_disk='1';} fat[ROOT_DISK_NO-1].item=-1;fat[ROOT_DISK_NO-1].em_disk='1'; fat[ROOT_DISK_NO].item=-1;fat[ROOT_DISK_NO].em_disk='1'; for(i=ROOT_DISK_NO+1;i fat[i].em_disk='0';} root=(structdirect*)(fdisk+DISKSIZE+FATSIZE);/*根目录的地址*/ root->directitem[0].sign=1;/*指向当前目录的目录项*/ root->directitem[0].firstdisk=ROOT_DISK_NO; strcpy(root->directitem[0].name,"."); root->directitem[0].next=root->directitem[0].firstdisk; root->directitem[0].property='1'; root->directitem[0].size=ROOT_DISK_SIZE; root->directitem[1].sign=1;/*指向上一级目录的目录项*/ root->directitem[1].firstdisk=ROOT_DISK_NO; strcpy(root->directitem[1].name,".."); root->directitem[1].next=root->directitem[0].firstdisk; root->directitem[1].property='1'; root->directitem[1].size=ROOT_DISK_SIZE; for(i=2;i root->directitem[i].firstdisk=-1;strcpy(root->directitem[i].name,""); root->directitem[i].next=-1;root->directitem[i].property='0'; root->directitem[i].size=0;} if((fp=fopen("disk.dat","wb"))==NULL){printf("Error: \nCannotopenfile\n"); return;} if(fwrite(fdisk,MEM_D_SIZE,1,fp)! =1)/*虚拟磁盘空间保存到磁盘文件中*/ {printf("Error: \nFilewriteerror! \n");}fclose(fp);} voidenter(){FILE*fp;/*进入文件系统*/ inti;fdisk=(char*)malloc(MEM_D_SIZE*sizeof(char));/*申请空间*/ if((fp=fopen("disk.dat","rb"))==NULL){printf("Error: \nCannotopenfile\n"); return;} if(! fread(fdisk,MEM_D_SIZE,1,fp))/*把disk.dat读入虚拟磁盘空间*/ {printf("Error: \nCannotreadfile\n");exit(0);} fat=(structfatitem*)(fdisk+DISKSIZE);/*找到FAT表地址*/ root=(structdirect*)(fdisk+DISKSIZE+FATSIZE);/*找到根目录地址*/ fclose(fp); for(i=0;i strcpy(u_opentable.openitem[i].name,""); u_opentable.openitem[i].firstdisk=-1; u_opentable.openitem[i].size=0;} u_opentable.cur_size=0;cur_dir=root;} voidexit()/*退出文件系统*/{FILE*fp;inti; if((fp=fopen("disk.dat","wb"))==NULL){printf("Error: \nCannotopenfile\n"); return;} if(! fwrite(fdisk,MEM_D_SIZE,1,fp))/*把虚拟磁盘空间内容读入disk.dat*/ {printf("Error: \nFilewriteerror! \n");} fclose(fp);free(fdisk);//free(bufferdir); for(i=0;i {strcpy(u_opentable.openitem[i].name,""); u_opentable.openitem[i].firstdisk=0;u_opentable.openitem[i].size=0;} u_opentable.cur_size=0;/*用户打开文件数清零*/return;} intcreate(char*name){inti,j;/*创建文件*/ if(strlen(name)>8)return(-1); for(i=2;i {if(cur_dir->directitem[i].firstdisk==-1)break;} for(j=2;j {if(! strcmp(cur_dir->directitem[j].name,name))break;} if(i>=MSD+2)/*无空目录项*/return(-2); if(u_opentable.cur_size>=MOFN)/*打开文件太多*/return(-3); if(j for(j=ROOT_DISK_NO+1;j {if(fat[j].em_disk=='0')break;} if(j>=DISK_NUM)return(-5); fat[j].em_disk='1';/*将空闲块置为已经分配*/ strcpy(cur_dir->directitem[i].name,name); cur_dir->directitem[i].firstdisk=j;cur_dir->directitem[i].size=0; cur_dir->directitem[i].next=j;cur_dir->directitem[i].property='0'; /*cur_dir->directitem[i].sign丢失*/ fd=open(name);/*打开所创建的文件*/return0;} intopen(char*name){inti,j;/*打开文件*/ for(i=2;i {if(! strcmp(cur_dir->directitem[i].name,name))break;} if(i>=MSD+2)/*文件不存在*/return(-1); /*--------是文件还是目录-----------------------*/ if(cur_dir->directitem[i].property=='1')return(-4); for(j=0;j if(! strcmp(u_opentable.openitem[j].name,name))break;} if(j if(u_opentable.cur_size>=MOFN)/*文件打开太多*/return(-3); for(j=0;j if(u_opentable.openitem[j].firstdisk==-1)break;} u_opentable.openitem[j].firstdisk=cur_dir->directitem[i].firstdisk; strcpy(u_opentable.openitem[j].name,name); u_opentable.openitem[j].size=cur_dir->directitem[i].size; u_opentable.cur_size++;return(j);/*返回用户打开表表项的序号*/} intclose(char*name)/*关闭文件*/{inti; for(i=0;i strcmp(u_opentable.openitem[i].name,name))
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 链接 文件系统 设计 实现 word 资料 16