操作系统课程设计 2.docx
《操作系统课程设计 2.docx》由会员分享,可在线阅读,更多相关《操作系统课程设计 2.docx(27页珍藏版)》请在冰豆网上搜索。
操作系统课程设计2
课程设计4磁盘文件操作
一、课程设计目的
·深人了解磁盘文件系统的实现。
二、预备知识
·文件的操作。
·文件的逻辑结构和物理结构。
·磁盘空间的管理。
·磁盘目录结构。
三、小组人员
四、课程设计内容
设计一个简单的文件系统,用文件模拟磁盘。
用数组模拟缓冲区,要求实现:
1支持多级目录结构.支待文件的绝对读路径;
②文件的逻辑结构采用流式结构,物理结构采用链接结构中的显示链接方式;
③采用文件分配表;
④实现的命令包括建立目录、,列目录、删除空目、建立文件、删除文件、显示文件、打开文件、读文件、写文件(追加方式)、关闭文作、改变文件属性。
⑤最后编写主函数对所做工作进行测试。
五、提示与讲解
为了正确地实现文件的存取。
文件系统设汁了一组与存取文件有关的功能模块。
用户可以用“访管指令”调用这些功能模块.以实理文件的存取要求,把文件系统设计的这一组功能模块称为“文件操作”。
文件操作不是独立的,和文件系统的其他部分密切相关。
若要实现文件操作就离不开文件的目录结构、文件的组织结构和磁盘空间的管理。
因此,这个实验虽然是文件操作的模拟实现,但是还必须模拟一部分文件的组织结构、目录结构和磁盘空间管理的实现。
(1)文件的组织钻构
文件的逻辑结构有两种形式:
流式文件和记录式文件。
实脸中只支持流式文件,采用称为显示链接的物理文件结构,把磁盘中每一块的指针部分提出来组织在一起,形成文件分配表(FAT)。
磁盘有多少块,文件分配表就有多少项。
若某文件的一个磁盘块号为i,则这个文件的下
一个磁盘的块号应该记录在文件分配表第i项。
例如,某系统文件分配表前几项值如表2-5-1所示:
某个文件的起始盘块号为3,则该文件的磁盘块号依次为3、4、9、12、13。
表2-5-1某磁盘文件分配表部分内容
第几项
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
…
内容
-1
-1
-1
4
9
0
7
8
-1
12
11
-1
13
-1
0
0
…
〔2)磁盘空间的管理
首先要模拟一个磁盘。
因为是实验,不使用真正的磁盘,所以实验中用一个文件模拟一
个小磁盘。
假设模拟磁盘有128个物理块,每个物理块大小为64B。
盘块的块号从0编起,
依次为0,1,2,3…,127。
将前面所讲的文件分配表放在磁盘的开始处。
因为盘块有128块,所以文件分配表有128项,每项占用一个字节。
这样文件分配表占用了磁盘的0块和1块,这两块就不能作其他用处。
若一个盘块是某个文件的最后一块。
填写“-1”表示文件结束。
文件的建立和删除操作需要对磁盘的空间进行分配和回收,所以要建立一定的数据表格
来记录磁盘的使用情况。
用文件分配表的第i项表示第i个盘块的使用情况。
磁盘的第0块
一定会被系统数据占用。
所以任何一个文件的某个盘块块号都不可能是“0”,因而还可以用“0”表示磁盘盘块空闲,若这个盘块已经分配出去,即是某个文件的一块,由上面已知知道文件分配表中对应记录的是文件下一块的块号或结束标志都不是“0”。
这样非“0”值表示盘块已分。
像前面图2-5-1那张文件分配表中。
块号为5、14和15的盘块是空闲的,其余是已分配的。
在文件分配表中可以用一个超过盘块号的正整数表示文件结束,在此实验中
采用255代替“-1"表示文件结束。
如果磁盘中某些部分损坏,只要不是系统
区(引导扇区、文件分配表或根目录等)。
不
分配那些坏的盘块、磁盘就可以继续使用。
在
文件分配表对应坏盘块的项不能是“0”,一般
也需要特定的数值表示(这个数值应该是盘块
编号以外并且不是结
N
束标志的数值,例如实验
中128~254之间的数值)。
假设试验中模拟磁
盘的筑第13块和第49块已经损坏不能使用,
则在文件分配表的第13项和第14项写入
“254”表示该盘块损坏不能使用。
由于磁盘分配,有时不能预订文件大小,例
如建立文件时并不知道文件大小,因而磁盘的分
配有时是一块一块申请的。
.磁盘空间回收时,整
个文件删除时回收很多块,但有时文件修改时可
图2-5-1分配一个磁盘块的流程图
能会删除某些内容,造成归还磁盘块,这时是一
块一块回收的。
这里给出申请一块磁盘空间的流
程图,若分配多块时,循环多次即可。
分配一个盘块时,不应该从文件分配表第一项查起,因为磁盘中最开始的J几块为系统数据区(引导扇区,文件分配表、根目录等占用)。
所以应该从这之后的可分配数据区开始查询.。
假定系统区域占用了x个盘块,则分配一个磁盘盘块的流程如图2-5-1所示。
回收一个磁盘块的流程图很简单,例如回收磁盘块的块号为x,只要找到文件分配表中第x顶,将第x项的值改为0即可。
(3)目录结构
文件目录是用于检索文件的,是文件系统实现按名存取的主要手段。
文件目录由若干目录项组成,每一个目录记录一个文件的有关招息。
一般地说,目录项应该包括如下内容:
①有关文件的控制信息。
例如,用户名、文件名、文件类型、文件属性。
实验模拟个人计算机上的文件操作。
这部分内容仅包括文件名、文件类型和属性。
②有关文件结构的信息。
例如,文件的逻辑结构、文件的物理结构、记录个数、文件在存储介质的位里等。
实验中,仅仅支持流式文件,不支持记录式文件,所以这部分内容仅仅包括文件在存储介质的位置(分给文件第一个盘块的块号。
即起始盘块号)、文件的长度。
③有关文件管理的信息。
例如,文件的建立日期、文件被修改的日期、文件保留期限和记帐信息等。
实验中为了简单起见,这部分内容都不采用。
因此,实验中文件的目录项包括:
文件名、文件类型,文件属性、文件的起始盘块号、文件的长度。
每个目录项占用8个宁节。
具体结构如下:
文件名:
3个字节(实验中合法文件名仅可以使用字母、数字和除"$"、"."和"/"以外的字符,第一个字节的值为"$"时表示该目录为空目录项,文件们和类型名之间用"."分隔,用"/"作为路径名中目录间分隔符);
文件类型名:
2个字节;1
文件属性:
1字节;
起始盘块号:
1个字节;
文件长度:
1个字节(为了实验的简单,文件长度单位为盘块)。
有了文件目录后,当用户要求使用某个文件时,文件系统可以顺序查找目录项,并比较文件名。
就可以找到指定文件的目录项.根据目录项中有关内容核对使用权限,井读比文件供用户使用。
因此文件目录的组织和管理要便于检索和防止冲突。
在操作系统中目录有根目录和子目录。
因此文件除了需要登记形成目录外,还要登记子目录。
实验中,根目录固定位置、固定大小(可以登记有限个文件或子目录项)、子目录像文件一样。
可使用任何一个空闲磁盘块。
为了实验简单,实验中根目录占用了一个盘块.子目录的长度也是采用可以任意长的方法,而是采用了定长的方法,每个子目录的长度也是一个盘块.只能放8个目录项。
文件和目录的登记项是混在一起的,登记项的结构应该和文件目录一样。
每个目录项占用8个字节,结构如下:
目录名:
3个字节(实验中合法文件名仅可以使用字母、数字和除"$"、"."、"/"以外的字符。
第一个字节的值为"$"时表示该目录为空目录);
未使用2字节(在实验中填写空格);
目录属性:
1个字节;
起始盘块号:
1个字节;
未使用1字节(在实验中填写“0”)。
在目录登记项中,系统为目录名后两个字节(对应文件类名位置)填写空格,目录起始盘块号后1个字节(对应文件长度位置填)填写0。
目录属性和文件属性占用同一个字节,为了区别目录和文件,该字节每一位代表不同的含义(为“1”表示“是”,为“0”表示“否”)。
如图2-5-2所示,第0位表示文件为只读文件,第1位表示文件为系统文件,第2位表示文件为一般可读、可写的普通文件,第3位表示该登记项不是文件的登记顶,而是目录的登记项。
其余几位闲置未用。
如该字节为
表示该目录是一个目录的登记项,该字节为
表示该目录是一个只读系统文件的登记项。
该字节为
表示该目录是一个可读可写的普通文件。
第7位
第6位
第5位
第4位
第3位
第2位
第1位
第0位
未使用
未使用
未使用
未使用
目录属性
普通文件
系统文件
只读文件
图2-5-2属性字节各位作用示意图
常用的目录检索的方法是顺序检索,根据绝对路径名查找文件的方法一般如下:
先找到根目录的起始盘块,一般根目录位置是固定的,实验中就是模拟磁盘的第2块,将该盘块读出;取出路径名中根目录后的目录名或文件名与根目录中}目录项依次比较,比较完一块。
再根据文件分配表找到下一块,再读入比较。
直到找到名字一致的目录项或根目录登记项均已查完为止;若没有找到,则查找失败,结束;若查找的是文件,结束;若查找的是目录,从找到的目录项中,取出目录的起始盘块号。
读入此盘块,然后用上述相同的查找方法继续查找找。
直到找到该文件(或目录)或查找失败结束。
实验中,使用绝对路径查找文件(或目录)的流程如图2-5-3所示。
查找文件除了使用绝对路径名外,还可以使用相对路径名。
相对路径名是从当前目录出发到指定文件的路径。
如果文件(或目录)在当前目录下,使用相对路径名查找速度比较快。
和绝对路径的查找方法一样,只是查找的起点是当前目录,不是根目录。
实验中只使用了绝对路径名。
(4)文件操作
确定文件组织结构、目录结构和磁盘空间管理的方法后。
就可以模拟文件操作的实现。
实验中文件操作包括建立文件(create_file)、打开文件(open_file)、关闭文件(close_file)、读文件(read_file)、写文件(write_file)、删除文件(delete_file)、显示文件内容(typefile)和改变文件属性(change),目录命令包括建立目录(md)、显示目录内容(dir)和删除空目录(rd)。
在实验中没有程序调用这些指令,为了看到它们的摸拟情况,从键盘输入选择指令来模拟用户程序的调用。
表2-5-2打开文件表结构
首先要建立一个“已打开文件表”,该表用来记录打开或建立文件的相关内容、结构如表2一5一2所示。
文件路径名
文件属性
起始盘块号
文件长度
操作类型
读指针
写指针
块号
块内地址
块号
块内地址
…
…
…
…
…
…
用数组模拟已打开文件表,数据结构定义如下:
#definen5//试验中系统允许打开文件的最大数量
typedefstruct
{
intdnum;//磁盘盘块号
intbnum;//磁盘盘块内第几个字节
}pointer;//已打开文件表中读、写指针的结构
typedefstruct
{
charname[20];//文件绝对路径名
charattribute;//文件的属性,用1个字节表示,所以采用char类型
intnumber;//文件起始号
intlength;//文件长度,文件占用的字节数
intflag;//操作类型,用“0”表示以读操作方式开文件,用“1”表
//写操作方式打开文件
pointerread;//读文件的位置,文件打开时dnum为文件起始盘块号,bnum
//为“0”
pointerwrite;//写文件的位置,文件刚建立时dnum为文件起始盘块号,bnum
//为“0”,打开文件时dnum和bnum为文件的末尾位置
}OFFILE;//已打开文件表项类型定义
struct
{OFFICEfile[n];//已打开文件登记表
intlength;//已打开文件登记表中登记的文件数量
}openfiles;//已打开文件登记表定义
无论上述哪种文件操作都会涉及到己打开文件表。
对于已打开文件表主要是查找、删除和插入操作。
下面给出这三种操作的流程图,在己打开文件表中查找某文件是否存在的流程
如图2-5-4所示,将某文件从已打开文件表中删除的流程如图2-5-3所示,将某个文件登记在已打开文件表的流程图如图2-5-6所示。
(1)建立文件(create_file)
用户要把一个新文件放到存储介质上
前,首先调用文件系统的“建立”操作。
“建立文件”的主要工作就是检查文件目录,确认无重名文件后,寻找空闲登记项进行登记;寻拢空闲存储块(至少一块)以备存储文件信息或存放索引表,最后填写已打开文件表。
实验中需要的参数比较少,只要有文件名、文件属性即可。
如cream_file(文件名,文件属性)。
实验中,建立文件时给出文件名和文件属性,文件属性如果是只读性质则不能建立;文件建立时根据给定的文件路径名进行查找,如果父目录不存在。
建立文件失败;如果存在,查看有无重名文件。
如果有,则提示该文件已存在,建立文件失败;如无重名文件,则为该文件建立文件目录。
并分配一个磁盘块;最后填写目录和已打开文件表。
建立文件的流程如图2-5-7所示。
(2)打开文件(open_file)
用户要求使用一个已径存在的文件时,首先执行“打开文件”操作。
实验中,所需参数有文件名、操作类型(读或写),open_file(文件名、操作类型)。
打
开文件时,首先要检查该文件是否存在,不存在,打开失败。
如果文件存在,还要检查打开
方式。
确保不能以写方式打开只读文件;最后填写已打开文件表,若文件已经打开则不需要填写已打开文件表,打开文件的流程如图2-5-8所示。
(3)读文件(read_file)
用户要求读文件信息时调用文件系统的"读文件"操作。
实验中,读文件的参数只需要文件名和读取长度。
如read_file(文件名、读取长度)。
因为采用的是流式文件结构,所以读的长度用字节表示。
实验中,读文件操作的主要工作是查找已打开文件表中是否存在该文;如果不存在,不能读;然后检查是否以读方式打开文件,如果是以写方式打开文件。
则不允许读;最后从已打开文件表中读出读指针,从这个位置上读出所需要长度,若所需长度没有读完已经遇到文件结束符。
就终止读操作。
实验中用“#”表示文件结束,读文件的流程如图2-5-9所示。
(4)写文件(write_file)
用户要求存取文件信息时调用文件系统的“写文件”操作。
实验中,写文件的参数只需要文件名、存放准备写人磁盘信息的缓冲和写的长度,知write_file(文件名,缓冲,写长度)。
因为采用的是流式文件结构.所以写长度用字节表示。
实验中,写文件操作的主要工作是查找已打开文件表中是否存在该文件,如果不存在,不能写;如果存在,还要检查是否以写方式打开文件:
如果不是以写方式打开文件,则不能写;最后从已打开文件表中读出写指针。
从这个位里上写入缓冲中的数据。
写文件有两种情况,一种情况是建立文件后的写人,这种写比较简单,一边写一边申请空间即可完成;一种情况是文件打开后的写入,这个比较复杂,存在着文件中间修改的问题。
实验中,第二种情况只完成了从文件末尾向后追加的功能,写文件的流程如图2-5-10所示。
(5)关闭文件(close_file)
用户对文件读写完毕后需要调用文件系统的"关闭文件"操作。
实验中,关闭文件的参数只需要文件名,如close_file(文件名)。
在关闭文件时,首先要看该文件是否打开,如果没有打开,就不用关闭;如果已经打开,则检查打开方式,如果是以写方式打开的,要追加文件结束符,修改目录项;最后从已打开文件表中删除对应项,关闭文件的历程图如图2-5-11所示:
(6)删除文件(delete_file)
用户认为文件没有必要保存时需要调用文件系统的“删除文件”操作。
实验中,删除文件时参数只要文件名,如delete_file(文件名)。
实验中,删除文件操作的主要工作是检查文件是否存在;不存在,操作失败;如存在,查找该文件是否打开。
如果打开不能删除;如果没有打开,则删除文件目录项并归还件文件所占磁盘空间,删除文件的流程如图2-5-12所示:
(7)显示文件内容(typefile)
显示文件内容首先要找到该文件的目录登记项,如果文件不存在,指令执行失败;如果存在,查看文件是否打开,打开则不能显示文件内容;若没有打开,从目录中取出文件的起始盘块号,一块一块显示文件内容。
显示文件内容的流程如图2-5-13所示。
指定的文件不存在,显示文件内容失败
(8)改变文件属性(change)
改变文件属性,首先查找该文件,如果不存在,则结束;如果存在,检查文件是否打开,打开不能改变属性;没有打开,根据要求改变目录项中属性值。
实验中,首先要系统初始化,包括建立文件c模拟磁盘、初始化磁盘FAT、初始化根目录为空目录项;然后,可以选择一项功能执行。
目录的操作命令:
1建立目录(md):
建立目录首先要找到建立目录的位置(父目录),然后查找该目录是否存在,如果父目录不存在,不能建立;如果存在,查找时否存在同名目录,如存在,则不能建立;如不存在,则查找一个空目录项,为该目录申请一个盘块,并填写目录内容。
建立目录流程图如图2-5-14所示。
2显示目录内容(dir):
显示目录内容首先要找到该目录,如果目录不存在,指令执行失败;如果存在,则一项一项显示目录内容。
显示目录内容的流程如图2-5-15所示。
3删除空月录(rd):
删除空目录首先要找到该目录,如果目录不存在,指令执行失败:
如果存在,但是根目录或非空目录显示不能删除。
操作失败;若是非空子目录,则删除其目录项并回收对应空间:
删除空目录的过程和删除文件的过程相似,流程可参考文件的删除过程。
另外注意,对磁盘文件进行读操作时,需要磁盘的一个盘块读入内存后才能进行处理;对磁盘文件进行写操作时,要写慢缓冲后才写入磁盘。
所以模拟文件操作时,不能将整个模拟磁盘的内容同时读入内存。
应该当需要模拟磁盘的某个盘块内容时.从对应文件中读出;修改后需要写回模拟磁盘:
实验中就是用这种方法摸拟磁盘的输入/输出。
实验中定义了两个数组buffer1和buffer2模拟缓冲。
实验过程中首先系统化初始化,包括建立文件c模拟磁盘、数尺花磁盘FAT和根目录初始为空目录项,然后选择各个命令进行测试。
六、程序演示
1.程序界面
2.建立文件
建立文件时,首先根据建立要求检查磁盘大小是否满足文件要求;其次,要检查是否有重命名,如果有,则无法创建。
创建成功,文件即会出现在所选磁盘的子目录中,点击显示内容,科在右上菜单中显示文件详细信息。
如果创建时出现重命名,即会创建失败。
3.打开文件
选择好一个文件后,可以执行打开指令,打开文件成功后,即会在右下窗口出现已打开文件的路径信息。
4.关闭文件
5.写文件
首先,对所选文件执行写操作,必须满足条件:
1,该文件可读写;2,该文件已打开。
满足上述条件,即可对所选文件执行写操作。
修改内容后,点击显示内容,即可发现文件内容已变化。
如果不满足条件,则会弹出错误窗口。
6.删除文件
点击是,删除所选文件并归还磁盘空间。
7.显示文件内容
要想显示所选文件内容,文件必须存在且为关闭。
满足条件后点击显示内容,即可在右上窗口查看到所选文件的内容。
8.改变文件属性
要想改变所选文件属性,需满足条件:
1所选文件存在;2所选文件未打开。
满足上述条件,选择需要修改的属性,点击修改属性即可。
9.目录的操作命令(创建目录)
要想建立一个目录,需先找到一个父目录,在此基础上设置目录名和目录大小,点击创建目录即可完成目录的创建。
10.目录的操作命令(显示目录内容)
选择好父目录,点击显示该目录下所有,即可在右上菜单显示该目录下所有文件和子目录的信息
11.文件复制,粘贴(自主加入)
为了使程序功能更加完善,我们小组经过商讨后加入了文件的复制和粘贴指令,这样使得磁盘间的管理更加方便,更加人性化。
要想复制所选文件,只需点击复制,再选择需要该文件的目录下点击粘贴即可。
七、参考程序
八、实验心得
本次课程设计较同时进行的其他两科相比,难度和挑战都要大很多。
由于是第一次尝试课程设计,我们小组遇到了很多问题,其中大多数集中在如何规定所选文件的状态,以及其对文件操作的影响这一问题上,我们寻找了很多例子,讨论了很久,终于在一点点摸索中完成了程序。
过程确实比较坎坷,而且本次课程设计要求的时间颇紧,导致我们原本的很多想法由于时间问题并没有放在作品当中,希望老师理解。
通过本次实验,让我对于本学期学习的知识有了更深的了解,操作系统的意义,它的作用到底为何?
通过本次课程设计,我都有了大概的了解。
同时,通过本次课程设计,增进了我和我队友的友谊,虽然实验过程中有争吵,有讨论,但当真正完成的时候,我们都非常高兴。
最后,真心感谢陈笑蓉老师对于本次课程设计的悉心指导,如果没有老师的督促与帮助,我们确实无法完成这个困难的课程设计。