文件系统

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文件系统
文件系统
• • • • 文件 目录 文件系统实现 文件系统范例
文件
• • • • • • • 文件命名 文件结构 文件类型 文件访问 文件属性 文件操作 An Example Program Using File System Calls • Memory-Mapped Files
文件命名
文件操作
• Create。创建无数据文件。该调用的目的 是声明文件产生,并且设置某些属性。 • Delete。当文件不再需要时,必须删除它以 释放磁盘空间。由于这个目的,总是有这 个系统调用。
• Open。在使用文件前,进程必须先打开它。 Open调用的目的是允许系统读取其属性, 并且将磁盘地址列表装入内存,便于后续 调用快速访问。 • Close。存取结束后,文件属性和磁盘地址 不再需要,这时应该关闭文件以释放内部 表空间。
An Example Program Using File System Calls
/*打开输入文件,并创建输出文件*/ in_fd = open(argv[1], O_RDONLY); /*打开源文件*/ if (in_fd < 0) exit(2); /*如果不能打开,则退出*/ out_fd = creat(argv[2], OUTPUT_MODE); /*创建目标文件*/ if (out_fd < 0) exit(3); /*如果不能创建,则退出*/ /*复制循环*/ while (TRUE) { rd_count = read(in_fd, buffer, BUF_SIZE); /*读入一个数据块*/ if (rd_count <= 0) break; /*如果文件结束或者错误,退出循环*/ wt_count = write(out _fd, buffer, rd_count); /*写数据*/ if (wt_count <= 0) exit(4); /*wt_count <= 0为错误*/ } /*关闭文件*/ close(in_fd); close(out_fd); if (rd_count == 0) /*最后的读没有错误*/ exit(0); else exit(5); /*最后的读有错误*/ }
/*文件赋值程序。错误监测和报告已经尽可能地省略了。*/ #include <sys/types.h> /*包含必要的头文件*/ #include <fcntl.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]); /*ANSI 原型*/ #define BUF_SIZE 4096 /*使用的缓冲区大小为4096字节*/ #define OUTPUT_MODE 0700 /*输出文件的保护位*/ int main(int argc, char *argv[]) { int in_fd, out_fd, rd_count, wt_count; char buffer[BUF _SIZE]; if (argc != 3) exit(1); /*如果argc不是3,则语法错误*/
Memory-Mapped Files
• 同普通存储器相比较很多人感到用上面的 方法访问文件不灵巧,不方便。 • 为此,从MULTICS开始,某一些操作系统 提供了一种方式,从而可把文件映像到一 个正在运行的进程的地址空间。
目录
• • • • • 单层目录系统 双层目录系统 层次目录系统 路径名 目录操作
• Get attributes。进程经常需要读取文件属 性以完成其工作。 • Set attributes。某些属性是可以由用户设置 的,而且在文件创建后可以改变。该系统 调使其成为可能。 • Rename。用户经常要改变已有文件的名字。 该系统调可以达到这一目的。
An Example Program Using File System Calls
单层目录系统
• 目录系统的最简单形式是使用一个目录包含所有 的文件。 • 有时候,称之为根目录(root directory),不过,由 于只有一个目录,名字无关紧要。 • 在早期的个人计算机上,这种系统非常普遍,部 分原因是只有一个用户。 • 非常有趣的是,世界上最大的超级计算机CDC 6600,对于所有文件也只有一个目录,尽管它同 时有多个用户使用。 • 这个决断无疑是想保持软件设计的简单。

• 在这个组织中,文件由一个记录树组成,并非所有的记录 具有相同的长度,在每个记录的固定位置有一个关键字段。 这个树按照关键字段排序,以允许对一个特定的关键字快 速搜索。 • 在这样的文件结构中,基本的操作不是“得到下一个记 录”,虽然这个操作是可能的,而是以一个特定的关键字 得到记录。对于图 (c)中的文件zoo,比如,一个用户可能 要求系统取得关键字为pony的记录,而不必关心这个记录 在文件中的确切位置。而且,可以在文件中添加新记录, 由操作系统决定将这个记录放在什么位置,而不是由用户 决定。这种类型的文件结构明显地与UNIX和Windows使 用的字节流的无结构有相当大的区别,它被广泛地用在大 型计算,还用于某些商业数据处理。
记录序列
• 在这种模型中,文件是一个具有固定长度的记录的序列, 每个记录具有某种内部结构。将文件作为一个记录的序列 的最主要的想法是,读操作返回一个记录,写操作覆盖或 追加一个记录。作为一个历史的说明,在过去的数十年, 当80列的穿孔卡片(punched card)被广泛使用的时候, 许多(大型机)的操作系统的文件系统基于由80个字符的 记录所组成的文件。这些系统还支持132个字符记录的文 件,这是为行式打印机准备的(其在过去是132列的大型 链式打印机))。程序以80字符为单读取,以132字符单 元将其写,当然,尽管最后的52个可能是空格。 没有通 用的多用途的系统以这种方式工作。
文件访问
• 早期操作系统只有一种文件存取方式:顺序存取 (sequential access)。进程在这些系统中可从开始 处顺序读文件全部字节或记录,但不能跳过某一些 内容也不能非顺序读取。 • 当磁盘被用来存储文件后,可以非顺序地读取磁盘 存储文件中的字节或记录,或按照关键字而不是位 置来存取记录。 • 这种能够以任何次序读取其中字节或记录的文件称 作随机存取文件(random access file)。 • 现代操作系统中所有的文件是随机访问。
根目录
A
A
B
C
文件属性
属性 保护 密码 创建者 所有者 只读标志 隐藏标志 系统标志 存档标志 ASCII/二进制标志 随机存取标志 临时标志 锁定标志 记录长度 关键字位置 关键字长度 创建时间 最后访问时间 最后修改时间 当前大小 最大尺寸 含义 哪些人可以哪些方式访问文件 访问文件需要密码 创建该文件的人的ID 当前所有者 0表示读/写;1表示只读 0表示正常;1表示不显示在列表中 0表示一般文件;1表示系统文件 0表示已经备份;1表示需要备份 0表示ASCII文件;1表示二进制文件 0表示只能顺序存取;1表示随机存取 0表示正常;1表示进程退出时删除文件 0表示未上锁;非0表示已锁定 一个记录的字节数 关键字在每个记录中的偏移 关键字域的字节数 文件创建的日期时间 最后访问该文件的日期时间 最后改变该文件的日期时间 文件的字节数 该文件可能增长的最大字节数
文件类型
• 许多操作系统都支持多种文件类型 • 正式文件(regular file)是包含用户信息的文件 • 目录(directory)是系统文件,用于维护文件系统的 结构。 • 字符特殊文件(Character special files)是与I/O相 关的,用于建模诸如终端、打印机和网络等的串 行I/O设备。 • 块特殊文件(Block special files)用于磁盘建模。
• • • • • 文件名长度 文件名字母表 文件名字符集 文件扩展名 文件名是一种抽象机制
文件结构
wenku.baidu.com
(a) 字节序列 (b) 记录序列 (c) 树
字节序列
• 实际上,操作系统不会知道,也不会去关心文件 中有些什么。操作系统看见的所有的东西是若干 个字节。文件的含义由用户级的程序解释。UNIX 和Windows均使用这种方式的文件结构。 • 使操作系统将文件仅仅看成是字节序列,提供了 最大的灵活性。用户程序可以将任何它们要的东 西放到它们的文件中,并且以任何方便的方式指 定文件名。对于这种方式,操作系统不会帮助, 但也不会妨碍。对于那些要做特殊操作的用户, 后面要介绍的文件结构可能是非常重要的。
• Read。从文件中读取数据。通常,字节来 自文件的当前位置。调用者必须指明需要 多少数据,并且提供存放这些数据的缓冲 区。 • Write。写数据到文件,同样,一般也是在 当前位置。如果当前位置是文件末尾,文 件长度增加。如果当前位置在文件中间, 则现有数据被覆盖,并且永远丢失了。
• Append。此调用是write的限制形式。它只 能在文件末尾添加数据。 • Seek。对于随机存取文件,需要指定从何 处开始读写数据。通常的方法是用seek系 统调用,重定位当前位置指针到文件中的 特定位置。
相关文档
最新文档