《操作系统课程设计操作系统之文件管理部分的设计与实现.doc》由会员分享,可在线阅读,更多相关《操作系统课程设计操作系统之文件管理部分的设计与实现.doc(28页珍藏版)》请在三一办公上搜索。
1、操作系统之文件管理部分的设计与实现摘 要本系统根据操作系统理论课上学习的操作系统中关于文件管理实现方法,在采用混合索引文件结构、成组链接法的基础上实现单用户的磁盘文件管理部分,包括:文件的逻辑结构、文件的物理结构、目录结构、磁盘分配回收、文件的保护和用户接口。本论文主要阐述四部分内容,引言部分,主要说明本次操作系统课程设计的性质、教学目的、教学任务与要求、意义以及论文的结构安排;系统分析与设计部分,主要阐述系统的主要功能模块以及每个模块计划采用的实现方法和原理;系统实现部分,主要通过流程图等工具描述主要模块的实现流程;最后一部分,结束语部分,主要书写已经实现的本系统存在的不足、改进方案和在课程
2、设计中的实际感受。关键词:操作系统 文件管理 混合索引 成组链接ABSTRACTAccording to the system operating on the theory of learning in the operating system on the document management method, used in mixed-index file structure of the groups links to law based on single-user disk file management, including: the logical structure of
3、the document, document The physical structure of the directory structure, the distribution of the recovery disk, file protection and user interface. This paper on a four-part, the introductory remarks, the main operating system that the nature of the curriculum design, the purpose of teaching, teach
4、ing and mission requirements, as well as the significance of the paper structure; part of the analysis and design, mainly on core functions of the system modules Each module, as well as the realization of the plan to adopt the methods and principles; part of the system, mainly through the flow chart
5、, and other tools to describe the main module of the process to achieve; the last part of the concluding part of the writing has been the main achievement of the shortcomings of the system to improve the program and Curriculum design in the real feelings.key words: Operating system Document Manageme
6、nt Index Mixed Groups links目 录目 录1一 引言11.1性质11.2 教学目的11.3 任务和要求11.4意义11.5 论文结构安排2二 文件管理部分系统分析与设计22.1系统要求22.2 文件存储的实现方法和原理22.2.1磁盘模拟22.2.2文件的逻辑结构22.2.3文件的物理结构32.2.4目录结构32.2.5磁盘分配32.2.6用户接口32.2.7屏幕显示52.3 磁盘管理52.3.1磁盘的分配52.3.2磁盘的归还52.3.3磁盘状态的显示52.3.4磁盘空闲块数显示5三 系统实现63.1磁盘管理63.1.1磁盘初始化63.1.2磁盘的分配73.1.3磁盘
7、的注销73.1.4磁盘盘块的颜色显示83.1.5磁盘的空闲块数查询93.1.6磁盘的信息读写93.1.7格式化磁盘103.2目录管理103.2.1目录的查询103.2.2查找同名目录113.2.3建立目录123.2.4删除空目录133.2.5删除目录133.3文件管理153.3.1创建文件153.3.2删除文件163.3.3拷贝文件163.3.4录入文件173.3.5盘内移动文件173.3.6判断文件只读与否183.3.7保存文件183.3.8改变文件属性183.4界面显示193.4.1文件树形结构193.4.2颜色显示203.4.3建立树节点203.4.4删除树节点213.4.5格式化结点2
8、2四 结束语23一 引言1.1性质操作系统是计算机科学与技术专业的主要专业基础课和主干课。操作系统对计算机系统资源实施管理,是所有其他软件与计算机硬件的唯一接口,所有用户在使用计算机时都要得到操作系统提供的服务。1.2 教学目的通过模拟操作系统的全部或者部分功能的实现,加深对操作系统工作原理和操作系统实现方法的理解,达到练习编程的目的,提高学生运用理论知识分析问题、解决问题的能力,为学生从事科学研究和独立负担计算机及其应用方面的工作打好扎实的基础。1.3 任务和要求课程设计总体要求模拟采用多道程序设计方法的单用户操作系统,该操作系统包括四部分内容:文件管理和用户接口、存储管理、设备管理、进程管
9、理。功能模块图如下:用户接口 主界面 内存管理设备管理进程调度文件管理1.4意义通过模拟操作系统原理的实现,加深对操作系统工作原理和操作系统实现方法的理解,掌握了初步分析实际问题的能力,为其今后在相关领域开展工作打下坚实的基础。同时使学生系统科学地受到分析问题和解决问题的训练,提高运用理论知识解决实际问题的能力。1.5 论文结构安排本论文主要阐述四部分内容,引言部分,主要说明本次操作系统课程设计的性质、教学目的、教学任务与要求、意义以及论文的结构安排;系统分析与设计部分,主要阐述系统的主要功能模块以及每个模块计划采用的实现方法和原理;系统实现部分,主要通过实现思想说明、流程图等工具描述主要模块
10、的实现流程;最后一部分,结束语部分,主要书写已经实现的本系统存在的不足、改进方案和在课程设计中的实际感受二 文件管理部分系统分析与设计2.1系统要求本系统要求实现文件的逻辑结构、文件的物理结构、目录结构、磁盘分配和回收、文件的保护和用户接口。2.2 文件存储的实现方法和原理2.2.1磁盘模拟磁盘是断电后内容不丢失的,因此用文件模拟磁盘。用一个文件disk1模拟磁盘,要求模拟系统至少存在一个磁盘逻辑分析,建议实现两个磁盘逻辑分区。磁盘的每个盘块128字节,模拟磁盘共有256块。磁盘中第0块存放专用块内容,第1、2块存放根目录,其余存放子目录和文件。2.2.2文件的逻辑结构 文件的逻辑结构采用流式
11、结构,文件的内容均采用文本文件,系统中有两种文件,一种是存放任意字符的文件,一种是可执行文件,可执行文件的内容就是系统内进程的程序体。可执行文件要包括如下命令:X=?; 给i赋值一位数X+; i加1X-; i减1!?; 第一个?为A,B,C中某个设备,第二个?为一位数,表示使用设备的时间end; 表示文件结束2.2.3文件的物理结构采用混合索引结构。每个目录项包括一个直接地址项和一个一级索引项。2.2.4目录结构目录结构采用树型目录结构,每个目录项占16个字节,目录项内容包括:l 目录名、文件名:6个字节(当名小于6字节时可以补空格之类特殊字符到6个);l 扩展名:3个字节(可执行文件扩展名为
12、exe,目录没有扩展名);l 目录、文件属性:1字节;(1字节8位,每一位可以代表不同的属性,比如第0位为1表示该目录项为目录(文件夹)的登记项,为0表示是文件的登记项(FCB);第1位表示是否隐藏,第2位表示是否为只读文件)l 文件长度:2字节(目录没有长度,字节数)。l 地址:直接地址项1个,一级索引项1个;根目录:根目录位置固定,占用磁盘2块,大小固定,共16项,占用模拟磁盘第1、2块;子目录:位置不固定,大小不固定。2.2.5磁盘分配磁盘的空闲块的组织方式采用成组链接。磁盘逻辑分为两个区(C盘和D盘),每个分区的占128块。成组链接时,专用块占每个分区的第0块,空闲块每组登记10个空闲
13、块。2.2.6用户接口用户接口提供用户命令接口,要求文件名中既可以支持相对路径的文件名,也可支持绝对路径的路径名。要求实现以下命令:l 创建文件:create 文件名建立新文件,如果原来存在同名文件要提示是否覆盖。建立新文件,可以只建立一个目录项,等编辑文件时再分配文件所需磁盘块。l 拷贝文件:copy 源文件名 目标文件名拷贝文件可同名拷贝,也可更名拷贝;如果目标位置存在同名文件要提示是否覆盖。拷贝文件首先找到源文件的目录项,然后确认目标位置可以存放文件的拷贝(即无同名文件,有同名文件若同意覆盖,则先删除同名文件即可),然后根据源文件目录项建立目标文件的目录项;根据源文件目录项指示的文件索引
14、块和文件内容所在位置,一边为目标文件申请磁盘块,一边将源文件索引块和文件内容读出、复制。l 删除文件:delete文件名 知道要删除的文件,回收其文件所占磁盘块,删除目录项。l 移动文件:move 源文件名 目标文件名注意:磁盘内和磁盘间文件移动的不同,磁盘内的移动实际只是将文件目录项复制到目标处,然后将原始的文件目录删除,并不需要真的移动文件;磁盘间的文件移动实际上是先拷贝文件到目标磁盘,然后再删除源文件。l 显示文件:type 文件名仅仅是显示文件内容。l 编辑文件:edit 文件名注意只读文件不可以修改。在修改文件过程中,文件的长短在变化,注意磁盘块分回收和分配。l 改变文件属性:cha
15、nge 文件名 属性将文件在只读和非只读、隐藏和非隐藏之间转换。l 磁盘格式化命令 format 盘符格式化即将所有磁盘块回收,即认为除0、1、2外磁盘块均为空闲,将根目录所有目录项置为空目录项。l 建立目录:makdir 目录建立目录,若同名目录存在则建立失败。建立对应目录(文件夹)的目录项。l 改变目录路径:chadir目录改变当前工作目录,命令接口上要提示当前工作目录。l 删除空目录:rdir 目录当前目录、非空目录、根目录不能删除,只删除空目录项。l 删除目录:deldir 目录 既可删除空目录又可删除非空目录,对于非空目录,首先要删除其下文件和目录然后才能删除其本身。采用树的后序遍历
16、算法,对目录树进行遍历,遍历中的访问换成删除,文件则调用文件删除,空目录则调用空目录删除。l 运行可执行文件:可执行文件的文件名。2.2.7屏幕显示屏幕显示要求包括:用户命令接口,用于系统运行时用户输入命令;磁盘目录显示,要求显示磁盘的树型目录结构;磁盘使用情况,显示磁盘每一个磁盘块的空间是否空闲。2.3 磁盘管理2.3.1磁盘的分配首先检索专用块第0项记录的空闲块数是否为1,若为1,则查询 第一项是否为0,为0则无空闲块可分配,否则将第一项记录的块号中所有内容复制到专用块,然后把该块号对应的空闲块分配出去;若专用块第0项记录的空闲块数是否不为1,则把专用块中记录的最后一个空闲块分配出去。2.
17、3.2磁盘的归还当归还一块时,首先检索专用块登记的空闲块数是否为10,若不为10,则只要把归还块的块号登记到专用块中且将空闲块数加1,若专用块登记的空闲块数已经为10,则把专用块中的内容写到所归还的空闲块中,该归还块作为新组的第一块,记录其块号到专用块,专用块登记的空闲块数为1。 2.3.3磁盘状态的显示磁盘的状态在每次分配和回收磁盘块的函数过程中实现,每分配一个空闲块,将相应pictureBox由浅粉色改为红色,表示该磁盘块已经被占用;每回收一块磁盘块的时候,将相应pictureBox由红色色改为浅粉色,表示该磁盘块空闲。2.3.4磁盘空闲块数显示系统每分配一个空闲块,实现对应分区空闲块数减
18、1,相应的,每回收一个空闲块,对应分区空闲块数加1。三 系统实现3.1磁盘管理3.1.1磁盘初始化磁盘初始化实现空闲块的成组链接,每组记录10个空闲块,最后一组记录9块,专用块记录6块。模拟磁盘共分两个区,每个分区各占128个盘块。其实现的关键代码(以C盘为例):d0 = 6; int h = 0; int k = 8; for (i = 1; i = 6; i+) di = (byte)k; k-; for (i = 8 * 128; h11; i += 10 * 128) di = 10; k=0; for (int j = 1; j =10; j+) di + j = (byte)(i
19、/ 128 + 10+k); k-; h+; d 118 * 128=9; d 118 * 128+1=0; k=127; for (i = 118 * 128+2; i 1) /*若该组不止一个空闲块*/ i = d0; s = di; d0-; Write_To_Disk(d, 0, 128); return s; else if (d0 = 1) /*只剩一个空闲块*/ if (d1 != 0) /*还有其它空闲块组*/ s = disk1; for (i = 0; i = 10; i+) di = ds * 128 + i; Write_To_Disk(d, 0, 128); Writ
20、e_To_Disk(p, s*128, 128); return s; else /*没有其它空闲块组*/ return -1;/无空闲块可分 return -1;3.1.3磁盘的注销首先将模拟磁盘中的所有内容读到字节数组d中,按成组链接的原理,从专用块开始检索,若专用块登记的空闲块数小于10,则直接将回收的空闲块号记录到专用块中,否则将专用块内容拷贝到回收的空闲块,该空闲块作为第一项记录到专用块,专用块记录块号置1。参数j为要回收的空闲块号,j128则说明该盘块回收到C盘分区中,否则回收到D盘。关键代码:if (j 128) if (d0 10) /*当前组不满10块*/ i = d0; d
21、i + 1 = (byte)j; d0+; Write_To_Disk(d, 0, 128); else /*已有10块*/ for (i = 0; i = 10; i+) dj * 128 + i = di; d0 = 1; d1 = (byte)j; for (k = 0; k 128; k+) pk = dj * 128 + k; Write_To_Disk(d, 0, 2); Write_To_Disk(p, j* 128, 128); 3.1.4磁盘盘块的颜色显示将已占用和未占用的空闲块号用一个数组byte f记录,数组长度256,前128项记录C盘盘块使用情况,后128项记录D盘盘
22、块使用情况。基于空闲块的成组链接,遍历整个空闲成组链,若某一盘块为空闲(设该盘块号为k),则f(k)=1,否则f(k)=0,数组f返回到调用处,调用函数根据数组中的数据判断盘块的使用情况并用颜色差异在界面中标示。关键代码:public void cor(int q,byte f) int count = 0; int i; byte b = new byte32768; b = Get_From_Disk(0,32768); if (q = 0) count = b0; for (i = 1; i = count; i+) fbi = 1; count = b1; while (count !
23、= 0) for (i = 1; i = 10; i+) fbcount * 128 + i = 1; count = bcount * 128 + 1; f0 = 0; return ; else count = b128 * 128; for (i = 1; i = count; i+) fb128 * 128 + i = 1; count = b128 * 128 + 1; while (count != 0) for (i = 1; i = 10; i+) fbcount * 128 + i = 1; count = bcount * 128 + 1; f128 = 0; return
24、;3.1.5磁盘的空闲块数查询调用颜色显示模块中的cor函数,得到空闲块记录数组,根据得到的数组计算每个分区的空闲块块数。public int FreeCount(int q) int count = 0; byte b = new byte256; cor(q, b); if (q = 0) for (int i = 3; i 128; i+) if (bi = 1) count+; else count = 0; for (int i = 3; i 128; i+) if (bi = 1) count+; return count; 3.1.6磁盘的信息读写1、读信息从指定的位置begin
25、开始,读取number个字节到字节数组,返回字节数组。public byte Get_From_Disk(int begin, int number) byte b = new bytenumber; /创建数组 FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read);/创建读文件流 fs.Seek(begin, SeekOrigin.Begin); fs.Read(b, 0, number); fs.Close(); return b; 2、写信息从指定的模拟磁盘开始的位置begin起,把file数组中的num
26、ber个字节写入到磁盘中。public void Write_To_Disk(byte file, int begin, int number) FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Write); /创建写文件流 fs.Seek(begin, SeekOrigin.Begin); fs.Write(file, 0, number); fs.Close(); 3.1.7格式化磁盘 根据参数判断格式化那个盘符,若参数为0,则格式化C盘,为1则格式化D盘。格式化即删除磁盘中对应分区的内容,并初始化分区中的空闲块
27、。代码:public void format(int disknum) byte bb = new byte16256; /将出专用块外的所有块清空(共127块) if (disknum = 0) Write_To_Disk(bb, 128, 16256); else Write_To_Disk(bb, 128 * 129, 16256); initial(disknum); 3.2目录管理3.2.1目录的查询 查询路径为全路径,查询的若为目录,则返回该目录的索引盘块号,即该目录的下一级文件的fcb存放的盘块号;查询的若为文件,则返回该文件的直接盘块号,即文件内容的直接地址。Searchpar
28、t函数实现查找单个目录。关键代码: public int Search(string paths, int Num) int disknum; if(paths0.StartsWith(c)|paths0.StartsWith(C) disknum= 1; else if (paths0.StartsWith(d) | paths0.StartsWith(D) disknum = 129; else MessageBox.Show(路径错误!); return -2; for (int i = 1; disknum != -1 & i Num; i+) disknum = searchpart
29、(i,pathsi, disknum); return disknum; 3.2.2查找同名目录查找成功则返回字节号,失败则返回-1。 int search_dir(string dir_name, int disknum) int d = disknum * 128; byte buffer = new byte256; /所找目录一定是在根目录下 buffer = Get_From_Disk(d, 256); for (int j = 0; j 16; j+) byte fcb = new byte16; /记录每一个Fcb for (int k = 0; k 16; k+) fcbk =
30、 bufferj * 16 + k; byte name = new byte6; /存放目录名 for (int i = 0; i 6; i+) namei = fcbi; string str = System.Text.Encoding.Default.GetString(name); str = str.Trim(); if (fcb9 = 1 | fcb9 = 3 | fcb9 = 5 | fcb9 = 7) if (str.Equals(dir_name) /都为目录且名字相同 return d + j * 16; return -1; 3.2.3建立目录实现增加目录的功能,若存在
31、同名目录,则无需再创建,直接返回,否则找到目录的根目录处添加新的目录fcb。流程图如下:路径N根目录是否正确Y查找同名目录显示路径错误-1返回值其他目录已存在,结束失败结束查找可写入该目录项的地址-1返回值其他空间不足,结束申请索引盘块-1返回值其他写入目录fcb空间不足,结束成功写入,结束3.2.4删除空目录查找目录是否为空,若为空,则删除,否则返回。关键代码:/查找同名目录,查找成功则返回字节号,失败则返回-1int dir_fcb = search_dir(pathspathnum - 1, diskNum); byte b = new byte16; b = Get_From_Disk
32、(dir_fcb, 16); int k = (int)b11; /注销磁盘块 Cancel(k); /回收 byte fcb = new byte16; Write_To_Disk(fcb, dir_fcb, 16); /清除目录fcb3.2.5删除目录先查找该目录是否为空,若为空则直接删除,若不为空,则先删除其子级文件,再删除空目录。核心代码:if (fcb9 = 0)/path为文件 Delete(path); /直接删除文件 return 1; else int count = child_count(path, diskNum); /子文件或目录个数 if (count = 0)/p
33、ath为空目录 rdir(path, diskNum); /删除空目录 return 1; else/path为非空目录 int nextdir_diskNum = fcb11; string str = new stringcount; int p = 0; int dd = nextdir_diskNum * 128;/实际字节号 byte buffer = new byte128;/buffer是存放第diskNum块磁盘块的缓冲 buffer = Get_From_Disk(dd, 128); for (int j = 0; j 8; j+)/将盘块切分成8个FCB byte ffcb = new byte16;/存放一个FCB for (int k = 0; k 16; k+) ffcbk = bufferj * 16 + k; if (ffcb10 != 0) /文件fcb byte b = new byte6; for (int h = 0; h 6; h+)