模拟实现单级目录、单级索引的索引文件系统

合集下载

文件系统管理阶段的特征

文件系统管理阶段的特征

文件系统管理阶段的特征1.引言1.1 概述文件系统是计算机操作系统中的一个重要组成部分,负责管理和组织计算机的文件和目录。

文件系统管理阶段可以理解为对文件系统的不同方面进行管理和操作的阶段。

文件系统管理涉及到物理存储管理、文件目录管理以及文件访问与权限管理等各个方面。

在物理存储管理阶段,主要考虑如何进行存储资源的分配和管理。

文件目录管理阶段则关注如何组织和管理文件和目录的结构。

文件访问与权限管理阶段旨在保护文件的安全性,确保只有授权用户可以进行访问和操作。

在物理存储管理方面,我们需要考虑存储的分配和空间的管理。

存储的分配方式可以分为连续分配、链接分配和索引分配。

连续分配方式将文件连续地存储在存储介质上,链接分配方式则通过链接的方式将文件的不同部分组合在一起,索引分配方式则使用索引表进行存储位置的管理。

另外,还需要考虑如何管理和分配存储空间,一种常见的方式是使用位图法和空闲链表法进行空间的管理。

文件目录管理方面主要关注文件和目录的组织和管理。

单级目录结构将所有的文件和目录都放置在一个层次上,多级目录结构则通过层次结构的方式进行组织,树状目录结构则使用树的方式进行管理,而图状目录结构则使用图的方式进行管理。

每种目录结构都有其优点和缺点,根据实际需求选择合适的目录结构。

文件访问与权限管理是保护文件和信息安全的关键环节。

用户身份验证可以确保只有合法的用户可以进行访问和操作,文件权限控制则可以控制各个用户对文件的访问权限。

这些机制可以帮助保护个人和敏感信息的安全性。

综上所述,文件系统管理阶段涉及到物理存储管理、文件目录管理以及文件访问与权限管理等多个方面。

不同的管理策略和技术可以满足不同的需求和场景,同时也面临着各种挑战和发展趋势。

在未来的研究中,我们可以进一步探索新的管理思路和技术,以提高文件系统的效率和安全性。

文章结构部分的内容如下:1.2 文章结构本文主要探讨文件系统管理阶段的特征。

文章分为以下几个部分:引言:介绍文件系统管理阶段的重要性和研究背景。

第6章 文件系统

第6章 文件系统

• 目的: • (1)提高存储空间的利用率 • (2)提高文件的访问速度
6.3.1
连续分配
• 每个文件分配一组相邻接的盘块,也称物理 顺序文件。 • 主要问题:随着使用,磁盘碎片增多,性能 下降,需要磁盘整理。 • 优点:顺序访问速度快,定位容易,只需记 录第一个簇的位臵。可以通过紧缩 (compact)将外存空闲空间合并成连续的区 域。 • 缺点:需要连续的空间,当文件长度变化难 于处理,即必须事先知道文件的长度。
• (2) 假设索引表采用如下结构:第0~7字节 采用<起始块号,块数>格式表示文件创建 时预分配的连续存储空间,其中起始块号占 4B,块数占2B;剩余504B采用直接索引结 构,一个索引项占6B,则可支持的单个文件 最大长度是多少?为了使单个文件的长度达 到最大,请指出起始块号和块数分别占用字 节数的合理值并说明理由。 • 块数占2B,单个文件的最大长度 • 216×1KB + 504/6 ×1KB=65620KB • <4,4> <1,7> <2,6> <3,5> • 只要块数在4B以上就可以表示连续232个块, 使文件达到最大4TB。
• 关闭:将内存中对应的文件表目复制到外存 目录表中,从内存打开文件表中删除对应的 目录项。 • 3. 其它文件操作 • 以系统调用的形式提供给用户,有: • 1)关于文件属性的操作:改变文件名、改 变文件所有者、改变文件的访问权限等。 • 2)有关目录操作的:创建目录、删除目录 等。 • 3)实现文件共享的操作
索引分配
• 例:某文件系统的最大容量为4TB,以磁盘 块为基本分配单位,盘块大小为1KB。FCB 包含一个512B的索引表区。 • (1)假设索引表区采用直接索引,索引表 区存放文件占有的磁盘块号。索引表项中块 号最少占用多少字节?可支持的单个文件的 最大长度是多少字节? • 磁盘最多盘块数:4TB / 1KB =2 32 • 所以需要4字节存放盘块号。 • 文件最大长度 512/4 ×1KB = 128KB

年国家开放大学电大《操作系统》考试题新

年国家开放大学电大《操作系统》考试题新

年国家开放大学电大《操作系统》考试题新《操作系统》期末复习模拟题一、选择题(选择一个正确答案的代码填入括号中)1.按照所起的作用和需要的运行环境,操作系统属于()。

A.用户软件B.系统软件C.应用软件D.支撑软件 2.为了使系统中所有的用户都能得到及时的响应,该操作系统应该是()。

A.多道批处理系统B.实时系统C.网络系统D.分时系统 3.已经获得除()以外的所有运行所需资源的进程处于就绪状态。

A.CPUB.存储器C.磁盘空间D.打印机 4.在一段时间内,只允许一个进程访问的资源称为()。

A.共享资源B.共享区C.临界区D.临界资源 5.在进程通信中,使用信箱方式交换信息的是()。

A.低级进程通信B.共享内存方式 C.高级进程通信D.管道文件方式 6.作业调度的关键在于()。

A.选择恰当的进程管理程序B.用户作业准备充分 C.选择恰当的作业调度算法D.有一个较好的操作环境 7.作业的生存期共经历 4 个状态,分别是提交、()、执行和完成。

A.开始B.后备 C.等待D.就绪 8.在下列存储管理方案中,未采用动态重定位技术的是()。

A.固定分区B.可变分区 C.页式管理D.请求分页管理 9.在页式存储管理系统中,整个系统的页表个数是()。

A.1 个B.2 个 C.与页面数相同D.和装入主存的进程个数相同 10.文件管理实际上是管理( )。

A.辅助存储空间B.主存空间 C.物理地址空间D.逻辑地址空间 11.数据库文件的逻辑结构形式是()。

A.只读文件B.记录式文件 C.流式文件D.档案文件 12.下列有关通道的叙述中,不正确的是()。

A.编制好的通道程序是存放在主存中的 B.通道是处理输入、输出的软件 C.所有外围设备的启动工作都由系统统一来做D.来自通道的 I/O 中断事件由设备管理负责处理 13.设备的打开、关闭、读、写等操作是由()完成的。

A.用户程序B.编译程序 C.设备驱动程序D.设备分配程序 14.CPU 的处理速度远远高于打印机的打印速度,为了解决这一矛盾,可采用() A。

OSUNIT 文件系统的实现

OSUNIT 文件系统的实现
1. 单级目录结构 文件系统中只设置一个目录,它包含了该文件系统中的所有文件的目录项,要查找任一文
件都需要在该目录中
进行线性检索。 单级目录结构的特点是实现简单,但当目录中含有大量目录项时,要查找一个文件相当费
时,且它无法解决文件重名问题,这对用户是很不方便的。因此,这种目录结构只用在单用户 环境中。
文件的物理组织 文件目录的结构 文件的共享 磁盘空间的管理 文件的访问控制 文件系统的注册与挂载 内核的文件管理机制
§1 文件的物理组织
◆连续结构 ◆链接结构 ◆索引结构
一个文件的空间在逻辑上可看成是连续的,即一个文件由若干连续的盘块所组成。但在磁 盘上可以有多种方式来组成一个文件,换言之,文件有多种物理的存储结构,常用的是:连 续结构、链接结构、索引结构。
USER2的UFD

… 图9-6 二级目录结构
普通文件 … …
一个MFD和若干并列的UFD便构成了二级目录结构。当要访问一个文件时,先根据用户名 检索MFD,找出相应的UFD;再用文件名检索UFD,找出对应的FCB,从而就可以得到文件 的具体物理地址。
二级目录结构基本上克服了单目录结构的缺点,其优点如下:
一个目录由若干等长的目录项(记录)组成,目录本身也作为文件来处理,它是一种等长 记录式文件。
目录项的组成有两种方式:FCB目录项和名号目录项。
1. FCB目录项 这是简单直观的目录项组成方式,目录项就是FCB,即一个目录由若干顺序排列的FCB所
构成。当用路径名和文件名访问某个文件时,文件系统对目录进行线性检索,找到文件名对 应的FCB,就可获取该文件的物理位置等信息,完成文件名到文件物理位置的映射。
文件的物理存储结构决定了文件的逻辑地址空间到文件的物理地址空间的映射方法。

文件管理单元

文件管理单元

文件管理部分1.某文件系统采用单级索引文件结构,假定文件索引表的每个表项占3个字节,即用3个字节存放一个磁盘块的块号,每个磁盘块的大小为512B。

试问:(1)该文件系统能支持的最大文件大小是多少字节?能管理的最大磁盘空间是多大?(2)若采用2级或3级索引,该文件系统能支持的最大文件大小是多少字节?能管理的最大磁盘空间是多大?提示:文件大小和文件使用的磁盘块有关系。

最大磁盘空间和能划分出的磁盘块总数有关系。

(1)磁盘块为512B,每个索引表项占用3B,所以可以存储表项共:512/3=170个。

每一个表项对应一个物理块,因此该文件系统可以支持的最大文件为:170*512B=87040B=85KB 因为3个字节有24位,所以能识别出的磁盘块总数为224个,能管理的最大磁盘空间是:224*512B=8GB。

(2)若采用二级索引,最大文件则是:170*170*512B=14450KB≈14.11MB由于能识别的磁盘块总数不变,能管理的最大磁盘空间不变,仍为8GB。

若采用三级索引,最大文件则是:170*170*170*512B=2456500KB=2398.93MB同样,由于能识别的磁盘块总数不变,能管理的最大磁盘空间不变:8GB2.某文件系统空间的最大容量为4TB(1TB=240B),以磁盘块为基本分配单位,磁盘块大小为1KB。

文件控制块(FCB)包含一个512B的索引表区。

假设索引表区仅采用直接索引结构,索引表区存放占用的磁盘块号。

求:(1)索引表项中块号最少要占用多少字节?(2)该文件系统可支持的单个文件最大长度是多少字节?提示:块号和块的个数相关(1)总磁盘块数=总容量/磁盘块大小=(4*240)/(1*210)=232(个)。

因此磁盘块号需要32个二进制位来表示,索引表项占(32/8)B=4B。

(2)直接索引的个数为512/4=128(个),因此可支持的单个文件大小为128*1KB=128KB。

3、在Linux系统中有一个文件/home/a.txt,其inode号及访问权限如图1所示,请给出用户root读取该文件的过程。

《计算机操作系统》课件第9章 (2)

《计算机操作系统》课件第9章 (2)

第9章 文件管理
记录式文件是指文件由若干记录组成,每个记录可赋予 一个标识,称为键,记录式文件又可分为可变长记录文件和 定长记录文件。
描述文件的逻辑结构时要包括对文件的存取方法的定义。 用户对不同逻辑结构的文件采用不同的存取方法,以便对文 件进行各种操作。常用的存取方法有顺序存取、随机存取和 按键存取三种方法。
(2) 把一个文件划分成几个能独立存取的顺序子文件, 这样,各个顺序子文件只需占用相对较少的连续磁盘块,容 易得到满足。由于各顺序子程序是可独立存取的,所以,经 这样划分后的文件结构,本质上仍是顺序文件。
第9章 文件管理
2. 链接结构 把逻辑文件中的各个逻辑记录任意存放到一些磁盘块中, 这些磁盘块可以分散在磁盘的任意位置。例如,有5个逻辑 记录的某文件,存放到磁盘上需占用5个磁盘块,这五个磁 盘块的块号可以是9,16,1,10,25。于是,顺序的逻辑记 录被存放在非顺序的磁盘块上。如果用指针把这些磁盘块按 逻辑记录的顺序链接起来,则形成了文件的链接结构,把链 接结构的文件称为“链接文件”或“串联文件”。
第9章 文件管理
9.1 文件和文件系统 9.2 文件结构 9.3 文件存储空间的管理 9.4 文件目录管理 9.5 文件的共享和保护 9.6 文件操作和使用 9.7 文件管理实现举例 习题
第9章 文件管理
9.1 文件和文件系统
9.1.1 文件
文件是在逻辑上具有完整意义的信息的集合,它以是实现非连续存储的另一种方法,索引结构为 每个文件建立一张“索引表”,在索引表中记载每个逻辑记 录的存放位置的指针。通常,把索引表保存在某个磁盘块中, 文件目录中指出索引表的存放位置。采用索引结构的文件称 为“索引文件”。 索引表中的每个表项指出一个逻辑记录的存放位置,可 以按逻辑记录的顺序登记在索引表中。这样,第i个表项就表 示了第i个逻辑记录所在的位置。当索引表中的表项数大于逻 辑记录个数时,可用特殊字符(比如“-1”)表示无效登记项。

填空题题库资料

填空题题库资料

填空题题库1.将逻辑地址转换为____________ 地址的过程称为地址重定位。

2.一次仅允许一个进程访问的资源称为 ____________________ 。

3.存储管理的四大功能是内存的分配与回收、扩大内存空间(即建立虚拟存储器)、实现地址变换和 ____________________________ 。

4.操作系统为用户提供的两大级别的接口是操作级(如操作命令)和5.从作用范围上划分,线程可以分为 ______________________ 和____________________ 两种。

6.一个作业从它进入系统处入后备状态开始,到它运行完毕,一般划分为二级调度,它们分别是__________________ 和 ______________________ 。

7.磁盘空闲块可以按____________________ 、空白块链和位视图三种方法来组织。

8.进程调度的两种方式是 __________________ 和不可剥夺式。

9.在动态分区存储管理中,所谓最先适应算法是将自由空闲区按起始地址次序排列。

10.文件的物理结构可以分为连续、串联和_________________ 等三大类文件结构。

11.一次仅允许一个进程执行的程序称为_______________________ 。

12.产生死锁的必要条件是互斥、部分分配、 ________________________ 和不可剥夺。

13.文件的逻辑结构可分为无记录的流式文件和 ______________________ 。

14.解决死锁问题的方法包括 _________________ 、避免、检测和死锁的解除。

15.UNIX 的文件类型可分为______________________ 、目录文件、字符特殊文件或块特殊文件。

16.在一个单处理机系统中,若有3 个用户进程,CPU 当前时刻为用户态,则处于就绪状态的用户进程最多有 _____________________________ 个。

文件系统索引结构 -回复

文件系统索引结构 -回复

文件系统索引结构-回复什么是文件系统索引结构?文件系统索引结构是用于组织和管理存储设备上文件和目录的数据结构。

它是文件系统的核心组成部分,用于快速定位和访问文件数据。

索引结构将文件和目录的逻辑信息映射到物理存储设备,使得文件系统能够高效地操作数据。

文件系统索引结构的目的是提高文件系统的性能和可靠性。

通过合理的索引结构设计,文件系统可以快速定位和访问文件数据,提高文件的读写速度。

同时,索引结构还可以帮助文件系统实现数据的安全、保护和恢复功能,提高文件系统的可靠性。

不同的文件系统可以采用不同的索引结构,每种结构都有其优势和适用场景。

下面将介绍几种常见的文件系统索引结构。

1. 位图索引结构(Bitmap Indexing):位图索引结构以位图的形式表示文件和目录在存储设备上的位置。

位图中的每一位对应一个存储块,用来表示该块是否已被使用。

位图索引结构简单有效,适用于小型文件系统;但是随着文件数量的增加,位图的大小也会增加,导致索引结构的性能下降。

2. 列表索引结构(Linked Indexing):列表索引结构将文件和目录的数据块按照顺序链接起来,每个块中记录了下一个块的地址。

这样可以通过遍历链表来访问文件的所有数据块。

列表索引结构适用于顺序访问较多的文件,但是随机读取的性能较低。

3. 哈希索引结构(Hash Indexing):哈希索引结构使用哈希函数将文件和目录的逻辑信息映射到存储设备上的位置。

哈希索引结构可以快速定位和访问文件数据,适用于大规模文件系统。

但是哈希索引结构会带来哈希冲突的问题,可能导致性能下降。

4. B+树索引结构(B+ Tree Indexing):B+树索引结构是一种多叉树结构,用于有序存储和访问文件和目录的数据块。

B+树索引结构具有较好的平衡性和扩展性,能够提高文件系统的读写性能。

大部分现代文件系统都采用B+树索引结构作为其核心索引结构。

5. 多级索引结构(Multi-level Indexing):多级索引结构将索引分为多个层次,每个层次的索引记录了下一层次的索引位置。

操作系统第6章 文件管理(文件目录与目录文件)

操作系统第6章 文件管理(文件目录与目录文件)

2015/11/7
2
内容提纲
一 文件目录管理
二 文件共享与文件保护1/7
3
一 文件目录管理
一 文件目录管理
【一】目录管理的基本功能
1.实现“按名存取”,目录管理中最基本的功能之一是通过提供的 访问文件名,便客快速准确地找到指定外存上的文件存储位置。 2.快速检索文件目录。通过合理地组织目录结构的方法,可加快对 目录的检索速度,从而提高对文件的存取速度。这是在设计一个 大、中型文件系统时所追求的主要目标。 3.实现文件共享。在多用户系统中,通过保留在外存中的副本,供 不同用户使用,以节省大量的存储空间,提高文件利用率。 4. 文件重名。系统允许在不同级别的目录中,命名相同的文件名。
2015/11/7
17
一 文件目录管理
【八】多级目录
●对于大型文件系统,通常采用三级或三级以上的目录结构,以提高对目 录的检索速度和文件系统的性能。多级目录结构又称为树型目录结构, 主目录称为根目录,把数据文件称为树叶,其它的目录均作为树的结 点。图2中,方框代表目录文件,圆圈代表数据文件。在该树型目录结 构中,主(根)目录中有三个用户的总目录项A、B和C。在B项所指出的B 用户的总目录 B中,又包括三个分目录 F、E和D,其中每个分目录中又 包含多个文件。如B目录中的 F分目录中,包含 J和N两个文件。为了提 高文件系统的灵活性,应允许在一个目录文件中的目录项既是作为目 录文件的 FCB,又是数据文件的 FCB,这一信息可用目录项中的一位来 指示。例如,在图3中,用户 A的总目录中,目录项 A是目录文件的 FCB, 而目录项B和D则是数据文件的FCB。
2. 优点:易于理解实现和维护;
3. 问题:划分要考虑到如果分层太少,连接与访问简 单,但每层内容复杂;分层太多,形成的参数太 多,传递速度慢。 4. Madnick 把文件系统画分为8层,如下图1所示

操作系统_苏州大学中国大学mooc课后章节答案期末考试题库2023年

操作系统_苏州大学中国大学mooc课后章节答案期末考试题库2023年

操作系统_苏州大学中国大学mooc课后章节答案期末考试题库2023年1.以下有关内核线程的论述,正确的是()。

参考答案:内核线程由内核进行创建和撤销_内核线程由内核完成线程调度_内核线程由内核管理2.引入线程后,处理机只在线程间切换。

参考答案:错误3.Java中的线程有四种状态,分别是:可运行(Runable)、就绪(Ready)、阻塞(Blocked)、死亡(Dead)。

参考答案:错误4.程序开发者必须创建一个线程去管理内存的分配。

参考答案:错误5.Unix的exec创建的进程可以和创建它的父进程共享各类资源,从而使得它的创建、切换成本较低。

参考答案:错误6.为了照顾紧迫型进程,应采用()调度策略。

参考答案:PR7.可能存在饥饿问题的调度算法有()。

参考答案:PR_SJF8.在页式存储管理中,引入快表可以减少每一次的内存访问时间。

参考答案:错误9.用户程序中使用的从零地址开始的地址编号是逻辑地址。

参考答案:正确10.内存管理的目的是()。

参考答案:进行存储保护_提高内存数据访问的速度_提高内存利用率11.离散内存分配技术包括()。

参考答案:段页式_分段_分页12.存在外碎片的存储管理方式有()。

参考答案:可变分区分配_段式存储管理13.把内存中暂时不能运行的进程或者暂时不用的程序和数据,调出到外存上的备份区,以便腾出足够的内存空间,再把已具备运行条件的进程或进程所需的程序或数据,调入内存。

这种技术是()。

参考答案:交换14.一个32位地址的计算机使用两级页表。

虚拟地址被分成9位的顶级页表域、11位的二级页表域和一个偏移量,页面大小是()。

参考答案:4KB15.分页存储管理中的页表由()建立参考答案:操作系统16.TLB在计算机系统中是用于()。

参考答案:地址变换17.在页式存储管理中,为了实现主存的空间分配,应设置()。

参考答案:页表18.在RR算法中,时间片越小越好。

参考答案:错误19.SJF算法可以获得最小的响应时间。

计算机操作系统之文件管理PPT课件

计算机操作系统之文件管理PPT课件
计算机操作系统之文件管理PPT课 件
目录
• 文件管理概述 • 文件存储与访问方法 • 文件目录管理 • 文件共享与保护机制 • 文件系统性能优化策略 • 典型文件系统案例分析 • 总结与展望
01
文件管理概述
文件概念及作用
文件定义
文件是计算机中存储数据的基本单 位,具有名称、内容和属性等特征。
文件作用
链接分配方式
01
02
03
原理
采用离散分配方式,通过 链接指针将文件的所有盘 块链接在一起。
优点
消除了外部碎片,提高了 磁盘空间利用率;易于文 件扩展。
缺点
只支持顺序访问,不支持 直接访问,数据块的链接 指针会占用一定的存储空 间。
索引分配方式
01 02
原理
系统为每个文件分配一个索引块(表),再把分配给该文件的所有盘块 号都记录在该索引块(表)中,用户要访问文件的第i个盘块时只要根 据索引表找到第i个盘块的盘块号即可。
Ext4在性能和稳定性方面进 行了优化,提供了更高的文 件读写速度和更好的数据一 致性保证。
Ext4能够处理超大文件和超 大容量磁盘,满足了现代存 储需求。
Ext4支持权限控制、加密、 压缩等高级功能,提供了全 面的数据管理解决方案。
Ext4可以在多种Linux发行 版和其他类Unix系统上使用, 具有良好的跨平台兼容性。
07
总结与展望
课程总结回顾
文件系统基本概念
介绍了文件、目录、路径等基本概念,以及文件系统的层次结构和 基本功能。
文件操作与管理
详细讲解了文件的创建、打开、读写、关闭等操作,以及文件的备 份、恢复、加密等管理方法。
文件系统实现技术
深入探讨了文件系统的数据结构、存储管理、并发控制等实现技术, 以及不同文件系统类型的特点和适用场景。

虚拟文件系统的实现-FAT方案

虚拟文件系统的实现-FAT方案

虚拟文件系统的实现-FAT方案摘要: 本文简单介绍了磁盘文件格式FA T及其他相关背景和算法,并采用FA T方案实现单卷、单级目录的虚拟文件系统。

描述了整个程序的基本思路模块划分、流程图及代码的实现。

主题词: 文件文件系统FA T 虚拟磁盘真实磁盘一.相关背景1.1 相关概念,相关算法文件是操作系统提供的、在用户观点中其内容具有连续顺序关系的最大外存逻辑数据空间。

文件系统是操作系统提供的实现对外存文件的管理。

文件系统内部实现的主要区别有:单级目录或多级目录、单卷或多卷、连续分配或不连续分配。

在不连续分配的背景下主要有链接定位方式下的文件内地址映射机制和索引定位。

FAT(file allocation table)采用“文件分配表”方式,是链接定位技术的一个重要变种。

1.2 设计环境、设计工具整个程序采用C语言在Windows XP下使用Microsoft V isual 2003进行设计。

二.设计思路和总体流程图2.1基本思路整个磁盘采用单卷、单级目录FA T方案,在真实磁盘建立一个文件作,并根据用户要求的大小申请空间,实现基本的磁盘文件操作。

例如对文件进行建立、复制、浏览、重命名等操作。

并能够对虚拟磁盘进行格式化,能够与真实磁盘进行文件交换。

整个虚拟文件系统是一个可以使用的文件系统,里面存放的文件信息都是真实有效的,管理程序可以管理多个虚拟文件系统。

2.2 本系统支持的主要命令del 删除文件 format 格式化虚拟磁盘dir 显示文件信息 help 显示帮助cat 显示文件内容 icopy 真实磁盘向虚拟磁盘拷贝copy 虚拟磁盘内拷贝 ocopy 虚拟磁盘向真实磁盘拷贝exit 退出 rename 文件重命名fatinfo 显示FAT表内容 showdisk 显示虚拟磁盘信息2.3 数据结构定义FCB //文件控制块//char name[13]; //文件名//int startblock; //起始块//long size; //文件大小//int status; //FCB状态//DISKunsigned long disksize; //磁盘大小//unsigned int blocksize; //块长4096//unsigned int blocks; //总块数//unsigned int FATblocks; //FAT块数1-32//unsigned int dirblocks; //目录区块数33-34 //unsigned int datablocks; //文件数据区块数//unsigned int idleblocks; //空闲块数//unsigned int files; //文件数//unsigned long freesize; //可用空间//unsigned int realfiles; //有效文件数//unsigned int fcbsnum; //最大目录数//FATint fats;DISKINFODISK disk;FCB *fcbs;FAT *fat;2.4 虚拟磁盘总貌图1.1所示为虚拟磁盘总貌,盘卷总信息存放DISK结构体,FAT表区存放FAT结构体,目录区存放FCB结构体。

目 录 管 理

目 录 管 理
子目录5
2021年1月27日星期三
2.通用图目录结构
root
zhang
liu
link
2021年1月27日星期三
1.5 目录的查询
如果用户要访问一个已存在的文件时, 系统先根据用户提供 的用户名对目录进行查询,找到该文件对应的索引结点(UNIX); 然后根据索引结点所记录的文件物理地址,即盘块号,换算出文 件在磁盘上的物理位置;最后由磁盘驱动程序,将所需的文件读 入到内存。
2021年1月27日星期三
在树形目录中,用户提供的 文件名是由多个文件分量名组成 的路径名,此时需对多级目录进 行查找。假定用户给定的文件路 径名是/usr/ast/mbox,查找 /usr/ast/mbox文件。具体查找过 程如图所示:
(1) 在根目录表中查找usr目录
2021年1月27日星期三
一般情况下,对目录进行查询有两种:线性检索和hash方法。
2021年1月27日星期三
1.线性检索法 线性检索法又称为顺序检索法。在单级目录中,利用用户提供
的文件名,用顺序查找法直接从文件目录中找到指定文件名文件的目 录项。由于单级目录在整个文件系统中只存在一张目录表,目录表项 就是索引结点表,即用顺序法在这张目录表查找指定文件名文件的目 录项,找到后从对应的索引结点表读出。
2021年1月27日星期三
单级目录结构
单级目录能够实现安明存取,而且实现简单。但是存在明显缺点: (1)不允许文件重命名。 (2)文件查找速度慢。
2021年1月27日星期三
1.3 两级目录
两级目录是把记录文件的目录分为两级。它由一个主文件目 录(master file directory,MFD)和其所管辖的若干个用户文 件目录(user file directory,UFD)组成。主文件目录中的每 一栏说明了用户文件目录的名字、大小及所在物理位置;而用户 文件目录的每一栏说明一个用户文件的全部控制信息,包括相应 的文件的存储地址,如图所示。

文件管理实验报告

文件管理实验报告

昆明理工大学信息工程与自动化学院学生实验报告(2012 —2013 学年第二学期)课程名称:操作系统开课实验室:年月日一、实验目的用C或C++语言编写和调试一个简单的文件系统,模拟文件管理的基本功能。

从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。

二、实验原理及基本技术路线图(方框原理图)用C模拟实现文件系统的管理;要求设计一个多级目录结构的文件系统,能正确描述文件控制块,采用合理的外存分配方式,能实现基本的目录及文件的操作,包括创建、删除、重命名、复制、移动等功能,并对文件有一定的存取权限控制。

文件通常存放在外存(如磁盘、磁带)上,可以作为一个独立单位存放和实施相应的操作(如打开、关闭、读、写等)。

为了加快对文件的检索,往往将文件控制块集中在一起进行管理。

这种文件控制块的有序集合称为文件目录。

文件控制块就是其中的目录项。

下图示例一种目录的组织形式。

模拟一个文件系统,包括目录文件,普通文件,并实现对它们的一些基本操作。

假定每个目录文件最多只能占用一个块;一个目录项包括文件名(下一级目录名),文件类型,文件长度,指向文件内容(下一级目录)的指针内容。

普通文件可以只用目录项(FCB)代表。

三、所用仪器、材料(设备名称、型号、规格等)。

计算机一台四、实验方法、步骤//利用交互式命令实现树型目录结构和文件管理,同时利用位示图表示外存的分配情况,新建文件时分配必要的空间,模拟文件分配表记录文件在外存上的存储方式。

了解系统对文件的操作。

//在文件中保存目录内容,创建文件或子目录可以用命令行命令:MD、CD、RD、MK(创建文件)、DEL(删除文件)和DIR#include<iostream>#include<stdlib.h>#include<time.h>#include <locale.h>using namespace std;#define beginsize 5#define LENGTH 3typedef struct{i nt data[LENGTH];}Indireone;typedef struct{I ndireone * first[LENGTH];}Indiretwo;typedef struct{I ndiretwo * second[LENGTH]; }Indirethree;typedef struct Node{i nt begin[beginsize];I ndireone * one;I ndiretwo * two;I ndirethree * three;}Mixtab;typedef struct NODE{c har name[50];i nt type;//是文件还是目录i nt size;//如果是文件给出大小s truct NODE *next;//兄弟结点s truct NODE * sub;//子节点s truct NODE * father;//父亲节点M ixtab * table;}FCB;//文件控制块FCB * root;FCB * present;FCB * finding;char stringname[300];int Bitmap[16][16];//位示图int leftbit=0;void Initall(){i nt i,j;s rand( time(NULL) );f or(i=0;i<16;i++){//初始化位示图for(j=0;j<16;j++){Bitmap[i][j]=rand()%2;}}r oot=(FCB *)malloc(sizeof(FCB)); s trcpy(root->name,"\\");r oot->type=0;r oot->size=0;r oot->next=NULL;r oot->father=root;r oot->sub=NULL;f or(i=0;i<16;i++){for(j=0;j<16;j++){if(Bitmap[i][j]==0){leftbit++;}}}}//判断分配外存时候是不是足够int Judgeenough(int n){i f(leftbit>=n)return 1;e lse return 0;}//添加时候用void Addpoint(FCB * f){F CB * temp;i f(present->sub==NULL){present->sub=f;}e lse{temp=present->sub;while(temp->next!=NULL){temp=temp->next;}temp->next=f;f->next=NULL;}}//删除时候用void Delpoint(FCB *f){F CB * temp=present->sub;i f(temp==f){present->sub=temp->next;delete(f);}e lse{while(temp->next!=f){temp=temp->next;}temp->next=f->next;delete(f);}}//查找是不是已经存在int Isexist(char ary[],int x){F CB * temp;i f(present->sub==NULL){return 0;}e lse{temp=present->sub;while(temp!=NULL){if((!strcmp(temp->name,ary))&&(temp->type==x)){finding=temp;return 1;}temp=temp->next;}return 0;}}void Mdlist(){c har listname[50];c in>>listname;F CB * temp;i f(Isexist(listname,0)){cout<<"子目录或文件"<<listname<<"已存在。

杭州电子科技大学 计算机操作系统 模拟试卷B 含答案

杭州电子科技大学 计算机操作系统 模拟试卷B 含答案
(1)该系统中,一次访存的时间下限和上限各是多少?(给出计算过程)
(2)若已经先后访问过0、2号页面,则虚地址1565H的物理地址是多少?(给出计算过程)
7、(7分)某文件系统采用索引文件结构,假定文件索引表的每个表项占3个字节,存放一个磁盘块的块号(磁盘块的大小为512B)。试问
(1)该文件系统能管理的最大文件是多少字节?
(6)______________。
4、某时刻系统的资源分配图如下图所示,请判断系统是否发生死锁(7)_________(填“已发生”或“未发生”)
5、在Linux系统中,以(8)_________方式访问设备。
6、设有8页的逻辑空间,每页有1024字节,它们被映射到32块的物理存储区中,那么逻辑地址的有效位是(9)___________位,物理地址至少是(10)___________位。
1、进程在三个基本状态转换中,由执行到(1)________是由进程调度所引起的;由执行到(2)________是正在执行的进程发生了某事件,使之无法执行而暂停的。
2、Linux文件系统对文件具有(3)_____、(4)______和(5)_______操作权限。
3、若信号量S的初值定义为10,则在S上调用了16次P操作和15次V操作后S的值应该为
1、以下哪一项不是实现分时系统必须采用的技术()
A.时钟中断;B.人机交互;C.多道程序设计;D.虚拟内存管理
2、并发性与并行性的区别在于()
A.并发性是指两个或多个事件在同一时间间隔发生;
B.并行性是指两个或多个事件在同一时间间隔发生;
C.并发性是指两个或多个事件在同一时刻发生;
D.并发性是指进程,而并行性是指线程
15、下列不属于Linux文件类型的是()。

文件系统索引结构

文件系统索引结构

文件系统索引结构什么是文件系统索引结构?为什么需要文件系统索引结构?常见的文件系统索引结构有哪些?它们之间有何区别和优缺点?本文将以这些问题为主题,详细介绍文件系统索引结构。

一、什么是文件系统索引结构?文件系统索引结构是指在计算机文件系统中用于管理和组织文件的一种数据结构。

它通过建立索引以实现快速查找文件和访问文件内容的目的。

通常,文件系统索引结构用于存储文件的元数据(如文件名、文件大小、创建时间等),并记录文件在磁盘上的物理位置,以便操作系统能够准确找到存储文件的位置。

二、为什么需要文件系统索引结构?文件系统索引结构的出现是为了提高文件系统的访问和检索效率。

在没有索引结构的情况下,操作系统需要逐个扫描磁盘上的数据块,直到找到目标文件。

这样的方式效率低下,尤其是在大量文件存在的情况下。

通过引入索引结构,可以将文件的元数据和物理位置信息组织起来,从而提高文件的访问速度和系统的整体性能。

三、常见的文件系统索引结构有哪些?1. 单级目录结构单级目录结构是最简单的索引结构形式,它将所有的文件都放置在同一个目录下。

操作系统通过文件名来查找文件,并直接访问该文件的物理位置。

这种结构的优点是简单易于实现,但在大规模文件系统中会面临扩展性和性能问题,因为所有的文件都在同一个目录下,查找效率较低。

2. 多级目录结构多级目录结构采用了层次结构的方式来组织文件。

一个目录下可以包含多个子目录,每个子目录下又可以包含其他子目录或文件。

操作系统根据文件的完整路径来查找文件,并通过路径中的目录层次关系来定位文件的具体位置。

多级目录结构提高了文件的查找效率和组织性,但当目录层次过多时,可能会导致路径过长和目录遍历效率下降的问题。

3. 索引节点(inode)结构索引节点结构是一种常见的文件系统索引结构。

每个文件在磁盘上都有一个对应的索引节点,索引节点中存储了文件的元数据和物理位置信息。

文件系统通过索引节点来查找和访问文件,而不需要通过目录层次关系来定位文件。

文件系统实验报告

文件系统实验报告

文件系统实验报告实验四文件系统实验一.目的要求1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。

从而对各种文件操作命令的实质内容和执行过程有比较深入的了解。

2、要求设计一个n个用户的文件系统,每次用户可保存m 个文件,用户在一次运行中只能打开一个文件,对文件必须设置保护措施,且至少有Create、delete、open、close、read、write等命令。

二.例题:1、设计一个10个用户的文件系统,每次用户可保存10个文件,一次运行用户可以打开5个文件。

2、程序采用二级文件目录和用户文件目录。

另外,为打开文件设置了运行文件目录。

3、为了便于实现,对文件的读写作了简化,在执行读写命令时,只需改读写指针,并不进行实际的读写操作。

4、算法与框图:①因系统小,文件目录的检索使用了简单的线性搜索。

②文件保护简单使用了三位保护码:允许读写执行、对应位为1,对应位为0,则表示不允许读写、执行。

③程序中使用的主要设计结构如下:主文件目录和用户文件目录打开文件目录文件系统算法的流程图如下:三. 实验题:1、增加2~3个文件操作命令,并加以实现。

#include#include#include#include#define MAXSIZE 100#define ADDSIZE 50#define PT elem+l-> length#define N 4typedef struct term{/*班级和学期的结构体*/char class1[10];char term1[10];}term;typedef struct student{/*学生成绩信息的结构体*/ term st;/*班级和学期结构体放于此结构体中*/ char num[10];char name[12];float course[4];float total;float average;int bit;}lnode,*stu;typedef struct{lnode *elem;/*指向上个结构体的指针*/int size;/*最大能放lnode结构体成员的个数*/ int length;/*当前长度*/}sqack,*sq;sqack *l;void init/*动态分配存储空间*/{l-> elem=malloc);l-> length =0;l-> size=MAXSIZE;}void input/*输入学生的信息*/{lnode *newbase,*p;char cla[10],ter[10],ch;int n,i;if{newbase=realloc*sizeof);/*追加存储空间*/ l-> elem =newbase;l-> size +=ADDSIZE;}p=l-> elem;do{printf;gets;gets;printf;scanf;printf;for{scanf;strcpy;strcpy;++l-> length ;}printf “);ch=getchar;}while;}void change/*修改学生的信息*/{lnode *p;lnode e;int flag=1,i;char s1[10],num1[10];printf:\n “);gets;gets;p=l-> elem ;while && flag==1)/*查找要修改的学生的信息*/ {if==0&&strcmp==0)flag=0;/*找到了*/p++;}p--;if printf;printf;forprintf;printf;printf;scanf;forscanf;*p=e;}void same /*把学期和班级相同的学生信息放在结构体数组tt 中*/ {int i=0;lnode *p,*q;q=t;p=l-> elem ;while{if==0&&strcmp==0){*q=*p;q++;i++;}p++;*k=i;}void sort/*按学生成绩从高到低排序函数*/ {int i;lnode *q,temp;for{q-> total =0;forq-> total =q-> total +q-> course [i];q-> average =q-> total /N;}forforif-> total){temp=*q;*q=*;*=temp;}}void print/*输出学生的成绩*/lnode *p;p=q;for{printf;forprintf;printf;printf;}}void stat/*统计学生的成绩*/ {lnode tt[50];char ter[10],clas[10];int i,k;printf:\n “);forter[i]=getchar;forclas[i]=getchar;same;/*把学期和班级相同的学生信息放在结构体数组tt中*/ sort;/*按学生成绩从高到低排序函数*/print;/*输出学生的成绩*/}void search1/*按学号查*/{lnode *p;char ter1[10];int i,flag=1;p=l-> elem;printf;gets;for{if==0){flag=0;printf;printf;forprintf;printf;printf;}}if printf;}void search2/*按姓名查*/ {lnode *p;char ter1[10];int i,flag=1;p=l-> elem;printf;gets;for{if==0){flag=0;printf;printf;forprintf;printf;}}if printf ;}void search/*查找学生的成绩*/ {char ch;do{printf;ch=getchar;switch{case ‘1 ‘:search1;break;case ‘2 ‘:search2;break;default:}printf “);ch=getchar;} while;}void fail/*查找不及格及学生名单*/ {int i;lnode *p;for{forif{printf;forprintf;printf;printf;}}}void output/*按班级输出学生的成绩单*/{lnode tt[50];int k;char clas[10],ter1[10];printf; gets;gets;same;/*把学期和班级相同的学生信息放在结构体数组tt中*/ print;/*输出学生的成绩*/}试验四文件系统一、实验目的1、用高级语言编写和调试一个简单的文件系统,模拟文件管理的工作过程。

操作系统的文件系统

操作系统的文件系统

操作系统的文件系统概述:文件系统是计算机操作系统中的一个重要组成部分,它用来管理存储在计算机磁盘等介质上的文件和目录。

在操作系统中,文件系统提供了对文件的存储、访问和管理等功能,使用户能够方便地创建、删除、复制、查找和修改文件等操作。

本文将对操作系统的文件系统进行详细介绍,包括文件系统的基本概念、组织结构、操作原理以及常见的文件系统类型等内容。

一、文件系统的基本概念文件系统是操作系统中用于组织和管理文件的一种机制。

它通过对文件进行逻辑组织和物理存储管理,为用户提供了按照文件名称、类型和属性等进行管理和访问的能力。

文件系统的主要特点包括:1. 文件:文件是指计算机中存储的数据单元,可以是文本、图片、音频、视频等形式的数据。

在文件系统中,文件通过一个唯一的标识符来标识,并由文件名、扩展名和属性等信息来描述。

2. 目录:目录是文件系统中的一个重要组成部分,用于组织和管理文件。

目录可以包含文件以及其他目录,形成一个层次结构的树状结构,方便用户对文件进行分类和查找。

3. 存储空间管理:文件系统负责对存储介质(如磁盘)上的空闲空间进行管理,以便为新文件分配存储空间,同时能够对文件进行动态增长和收缩。

4. 文件访问和权限控制:文件系统提供了对文件的读取、写入、执行等操作方式,并通过权限控制机制限制用户对文件的访问权限,以保护文件的安全性。

二、文件系统的组织结构文件系统的组织结构可以分为单层结构、层次结构和索引结构等。

1. 单层结构:单层结构是最简单的文件系统组织方式,它把所有的文件都保存在一个目录中。

单层结构缺乏灵活性和可扩展性,不适用于大规模的文件管理。

2. 层次结构:层次结构是一种树状结构,其中包含了一个根目录和多个子目录。

层次结构通过目录的嵌套关系来组织和管理文件,使文件的分类更加清晰。

但是层次结构对目录的层级有限制,不适用于复杂的文件管理需求。

3. 索引结构:索引结构是一种更加灵活和高效的文件系统组织方式。

2022年湖南理工学院计算机科学与技术专业《操作系统》科目期末试卷A(有答案)

2022年湖南理工学院计算机科学与技术专业《操作系统》科目期末试卷A(有答案)

2022年湖南理工学院计算机科学与技术专业《操作系统》科目期末试卷A(有答案)一、选择题1、文件系统采用两级索引分配方式。

若每个磁盘块的大小为1KB.每个盘块号占4B,则该系统中单个文件的最大长度是()A.64MBB.128MBC.32MBD.都不对2、通常对文件系统来说,文件名及属性可以集中在()中以使查询。

A.目录B.索引C.字典D.作业控制块3、并发进程执行的相对速度是()A.由进程的程序结构决定的B.由进程自己来控制的C.与进程调度策略有关的D.在进程被创建时确定的4、进程资源静态分配方式是指一个进程在建立时就分配了它需要的全部资源,只有该进程所要资源都得到满足的条件下,进程才开始运行。

这样可以防止进程死锁。

静态分配方式破坏死锁的()为必要条件。

A.互斥条件B.请求和保持条件(占有并等待条件)C.非剥夺式等待条件D.循环等待条件5、在使用信号量机制实现互斥时,互斥信号量的初值一般为():而使用信号量机,制实现同步时,同步信号量的初值般为()。

A.0:1B.1:0C.不确定:1D.1:不确定6、有一个矩阵为100行x200列,即a[100][200]。

在一个虚拟系统中,采用LRU算法。

系统分给该进程5个页面来存储数据(不包含程序),设每页可存放200个整数,该程序要对整个数组初始化,数组存储时是按行存放的。

试计算下列两个程序各自的缺页次数(假定所有页都以请求方式调入)()。

程序一:for(i=0;i<=99;i++)for(j=0:j<=199;j++)A[i][j]=i*j:程序二:for(j=0:j<=199;j++)for(i=0;i<=99;i++)A[i][j]=i*j;A.100,200B.100,20000C.200.100D.20000,1007、若用户进程访问内存时产生缺页,则下列选项中,操作系统可能执行的操作是()。

I.处理越界错误 II.置换页面 II1.分配内存A.仅I、IIB.仅I、IIIC. 仅I、IIID.I,II和III8、下面叙述中,错误的是()A.操作系统既能进行多任务处理,又能进行多重处理B.多重处理是多任务处理的子集,C.多任务是指同一时间内在同一系统中同时运行多个进程D.一个CPU的计算机上也可以进行多重处理9、所谓(),是指将一个以上的作业放入内存,并且同时处于运行状态。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机08级《操作系统课程设计》任务书一、课程设计的性质和目的操作系统课程设计是计算机专业的专业课程,通过课程设计使学生进一步巩固课堂所学知识,全面熟悉、掌握操作系统的基本设计方法和技巧,进一步提高分析问题、解决问题及上机操作能力,为将来从事计算机工作打下一定的专业基础。

二、设计课题课题一:模拟实现单级目录的FAT文件系统基本思路:用二进制文件空间模拟磁盘空间,用文件块操作模拟磁盘块操作。

基本设计要求:1、实现如下文件系统功能(过程或函数):a、打开文件系统FILE *OPENSYS(char *filename);b、关闭文件系统int CLOSESYS(FILE *stream);c、显示目录void LISTDIR(void);d、建立文件int FCREA TE(char *filename);e、删除文件int FDELETE(char *filename);f、打开文件int FOPEN(char *filename);g、关闭文件int FCLOSE(int fileid);h、文件块读int FREAD(void *ptr, int n, int fileid);i、文件块写int FWRITE(void *ptr, int n, int fileid);j、判断文件结束int FEOF(int fileid);k、获取文件指针long FGETPOS(int fileid);l、设置文件指针int FSETPOS(int fileid, long offset);m、取得文件长度long FGETLEN(char *filename);2、提供文件系统创建程序3、有功能检测模块4、为简化程序设计,假定目录区域大小固定。

文件系统空间划分:保留扇区FAT表区(或字节映像图区)根目录区文件分区可以使用的C语言文件操纵函数:FILE *fopen(const char *filename, const char *mode);int fclose(FILE *stream);int fseek(FILE *stream, long offset, int whence);long ftell(FILE *stream);size_t fread(void *ptr, size_t size, size_t n, FILE *stream);size_t fwrite(const void *ptr, size_t size, size_t n, FILE *stream);课题二:模拟实现单级目录、单级索引的索引文件系统使用链接域将同一文件的各索引块按顺序连接起来;其余各项同课题一。

三、课程设计报告要求1、设计报告要求A4纸打印成册;2、使用学院统一的封面;3、课程设计报告每人一份,必须包含如下几个方面的内容:1)基本设计思想;2)主要数据结构;3)主要实施流程;4)所有源代码;5)课程设计总结与体会。

四、分组及选题办法1、按学号顺序一人一组,学号为奇数者为课题一,偶数者为课题二。

2、成绩考核按个人课题完成情况、设计报告质量及对课程设计的态度等综合评定。

目录一、程序的功能 (5)二、程序的基本设计思路 (5)三、主要的数据结构 (6)4.1创建文件流程图 (8)4.3 FREAD函数流程图 (10)五、程序调试及其运行结果 (11)六、设计总结与心得体会 (14)七、附录(源程序清单) (14)一、程序的功能该程序主要模拟实现单级目录的FAT文件系统,该系统要求能实现对文件的创建、删除、读、写、打开、关闭以及能显示目录等操作,在创建文件时,系统首先为新文件分配所需的外存空间,并且在文件系统的相应目录中,建立一个目录项,该目录项记录了新文件的文件名及其在外存中的地址等属性。

而当已经不再需要某个文件时,便可以把它从文件系统中删除。

这时执行的是与创建新文件相反的操作。

系统先从目录中找到要删除的文件项,使之成为空项,紧接着回收该文件的存储空间,用于下次分配。

通过读指针,将位于外部存储介质上的数据读入到内存缓冲区这样就实现了文件的读取,通过写指针,将内存缓冲区中的数据写入到位于外部存储介质上的文件中。

在开始使用文件时,首先必须打开文件。

这可以将文件属性信息装入内存,以便以后快速查用。

在完成文件使用后,应该关闭文件。

这不但是为了释放内存空间,而且也因为许多系统常常限制可以同时打开的文件数。

当创建文件时,先在目录表中查找是否存在此文件表,若存在则表示文件同名不能创建,否则在目录表中为此文件先建立一个目录项,保存文件的一些基本属性,如创建日期、大小、文件名等,并保存文件的首索引块扇区号,对文件读写也是先在目录项里查找文件是否存在,再根据文件的首索引块扇区号,查找对应块号中的内容对其进行读写操作,删除一个文件后回收为其分配的空间,并更新目录表、修改文件控制块。

显示目录项可以显示文件名、长度以及创建日期。

二、程序的基本设计思路模拟实现单极目录FAT的文件系统基本思路:用二进制文件空间模拟磁盘空间,用文件块操作模拟磁盘块操作。

在一个文件系统中对文件进行操作,实现文件的创建、读写等等操作。

在创建文件时先在目录项中进行查找,若创建的文件已存在,文件的创建首先检验目录是否为空,为空则把文件夹或文件连接到该目录下,不为空则把检查目录下是否有同名文件夹或文件,有则提示创建不成功,而文件夹打开是则把文件夹名称及其地址压入打开文件夹栈,文件关闭则把文件夹名称及其地址从打开文件夹栈中抛出。

文件夹和文件的删除,文件夹下没有打开的文件或文件没有打开才能删除,否则删除失败,每次操作成功都要更改目录和FCB信息。

该过程都保存在文件中,是对文件的操作。

本系统建于Windows平台,开发环境为WIN-TC。

三、主要的数据结构单级目录单级索引文件系统:常量#define BlockSize 512#define DirSize 32保留扇区结构struct ReserveBlock{int sysblocknum; /*文件系统总扇区数*/int resblocknum; /*保留扇区扇区数*/int mapblocknum; /*字节映像图扇区数*/int rootblocknum; /*根目录区扇区数*/char fillchar[BlockSize-4*sizeof(int)]; /*填充字节*/};目录结构struct DirBlock{char filename[11]; /*文件名限长11个字符*/char fillchar[DirSize-4*sizeof(int)-sizeof(long int)-11]; /*填充字节*/ long filelen; /*文件长度*/int year,month,day; /*定义年月日*/int firstindexaddr; /*文件首索引块扇区号*/};索引块结构struct IndexBlock{int dataaddr[BlockSize/sizeof(int)-1]; /*数据块块号数组*/int nextindexaddr; /*本文件下一索引块块号*/};索引节点结构struct IndexNode{struct IndexBlock block; /*索引块数据*/int blockaddr; /*本节点索引块块号*/struct IndexNode *nextnode; /*指向下一索引节点的指针*/};FCB(文件控制块)结构struct FCBBlock{int fileid; /*文件标识*/struct DirBlock fileinfo; /*目录信息*/long filepos; /*文件读写指针*/int fdtblockaddr; /*目录项所在块号*/int fdtblockindex; /*目录项所在块内序号*/struct FCBBlock *next; /*指向下一个文件控制块的指针*/struct IndexNode *firstindexnode; /*指向第一个索引节点的指针* /}四、相关流程图4.1创建文件流程图主界面Start输入start打开文件系统YN输入creat来创建文件输入文件名,大小,创建日期判断是否重名文件创建成功文件创建失败,重新输入文件名EndN Y4.2删除文件流程图创建(creat)一个文件Start判断是否存在该文件判断该文件是否被open输入del 成功删除文件End先close 关闭文件4.3 FREAD 函数流程图YN N YNYStarta==Null a->fileid==fileid (a->filepos+n)>((a->fileid*512)+a->fileinfo.filelen) printf("超出空间。

\n")输出字符串输出无此fileida=a->next End五、程序调试及其运行结果图1图1为欢迎界面在输入系统块的数目后产生的界面,必须先要输入start开始运行文件系统才能完成建立文件(creat),显示文件目录(list),打开文件(open),关闭文件(close),删除文件(delete),写文件块(write),读文件块(read)等等操作图2输入start成功打开文件系统,再输入creat来创建文件,此图为创建成功后的界面图3图3表示输入list显示文件目录,如图所示创建了aaa,bbb,ccc三个文件图4图4显示的是成功打开和成功关闭文件图5输入read读取文件,可以设置读文件的初始位置以及读取文件的长度.图6 输入write写文件图7如图所示删除aaa,bbb,ccc三个文件六、设计总结与心得体会。

七、附录(源程序清单)#include <stdio.h>#include <string.h>#include <stdlib.h>#define BlockSize 512 #define DirSize 32#define RootSize 2 struct ReserveBlock{int resblocknum;/*保留扇区扇区数*/int fatblocknum;/*FAT表扇区数*/int rootblocknum;/*根目录区扇区数*/char fillchar[BlockSize-4*sizeof(int)];/*填充字节*/};struct DirBlock{11个字符*/charfillchar[DirSize-4*sizeof(int)-sizeof(long int)-11];/*填充字节*/long filelen; /*文件长度*/int year,month,day; /*日期*/int firstblockaddr; /*文件首块扇区号*/};struct FCBBlock{int fileid; /*文件标识*/long filepos; /*文件读写指针*/int fdtblockindex; /*目录项所在块内序号*/struct FCBBlock *next;/*指向下一个文件控制块的指针*/};struct ReserveBlock sys1; /*保留块*/struct FCBBlock *fcb; /*fcb头指针*/struct DirBlock fil[32],*dir; /*目录*/int *fat1; /*fat 表头指针*/char *str,*ptr; /*读、写缓冲区首地址*/char fillchar[BlockSize]; /*填充字符*/ 指针*/FILE *OPENSYS(char *filename) /*打开文件系统*/{ int i;fp=fopen(filename,"rb+");fread(&sys1,1,BlockSize,fp);/*读保留扇区*/fat1=(int*)malloc(sys1.fatblocknum*BlockSize);for(i=0;i<sys1.fatblocknum;i++)/*读fat表*/fread(fat1+i*BlockSize,BlockSize,1,fp);fseek(fp,(sys1.fatblocknum+sys1.resblocknum)*Bl ockSize,0);dir=fil;for(i=0;i<sys1.rootblocknum;i++)/*读目录*/fread(dir+i*BlockSize/DirSize,BlockSize,1,fp);return fp;}int CLOSESYS(FILE *stream) /*关闭文件系统*/{ int i;fseek(stream,sys1.resblocknum*BlockSize,0);for(i=0;i<sys1.fatblocknum;i++)/*回写fat表*/fseek(fp,(sys1.fatblocknum+sys1.resblocknum)*Bl ockSize,0);for(i=0;i<sys1.fatblocknum;i++)/*回写目录*/fwrite(dir+i*BlockSize/DirSize,BlockSize,1,fp);fclose(fp);return 0;}void LISTDIR(void) /*显示目录*/{ int i,flag=0;for(i=0;i<32;i++){ if(fil[i].firstblockaddr!=0){ if(flag==0)printf("文件名大小创建日期\n");flag=1;printf("%s%8ld%4d%4d%4d\n",fil[i].filename,fil[i].filelen,fil[i].year,fil[i].month,fil[i].day);} }}int FCREATE(char *filename) /*创建文件*/{int i,flag=0,j,k=0,flag1=0,flag2=0,a;int n,m;a=strlen(filename);return 1;for(i=0;i<sys1.rootblocknum*BlockSize/DirSize;i ++) /*查找是否重名*/if(strcmp(filename,fil[i].filename)==0){printf("文件名已存在!\n");return 3;}for(i=(sys1.fatblocknum+sys1.resblocknum+s ys1.rootblocknum);i<sys1.sysblocknum;i++)if(fat1[i]==0)/*查看是否有空的块*/flag++;if(flag==0){ printf("磁盘已满");/*统计结果为0,则磁盘已满*/return 0;}printf("空闲块数:%d\n",flag);printf("请输入文件长度:");for(j=0;j<32;j++)if(fil[j].firstblockaddr==0)break;while(1){scanf("%d",&dir[j].filelen);/*输入目录项中文件的长度*/n=(dir[j].filelen/BlockSize)+(dir[j].filelen%BlockS ize?1:0);if(n<0||n>flag)/*文件长度小于0或大{printf("文件太长!\n");printf("请重新输入:");}elsebreak;}for(i=(sys1.fatblocknum+sys1.resblocknum+sys1.r ootblocknum);i<sys1.sysblocknum;i++)/*分配一块空间*/if(fat1[i]==0){ fat1[i]=-1;break;}dir[j].firstblockaddr=i+1;strcpy(dir[j].filename,filename);/*输入文件相关的信息*/dir[j].filename[a]='\0';printf("输入年份:");scanf("%d",&dir[j].year);printf("输入月份:");scanf("%d",&dir[j].month);printf("输入日期:");scanf("%d",&dir[j].day);return (0);}int FDELETE(char *filename) /*删除文件*/{int i,j,k,n,flag=1;struct FCBBlock *p;p=fcb;while(p) { if(strcmp(filename,fil[p->fdtblockindex].file name)==0)return 1;elsep=p->next;}for(i=0;i<sys1.rootblocknum*BlockSize/DirSize;i ++) /*查找是否存在要删除的文件*/ if(strcmp(filename,fil[i].filename)==0){ flag=1;break;}if(flag==0)return 2;j=fil[i].firstblockaddr;while(1){k=fat1[j-1];/*将要删除的文件的块用0填充*/fseek(fp,(j-1)*BlockSize,0);fwrite(&fillchar,1,BlockSize,fp);fat1[j-1]=0;if(k==-1)break;elsej=k;}memset(&fil[i],0,DirSize);/*将要删除的文件的目录用0填充*/}int FOPEN(char *filename) /*打开文件*/{int i,j=0,k,flag=0,id;struct FCBBlock *p,*q,*r;p=fcb;for(i=0;i<sys1.rootblocknum*BlockSize/DirSize;i ++) /*查找要打开的文件是否存在*/if(strcmp(filename,fil[i].filename)==0){ flag=1;break;}if(flag==0)return 0;if(fcb==NULL){ fcb=(struct FCBBlock *)malloc(sizeof(struct FCBBlock));fcb->fileid=j+1;fcb->filepos=0;fcb->next=NULL;fcb->fdtblockindex=i;id=j+1;return id;}else{ while(fcb){j++; if(strcmp(filename,fil[fcb->fdtblockindex].filenam e)==0) /*判断是否已经打开*/return 0;q=fcb;fcb=fcb->next;}r=(struct FCBBlock *)malloc(sizeof(struct FCBBlock)); /*创建fcb*/r->fileid=j+1;r->filepos=0;r->next=NULL;r->fdtblockindex=i;q->next=r;}id=j+1;fcb=p;return id; /*返回打开的文件的标识fileid*/}long FGETLEN(char *filename) /*获取文件的长度*/{ int i;for(i=0;i<sys1.rootblocknum*BlockSize/DirSize;i ++)if(strcmp(filename,fil[i].filename)==0)return fil[i].filelen;}int FCLOSE(char *filename)/*关闭文件*/{ int flag=0;struct FCBBlock *f,*p;f=fcb;if(strcmp(filename,fil[fcb->fdtblockindex].filenam e)==0){ flag=1;fcb=fcb->next;p=fcb;while(p){p->fileid-=1;p=p->next;}return flag;}p=f;f=f->next;while(f){if(strcmp(filename,fil[f->fdtblockindex].filename) ==0){ flag=1;p=f->next;/*p=p->next;*/while(p){ p=p->next;p->fileid-=1;free(f);return flag;}p=f;f=f->next;}if(flag==0){ printf("The file has not open!\n'");return flag;}return 0;}int FREAD(char *str, int n, int fileid) /*读文件*/{ int m,i,j=0,k,l,len,n1,n2=0;struct FCBBlock *p;p=fcb;while(p)/*查找要读的文件的fcb*/{if(p->fileid==fileid)break;elsep=p->next;}if(p==NULL)return 1;len=fil[p->fdtblockindex].filelen;l=p->filepos;if((l+n)>len)j=(l/BlockSize)+(l%BlockSize?1:0);/*求文件指针所在文件的相对块号*/m=((l+n)/BlockSize)+((l+n)%BlockSize?1:0);k=fil[p->fdtblockindex].firstblockaddr;for(i=1;i<j;i++)/*求文件指针所在的块号*/k=fat1[k-1];str=(char*)malloc((m-j+1)*BlockSize+1); /*分配读取的缓冲区*/for(i=0;i<(m-j+1);i++)/*读文件*/{fseek(fp,(k-1)*BlockSize,0);fread(&str[i*BlockSize],BlockSize,1,fp);k=fat1[k-1];}str[n+l-(j-1)*BlockSize]='\0'; /*截断多读的内容*/if(l!=0)str=&str[l-(j-1)*BlockSize];p->filepos=n+l; /*修改文件指针*/printf("%s\n",str);return 0;}int FWRITE(char *ptr, int n, int fileid){long l;intm,i=0,j,k=0,num,flag=0,flag1=0,b,flag2=0;int n1,n2=0,n3,c;struct FCBBlock *p;char *st1,*st2;st1=(char *)malloc(BlockSize);p=fcb;while(p) /*查找文件的fcb*/{if(p->fileid==fileid)break;elsep=p->next;}if(p==NULL)return 1;l=p->filepos;n1=fil[p->fdtblockindex].firstblockaddr;while(n1!=-1){n2++;m=n1-1;n1=fat1[n1-1];}if((l+n)>n2*BlockSize) /*判断是否要追加空间*/{ n3=(l+n)/BlockSize+((l+n)%BlockSize?1:0)-n2; /*追加空间*/ootblocknum);i<sys1.sysblocknum;i++)if(fat1[i]==0)flag++;if(flag==0){ printf("磁盘已满");return 2;}if((l+n-fil[p->fdtblockindex].filelen)>flag*BlockSi ze)return 3;for(i=(sys1.fatblocknum+sys1.resblocknum+sys1.r ootblocknum);i<sys1.sysblocknum;i++){if(fat1[i]==0){k++;if(k>=n3){fat1[m]=i+1;fat1[i]=-1;break;}elsefat1[m]=i+1;m=i;} }}flag=0;k=0;n3=(l+n)/BlockSize+((l+n)%BlockSize?1:0);j=(l/BlockSize)+(l%BlockSize?1:0);/*求文件指针所在文件的相对块号*/st2=(char *)malloc((n3-j+1)*BlockSize);if(l==0)j=1;num=fil[p->fdtblockindex].firstblockaddr;for(i=1;i<j;i++)num=fat1[num-1];if(!l%BlockSize)/*写第1块*/{fseek(fp,(num-1)*BlockSize+l-(i-1)*BlockSize,0) ;fread(st2,BlockSize,1,fp);for(c=0;c<n;c++)st2[c]=ptr[c];fseek(fp,(num-1)*BlockSize+l-(i-1)*BlockSize,0);fwrite(st2,BlockSize,1,fp);num=fat1[num-1];fflush(fp);}else{ fseek(fp,(num-1)*BlockSize,0);fread(st2,BlockSize,1,fp);for(c=0;c<n;c++)st2[c+l-(j-1)*BlockSize]=ptr[c];fseek(fp,(num-1)*BlockSize,0);fwrite(st2,BlockSize,1,fp);21num=fat1[num-1];fflush(fp);}for(i=1;i<(n3-j);i++)/*写第2块-倒数第2块*/{ fseek(fp,(num-1)*BlockSize,0);fwrite(st2+i*BlockSize,BlockSize,1,fp);num=fat1[num-1];fflush(fp);}if((n3-j)>0)/*写最后一块*/{fseek(fp,(num-1)*BlockSize,0); fread(st2+i*BlockSize,BlockSize,1,fp);for(c=0;c<(n-((j*BlockSize-l)+(i-1)*BlockSize));c ++)st2[c+i*BlockSize]=ptr[c+(j*BlockSize-l)+(i-1)*B lockSize];fseek(fp,(num-1)*BlockSize,0);fwrite(st2+i*BlockSize,BlockSize,1,fp);fflush(fp);}p->filepos=l+n;/*修改文件指针*/if((n+l)>fil[p->fdtblockindex].filelen)fil[p->fdtblockindex].filelen=n+l;/*修改文件长度*/return 0;}int FEOF(int fileid) /*判断文件是否结束*/{int flag;struct FCBBlock *p;p=fcb;while(p){if(p->fileid==fileid)if(p->filepos>=fil[p->fdtblockindex].filelen)return 0;elsereturn 1;}return 2;}long FGETPOS(int fileid){struct FCBBlock *p;p=fcb;while(p){if(p->fileid==fileid)return (p->filepos);elsep=p->next;}printf("get faile!\n");return(-1);}22int FSETPOS(int fileid, long offset) /*设置文件指针*/{struct FCBBlock *p;p=fcb;while(p){if(p->fileid==fileid){if(offset>fil[p->fdtblockindex].filelen||offset<0)return 1;else{p->filepos=offset;return 0;}}p=p->next;}printf("get faile!\n");return(2);}void DISPLAY(){printf("\t\t---------------欢迎使用FAT文件系统---------------\n");printf("\t\t------------------制作人:王兴宙------------------\n\n");printf("\t\t-------------------------------------------------\n");printf("\t\t\t\t 请输入您要选择的功能:\n\n");printf("\t\t\t\t 开始运行文件系统:start\n");printf("\t\t\t\t 建立文件:creat\n");printf("\t\t\t\t 显示文件目录:list\n");printf("\t\t\t\t 删除文件:del\n");printf("\t\t\t\t 打开文件:open\n");printf("\t\t\t\t 关闭文件:close\n");printf("\t\t\t\t 文件块读:read\n");printf("\t\t\t\t 文件块写:write\n");printf("\t\t\t\t 设置文件指针:set\n");printf("\t\t\t\t 获取文件指针:getp\n");printf("\t\t\t\t 获取文件长度:getl\n");printf("\t\t\t\t 退出文件系统:exit\n");printf("\t\t---------------------------------------------------\n");}void test(char *filename) /*测试函数*/{char *t,cmd[10],fname[12];struct FCBBlock *p;int flag,len,id,flag1=0,l;while(1){DISPLAY();scanf("%s",cmd);if(!strcmp(cmd,"start")) /*开始运行系统命令*/{fp=OPENSYS(filename);printf("成功打开文件系统\n");while(1)23{scanf("%s",cmd);if(!strcmp(cmd,"creat"))/*创建文件*/{printf("请输入文件名:");scanf("%s",fname);flag=FCREATE(fname);if(flag==0)printf("文件创建成功!\n");if(flag==1)printf("文件名太长!\n");if(flag==2)printf(" 磁盘已满!\n");if(flag==3)printf("文件已经存在!\n");}else if(!strcmp(cmd,"list")) /*显示文件目录*/LISTDIR();else if(!strcmp(cmd,"del")) /*删除文件*/{scanf("%s",fname);flag=FDELETE(fname);if(flag==0)printf("成功删除文件!\n");if(flag==1)printf("文件被打开,要删除文件请先关闭文件!\n");}else if(!strcmp(cmd,"open")) /*打开文件*/{scanf("%s",fname);flag=FOPEN(fname);if(flag==0)printf("文件没有被发现,不能打开!\n");elseprintf("成功打开,文件ID 是:%d\n",flag);}else if(!strcmp(cmd,"close")) /*关闭文件*/{scanf("%s",fname);flag=FCLOSE(fname);if(flag==1)printf("成功关闭文件!\n");}else if(!strcmp(cmd,"read")) /*读文件*/{scanf("%d",&id);p=fcb;printf("请输入读文件大小:");scanf("%d",&len);flag=FREAD(str,len,id);if(flag==1)printf("文件没有被打开,请先打开文件!\n");if(flag==2)printf("读取文件失败\n");}else if(!strcmp(cmd,"write")) /*写文件*/{ scanf("%d",&id);printf("请输入写文件大小:");scanf("%d",&len);ptr=(char *)malloc(len+1);24printf("请输入内容:");scanf("%s",ptr);flag=FWRITE(ptr,len,id);if(flag==1)printf("文件没有被打开,请先打开文件!\n");if(flag==1)printf("wu kong jian!\n");if(flag==3)printf("写操作失败!\n");if(flag==0)printf("成功写文件!\n");}elseif(!strcmp(cmd,"set")) /*设置文件指针*/{scanf("%d",&id);printf("输入指针:");scanf("%d",&l);flag=FSETPOS(id,l);if(flag==0)printf("成功设置指针!\n");if(flag==1)printf("指针太长或错误!\n");if(flag==2)printf("这个文件没有打开!\n");}else if(!strcmp(cmd,"getp")) /*获取文件指针*/{scanf("%d",&id);flag=FGETPOS(id);if(flag!=-1)printf("pos is:%d\n",flag);if(flag==-1)printf("这个文件不能打开!\n");}elseif(!strcmp(cmd,"getl")) /*获取文件长度*/{scanf("%s",fname);flag=FGETLEN(fname);if(flag==-1)printf("这个文件不能被发现!\n");elseprintf("文件长度:%d\n",flag);}else if(!strcmp(cmd,"exit")) /*关闭文件系统*/{flag=CLOSESYS(fp);if(flag==0)printf("成功关闭文件管理系统!\n");break;}elseprintf("这条命令错误!\n");}}elseprintf("这条命令错误!\n");}}25int main(){ struct ReserveBlock sys;char filename[]="fatsys.dat";int *fat;int i,j;system("graftabl 936");clrscr();fcb=NULL;memset(&sys,255,BlockSize); /*磁盘格式化*/printf("请输入文件系统块的数目(5~32767):");scanf("%d",&(sys.sysblocknum));sys.resblocknum=1;sys.fatblocknum=sys.sysblocknum/(BlockSize/size of(int))+((sys.sysblocknum%(BlockSize/sizeof(int)))?1:0);fat=(int*)malloc(BlockSize*sys.fatblocknum);memset(fat,255,BlockSize*sys.fatblocknum);memset(fat,0,sizeof(int)*sys.sysblocknum);sys.rootblocknum=RootSize;j=sys.resblocknum+sys.fatblocknum+sys.rootbloc knum;for (i=0;i<j;i++)fat[i]=-1;memset(&fillchar,0,BlockSize);fp=fopen(filename,"w+b");fwrite(&sys,1,BlockSize,fp);for (i=0;i<sys.fatblocknum;i++)fwrite(fat+i*BlockSize/sizeof(int),1,BlockSize,fp);j=sys.resblocknum+sys.fatblocknum;for(i=0;i<(sys.sysblocknum-j);i++)fwrite(&fillchar,1,BlockSize,fp);fclose(fp);free(fat);test(filename);return 0;}26。

相关文档
最新文档