本文共 11156 字,大约阅读时间需要 37 分钟。
以计算机硬盘为载体的存储在计算机上的信息集合
。具有文件名的若干相关元素的集合;元素通常是记录,而记录又是一组有意义的数据项的集合
。数据项
、记录
和文件
三级。最低级
的数据组织形式,可分为基本数据项
和组合数据项
。用于描述一个对象的某种属性的一个值
,如姓名、日期等;是数据组织中可以命名的最小逻辑数据单位,即原子数据。基本数据项除了数据名外,还应有数据类型
。因为基本数据项是描述某个对象的属性,而属性不同需要不同的数据类型来刻画。一组有关数据项的集合,用于描述一个对象在某方面的属性
。一个记录包含哪些数据项取决于需要描述对象哪个方面;此外,一个对象可因为所处环境的不同而成为不同的对象。惟一能标识一个记录的数据项
。通常只需一个数据项作为关键字
。逻辑上可分为有结构和无结构两种
。有结构文件
中,文件由一组相似的记录组成,如学生成绩表,故又称记录式文件
;而无结构文件
则被视为一个字符流,如一个二进制文件或字符文件,故又称流式文件
。所有文件的信息都存放在目录结构中,而目录结构保存在外存上。文件信息在需要时才调入内存。通常,目录条目包括文件名名称机器唯一标识符,而标识符定位其他属性的信息
。 文件的性质和用途
分为系统文件、用户文件和库文件。指由系统软件构成的文件
。大多数系统文件只允许用户调用,而不允许用户读,跟不允许用户修改;还有一些系统文件不直接对用户开放。指由用户的源代码、目标文件、可执行文件或数据文件等所构成的文件
。用户将这些文件委托给文件系统保管。指由标准子例程及常用例程等所构成的文件
。这类文件允许用户调用,但不允许修改。指由源程序和数据构成的文件
。通常由终端或输入设备输入的源程序和数据所形成的文件都属于源文件,通常由 ASCII 码或汉字所组成。指把源程序经过相应语言的编译程序编译过,但尚未经过链接程序链接的目标代码所构成的文件
,属于二进制文件。通常,目标文件所使用的后缀名为“.obj”。指编译后所产生的目标代码在经过链接程序链接后形成的文件
。不同系统上,可执行文件的后缀是不一样的。只被核准的用户调用执行,既不允许读更不允许写
。只允许被文件主和核准的用户读取文件内容,而不允许写
。允许文件主和核准的用户去读或写文件
。由ASII 码或二进制码组成的文件
。一般用户所建立的源程序文件、数据文件、目标代码文件以及操作系统自身的代码文件、库文件、实用程序文件都属于普通文件,通常存储在外存中。由文件目录组成
,用于管理和实现文件系统功能的系统文件,通过目录文件可以对其他文件的信息进行检索。由于目录文件也是由字符序列组成,因此对其可进行与普通文件一样的文件操作。特指系统中的各类 I/O 设备
。为了便于统一管理,系统将所有的输入/输出设备都视为文件,按文件方式提供给用户使用,如目录的检索、权限的验证都与普通文件一样,只是对这些文件的操作都是和设备驱动程序紧密相连的,系统将这些操作转为对具体设备的操作。根据设备数据交换单位的不同,又可分为块设备文件和字符设备文件;前者用于磁盘、光盘或磁带等,后者用于终端、打印机等。创建一个新文件时,系统首先要为新文件分配必要的外存空间,并在文件系统的目录中,为之建立一个目录项
。目录项中应记录新文件的文件名及其在外存中的地址等属性。从文件系统中删除一个文件时,应先从目录中找到要删除的文件的目录项,使之成为空项,然后回收该文件所占用的存储空间
。指明文件命名称和要写入文件的内容
。给定文件名称,文件系统才能搜索目录以查找文件位置。文件系统必须为该文件维护一个写位置的指针。每当发生写操作时,就更新写指针。给出文件名和要读入文件块的内存目标地址
,需要搜索目录以找到相关目录项,系统维护一个读位置的指针。每当发生读操作,更新读指针。一个进程通常都只对一个文件读或写,因此当前操作位置可作为每个进程当前文件位置的指针。由于读和写操作都使用同一指针,故节省了空间和降低了系统复杂度。按条件搜索目录,将当前文件位置设置成给定值
,并且不会读、写文件。文件重定位可以从顺序存取变为随机存取。首次使用文件时
,用系统调用 open
将指明文件的属性——包括文件在外存上的物理位置——从外存复制到内存打开文件表的一个表目中,并将该表目的编号即索引返回给用户。操作系统维护一个包含所有打开文件信息的表——打开文件表,Open-file Table
。当用户需要一个文件操作时,可通过该表的一个索引指定文件,省去搜索环节;当文件不再使用时,进程可以关闭它,操作系统从打开文件表中删除这一条目。open 调用在得到操作系统允许的情况下,都会返回一个只想打开文件表中的一个条目的指针,通过该指针进行所有的 I/O 操作
,以简化步骤并节省资源。在Open 调用完成后,操作系统对该文件的任何操作都不再需要文件名,而只需 open 调用返回的指针
。进程相关信息
,如文件在磁盘的位置、访问日期和大小。一个进程打开一个文件,系统打开文件表就会为打开的文件增加相应的条目;当另一进程执行open时,只不过是在其进程打开表中增加一个条目,并指向整个系统表的相应条目。通常,系统打开文件表的每个文件时,还用一个文件打开计数器(Open Count)
,记录多少进程打开了该文件。每个关闭操作close使count递减,当打开计数器为0时,表示该文件不再被使用,系统将回收分配给该文件的内存空间等资源。若文件修改过,则将文件写回外存,并将系统打开文件表中的相应条目删除,最后释放文件的文件控制块(File Control Block,FCB)
。系统用于跟踪上次的读写位置作为当前文件位置的指针
,这种指针对打开文件的某个进程来说是唯一的,因此必须与磁盘文件属性分开保存。 • 文件打开计数,文件关闭时,操作系统必须重用其打开文件表条目,否则表内空间将不够用
。因为多个进程可能打开同一个文件,所以系统在删除打开文件条目之前,必须等待最后一个进程关闭文件。计数器跟踪打开和关闭的数量,计数为0时,系统关闭文件,删除该条目
。 • 文件磁盘位置,绝大多数文件操作都要求系统修改文件数据
。该信息保存在内存中,以免为每个操作都从磁盘中读取。 • 访问权限。每个进程打开文件都需要一个访问模式
:创建、只读、读写、添加等。该信息保存在进程的打开文件表中,以便操作系统能够允许或拒绝之后的I/O请求。文件的逻辑结构是从用户观点出发看到的文件的组织形式
,不同于文件的物理结构是从实现观点出发看到的文件在外存上的存储组织形式。文件逻辑结构与存储介质特性无关,文件的逻辑结构实际上是指在文件的内部,数据逻辑上是如何组织的。有结构文件和无结构文件
。其中有结构文件又可细分为顺序文件、索引文件、索引顺序文件、直接文件或散列文件
。无结构文件将数据按顺序组织成记录并积累、保存,是有序相关信息项的集合,以字节为单位
。因为此种文件没有结构,因而对记录的访问只能通过穷举搜索的方式,故而此种文件形式对大多数应用不适用。但字符流文件的无结构文件管理简单,用户可以方便地对其进行操作。所以,那些对基本信息单位操作不多地文件
较适于采用字符流无结构文件,如源程序文件、目标代码文件等。文件中的记录一个接着一个地顺序排列
,记录通常是定长地,可以顺序存储或以链表形式存储,在访问时需要顺序搜索文件。顺序文件有两种结构:串结构
,记录之间的顺序与关键字无关,通常由存入时间的先后排列记录;第二种是顺序结构
,文件中地所有记录按关键字顺序排列。对记录进行批量存取时
,即每次要读或写一大批记录时,顺序文件的存取效率是所有逻辑文件中最高地;也只有顺序文件才能在磁带上有效工作。顺序文件的缺点
就是对查找、修改、增加或删除单条记录的操作比较困难
。运行记录文件(Log File)
,或叫做事务文件(Transaction File)
,把试图增加、删除或修改的信息记录于其中,规定每隔一定时间,如 3 小时,将运行记录文件与原来的主文件加以合并,产生一个按关键字排序的新文件。 3.2、索引文件 假定每条记录前用一个字节指明该记录的长度
。只能顺序查找,系统开销大
。为此,可以建立一张索引表
以加快检索速度,索引表本身是定长记录的顺序文件。在记录很多或访问要求高的文件中,需要引入索引以提供有效的访问。实际上,通过索引可以成百上千倍地提高访问速度。是顺序和索引两种组织形式的结合
。索引顺序文件将顺序文件中的所有记录分为若干组,为顺序文件建立一张索引表,在索引表中每个组的第一条记录建立一个索引项,索引项中含有该记录的关键字和指向该记录的指针。 记录键值本身就决定了记录的物理地址
。这种由记录键值到记录物理地址的转换成为键值转换(Key to address transformation)
。哈希文件又叫散列文件,是目前最为广泛的一种直接文件
。利用Hash 函数
即散列函数,可将记录键值转换为相应记录的地址。
为了能实现文件存储空间的动态分配,通常由 Hash 函数所求得的并非是相应记录的地址,而是只想一目录表相应表目的指针,该表目的内容指向相应记录所在的物理块。
如上图,若令 K 为记录键值,用 A 作为通过 Hash 函数 H 的转换所形成的该记录在目录表中对应表目的位置,则有关系 A=H(K)。
通常, Hash 函数作为标准函数存于系统中,共存取文件时使用。
Hash 文件具有很高的存取速度,但是会引起冲突,即不同关键字的散列函数值相同
。
有结构文件逻辑上的组织,是在为文件中查找数据服务的:顺序查找、索引查找、索引顺序查找和哈希查找
。
文件目录也是一种数据结构
,包好有关文件的属性、位置和所有权等信息,这些信息主要由操作系统进行管理。目录在用户所需要的文件名和文件之间提供一种映射
,所以目录管理要实现“按名存取
”;目录存取的效率直接影响到系统的性能,所以要提供对目录的检索速度;在共享系统中,目录还需要提供用于控制访问文件的信息;此外,文件允许重名也是用户的合理和必然要求。用于存放控制文件需要的各种信息
,以实现“按名存取”
。FCB 的有序集合称为文件目录
,一个 FCB 就是一个文件目录项。为了创建一个新文件,系统将分配一个 FCB 并存放在文件目录中,成为目录项。 FCB 主要包含以下信息: • 基本信息:文件名、文件的物理位置、文件的逻辑结构、文件的物理结构等。 • 存取控制信息:文件存取权限等。 • 使用信息:文件建立时间、修改时间等。 以 MS-DOS 中的 FCB 为例,FCB 结构如下: 存放在磁盘上的索引节点称为磁盘索引节点
,UNIX 中每个文件都有一个唯一的磁盘索引节点,主要包括以下几方面: • 文件标识符:拥有该文件的个人或小组的标识符 • 文件类型:包括普通文件、目录文件和特别文件 • 文件存取权限:各类用户对该文件的存取权限 • 文件物理地址:每一个索引节点中含有 13 个地址项,即 iaddr(0)~iaddr(12),它们直接或间接方式给出数据文件所在的盘块的编号。 • 文件长度,以字节为单位 • 文件连接计数:在文件系统中所有指向该文件的文件名的指针计数 • 文件存取时间:该文件最近被进程存取的时间、最近被修改的时间及索引节点最近被修改的时间。存放在内存中的索引节点就称为内存索引节点
。当文件被打开时,要将磁盘索引节点复制到内存的索引节点中,便于以后使用。 内存索引节点增加了以下内容: • 索引节点编号:用于标识内存索引节点。 • 状态:指示 i节点是否被上锁或被修改。 • 访问计数:每当有一进程访问此 i节点时,计数加 1,访问结束减 1. • 逻辑设备号:文件所属文件系统的逻辑设备号。 • 链接指针:设置分别指向空闲链表和散列队列的指针。整个文件系统只建立一张目录表
,每个文件只占一个目录项,目录项由文件名、文件扩展名、文件类型、文件物理地址以及文件属性和一个状态位
,状态位用于表明目录项是否空闲。 • 访问文件时,先按文件名在该目录中查找到相应的 FCB,经合法性检查后执行相应的操作。 • 新建文件时,必须先检索所有目录项中以确保没有“重名”的情况,然后再该目录中增设一项,把 FCB 的信息保存在该项中。 • 删除文件时,先从该目录中找到该文件对应的目录项,回收该文件所占用的存储空间,然后清楚该目录项。 单级目录结构实现了“按名存取”,但查找速度缓慢、文件不许重名、不便于文件共享、不适用于多用户操作系统。主文件目录(Master File Directory,MFD)
和用户文件目录(User File Directory,UFD)
。主文件目录中,每个用户目录文件占有一个目录项,其目录项包含用户名和指向该用户目录文件的指针。用户文件目录则有同个用户的所有文件的文件控制块组成。 两级目录结构缺乏灵活性,不能对文件分类
。将两级目录的层次关系加以推广形成多级目录结构
,多级目录结构通常是树型目录结构:主目录称为根目录
,具体的文件就是叶子,其他目录作为树的节点。用文件的路径标识文件
,文件路径为字符串,由根目录到文件所在目录的所有目录名与文件名用分隔符“/”连接而成,例如:“D:/user/document/test.txt”。从根目录出发的路径称为绝对路径
。当层次较多时,每次都从根目录出发进行查询显然浪费时间,于是加入了当前目录
,进程对各文件的访问都是相对于当前目录进行的。当用户访问某个文件时,使用相对路径标识文件,相对路径从当前目录出发到所找文件通路上所有目录名与数据文件名由分隔符“/”连接而成
,例如:“./user/web/page.html”,其中的“.”就表示当前目录。 每个用户都有自己的“当前目录”,也就是用户目录。操作系统提供一条专门的系统调用,供用户随时改变“当前目录”。例如,在 Windows 系统中,当我们启动 CMD 窗口时,所在的目录就是用户目录,然后可以用命令 “cd” 来改变当前的目录位置。树形目录便于实现文件分类,但不便于实现文件共享
,为此在树形目录结构的基础上增加了一些指向同一节点的有向边,使整个目录成为一个有向无环图。 共享计数器
,每当图中增加对该节点的共享链时,计数器加一;每当用户提出删除该节点时,计数器减一;仅当共享计数器为 0 时,才真正删除该节点,否则只删除请求用户的共享链
。但是使得系统的管理变得复杂
。文件共享允许多个用户或进程共享同一份文件,而系统只需保留该文件的一个副本
。若系统无文件共享功能,意味着凡是需要使用该文件的用户,都须各自备有此文件的副本,浪费存储空间。现在的文件共享已经发展到通过网络与世界上各个终端设备进行共享,例如分布式文件系统、远程文件系统、分布式信息系统等,这些系统允许多个客户通过C/S模型共享网络中的服务器文件。此方式又称为硬链接
。必须将共享文件或子目录链接到多个用户的目录中,才能方便地找到该文件
。 有向非循环图(Directed Acyclic Graph,DAG)
。此方式又称为软链接
。
为了能让用户(A)能共享另一个用户(B)的文件(F),系统创建一个 LINK 类型的同名新文件,并将文件F写入用户A的目录中,以实现用户 A 的目录与文件的链接,而新文件中只包含被链接文件(F)的路径名。这样的链接方法就称为符号链接
。
新文件中的路径名只被视为符号链,当用户A访问被链接的文件时且正要读 LINK 类型新文件时,此要求将被 OS 拦截,OS 根据新文件中的路径名去读该文件,便实现了用户 A 对文件 F 的共享
。
此方式实现共享文件时,只有文件拥有者才拥有指向其索引节点的指针,而其他共享该文件的用户只有该文件的路径名
,这样便可以避免文件拥有者删除文件后出现其他用户指针悬空的情况。此方式下,文件拥有者删除文件时,其他用户再试图通过符号链访问文件系统会因为找不到文件而访问失败,于是再将符号链删除,此时不会产生任何影响,这也是大多数正常情况下发送的结果。但是,如果在其他用户使用符号链访问被删除文件之前,又有人在相同路径下创建了同名文件,则此时符号链仍有效,但访问的文件已经改变,这样会导致一些意想不到的错误。
此外,符号链方式还有一个显著问题:用户访问共享文件时,需要根据文件名逐个查找目录直到找到该文件的索引节点,因此,每次访问都可能多次读盘,致使访问文件开销变大且增加了启动磁盘的频率;符号链的索引节点也是要耗费磁盘空间
。
符号链有一个很大的优点就是:能够用于链接计算机网络中任何一台计算机中的文件,在提供该文件所在的机器的网络地址以及文件在机器中的文件路径的情况下
。
两种连接方式:每个共享文件都有几个文件名,即每增加一条链接便会增加一个文件名,实质上是每个用户用自己的路径名去访问共享文件。于是乎,当我们遍历整个文件系时,将出现多次遍历到该文件的情况。
硬链接和软连接都属于静态共享方法,此外还有动态共享——允许两个进程同时对同一个文件进行操作。 文件共享需“软”“硬”兼施。硬链接将多个指针指向一个索引节点,保证只要还有一个指针指向索引节点,索引节点就不能删除;软链接将共享文件的路径记录下来,当要访问时,根据路径寻找文件。硬链接查找速度优于软链接
。
文件保护通过口令保护、加密保护和访问控制等方式实现。其中,口令保护和加密保护是为了防止用户文件被他人存取或窃取,而访问控制用于控制用户对文件的访问方式
。读文件、写文件、执行文件(exe等可执行文件)、文件尾部添加信息和删除文件,以及列出文件名和文件属性、重命名、复制和编辑文件
。访问控制的常用方法就是根据用户身份进行控制
,通过为每个文件和目录增加一个访问控制列表(Access-Control List,ACL)
,列表中规定每个用户名及其所允许的访问类型;此种访问控制列表称为非精简的访问控制列表,虽然可以使用复杂的访问方法,但是长度无法预计并且可能导致复杂的空间管理。为了解决普通方法的局限,出现了一种精简的访问控制列表。精简的访问控制列表采用拥有者、组和其他三种用户类型
;拥有者就是指文件创建者,和拥有者同个用户组的往往具有相类似的权限,而其他用户则权限较少。口令是指用户在建立一个文件时提供一个口令
,系统为其建立 FCB 时附上相应对的口令,同时告诉允许共享该文件的其他用户。用户请求访问时必须提供相应的口令。此方法的时间和空间开销都不大,但是口令直接存在系统内部,不够安全。密码是指对文件进行加密,文件访问时需要使用密钥
。这种方法保密性强,节省了存储空间,但是编码和译码需要花费一定的时间。现代操作系统常用的文件保护方法是,将控制列表与用户、组和其他成员访问控制方案一起组合使用
。 2)对于多级目录结构而言,不仅需要保护单个文件,而且还需要保护子目录内的文件,因此需要提高目录保护机制——目录操作与文件操作不一样,故而需要不同的保护机制
。转载地址:http://yqqgn.baihongyu.com/