zoukankan      html  css  js  c++  java
  • 文件系统

    文件系统包括:一组文件与目录结构。

    文件是逻辑外存的最小分配单元。

    文件属性:名称、标识符(这是一个数字,用于标记系统中文件的唯一性,通常为用户所不可读)、类型、位置、大小、保护(读、写、执行等的访问控制信息)、时间日期和用户标识

    所有文件的信息都保存在目录结构中,而目录结构也保存在外存上。

    文件操作:文件属于抽象的数据类型。进行文件操作时,首先用系统调用open()打开一个文件,会将该文件的目录条目复制到打开文件表中。操作系统维护一个打开文件表,会根据

    打开文件表的索引来指定文件,并在文件之上进行操作。其中creat与delete操作的是关闭文件而不是打开文件。

    通常OS对于文件采用两级文件内部表:单个进程的表和整个系统的表。  

    文件名称分为:文件名与扩展名两个部分,其中扩展名决定了文件的类型。

    文件访问方式:顺序访问、直接访问、按键(索引)访问。

    OS可有若干文件系统,且文件系统可有不同的类型。

    目录结构:单层目录结构、双层目录结构、树状目录结构(绝对路径名/相对路径名)、无环图目录(解决共享文件的问题)。

    共享目录的方法:链接或简单的重复共享文件的信息。

    为防止出现悬挂指针的问题,可以使用符号链接或者硬链接中的引用计数。

    第十章 文件系统接口
    1.文件概念
    定义:文件是记录在外存的一组赋名的相关联字符流的集合,或者是相关联
    记录(一个有意义的信息单位)的集合。
    1)文件属性: 名称,标识符,类型,位置,大小,保护,时间日期用户表示。
    2)文件操作:写文件,读文件,在文件内重定位,删除文件,截断文件。
    3)文件类型:实现文件类型常用技术:在文件名:文件+扩展名(表示类型)
    4)文件结构:无结构文件(二进制文件流),结构文件(可记录文件)
    2.访问方法
    文件访问方法:
    1.顺序访问 (一个记录一个记录加以处理,基于磁带模型)
    2.直接访问 (允许程序以任意顺序进行快速读写)
    3.按键访问 (按照索引查找关键字进行访问,索引一般保存在内存,如果太大
    要分成多级索引)。
    3.目录结构
    为了管理文件数据对其进行组织,形成目录。
    1)目录的相关操作
    搜索文件 创建文件 删除文件 遍历目录 重命名文件 跟踪文件系统
    2)目录结构:
    1.单层目录结构:所有文件都包含在同一目录。
    缺陷:文件必须唯一名称,文件难于全面管理。
    2.双层目录结构:为每个用户创建独立目录。
    缺陷:虽解决了命名冲突,但用户合作访问等工作受限,不支持共享。
    3.树状结构目录:将目录组成树的形式。
    相对路径名;绝对路径名。
    缺陷:不支持用户间文件共享。

    4.无环图目录:将目录组织成无环图的形式,从而具有共享的子目录和文件。
    实现无环图目录的方法:1链接,2在共享目录中重复完全相同文件信息。
    5.通用图目录:允许目录中有环存在,形成图状目录。
    缺陷:需使用相关算法避免遍历环(只允许链接向文件,不允许链接子
    目录;调用环路检测判断有无环。)
    4.文件共享
    1.多用户共享:文件组(权限子集)和拥有者(最高控制权)的定义。
    2.远程文件系统:ftp,分布式文件系统,万维网访问。
    5.保护
    1)控制访问:对文件操作进行控制(如读,写,执行,添加,删除,列表)
    2)访问控制:根据用户的身份进行筛选权限:
    ACL(访问控制列表):定义每个用户和允许访问类型
    用户类型控制(拥有者,组,其他),定义权限;ACL具有更高优先级。
    添加密码。
    第十一章 文件系统实现
    1.文件系统的结构
    文件系统分层结构:硬件设备->I/O控制(设备驱动程序和中断处理程序)->基
    本文件系统(向驱动程序发出指令)->文件组织系统(将逻辑块对应为物理块)->逻辑文件系统(管理元数据FCB)
    2.文件系统实现
    文件系统相关概念:1.引导控制块(引导操作系统需要信息),2.卷控制块(卷的详细信息),3目录结构 4索引节点(主控文件表)
    3.目录实现
    1.线性列表(将文件名和数据块指针线性排布,缺点:查找须顺序) 2.哈希表(查找简便,缺点:固定大小,哈希函数对大小的依赖性)。
    4.分配方法
    为文件分配空间的办法:(连续,链接,索引分配)
    1)连续分配:每个文件在磁盘上占有连续的块。
    优点:支持顺序存储与随机存储;顺序访问速度快;所需寻道次数与寻道时间最少。
    缺点:连续存储空间;必须事先指导文件长度,不可动态增长;不利于文件插入删除,存在外碎片。
    2)链接分配:每个文件磁盘块都有一个指向下一块的指针,从而形成链接。
    优点:不存在外部碎片;有利于问价插入删除;有利于文件动态扩充。
    缺点:存取速度慢,不适于随机存取;可靠性问题,指针崩溃;更多寻
    道次数时间;链接指针占用空间。
    FAT 簇,几页的合并单位,可以减少指针数目。
    3)索引分配:建立索引块将所有指针放在一起,提高效率。
    优点:支持直接访问,没有外部碎片问题。
    缺点:索引分配会浪费空间。索引块尽量小。
    解决索引块占据空间问题:
    链接方案:将索引块链接;多层索引:进行多层索引(多层索引计算P367);组合方案(P367!)
    5.空闲空间管理(位向量,链表,组,技术)
    1.位向量(分配为1,未分配为0);2.链表(时间开销较大);3.组 将空闲块地址组和成一个块。 4,计数 记录第一个空闲块后空闲块的数量。

    文件系统永远在外存中,存储大量数据。
    文件能够原地改写,即能够读出一块,并修改,再写回。
    外存和内存的传输的最小单位为block。
    磁盘是随机存储器。
    文件系统设计也是分层设计思想。从最底层开始讲起。
    (1)I/O控制层,包括设备驱动程序(翻译高层命令控制硬件控制器)+中断处理程序。
    (2)基本文件系统:发送高层命令给设备驱动程序用以对磁盘进行读写。
    (3)文件组织模块:从逻辑块-->物理块,给基本文件系统使用。
    (4)逻辑文件系统:管理元数据。元数据就是一些文件属性+文件名。
    分层设计在计算机网络里也有提到,TCP/IP协议等。好处当然是能够清晰的划分各自的功能。
    linux文件系统:ext3,4.
    windows文件系统:FAT,NTFS.
    一个文件系统包括:
    (1)引导控制块(boot control block)是一个卷的第一块,如果该卷没有操作系统,则为空。
    (2)卷控制块:卷的详细信息包括有多少块可以用、块大小等。
    (3)目录:文件名+FCB(inode 索引节点)。
    FCB在另一篇博客中已经讲到,包括一些文件的属性但是不包括文件名。
    FCB==inode==Master File Table
    内存中有一些信息是在文件系统被mount的时候加载进去的,比如目录,整个系统的打开文件表、单个进程的打开文件表。
    文件系统被mount时可能就已经把所有FCB都分配好了,存在pool中。
    UNIX中目录和文件是一起处理的,windows中目录和文件有不同的系统调用。
    比如open一个新的文件,则创建一个FCB,在单个进程打开文件表,系统打开文件表等中适当加入记录,并返回一个句柄。
    UNIX中称为文件描述符,windows中称为文件句柄。

    一个磁盘能有多个分区,如果一个分区没有文件系统,则称为生的。
    引导区如果有多个操作系统和多个文件系统,则通过启动加载器能够定位一个操作系统。
    根分区包括操作系统和系统文件,在引导时导入内存。
    当装入文件系统时,可以自动或手动装入。当装入文件系统时,操作系统需要判定是否有效,如果有效,则在装入表中填入文件系统的类型。

    为了在不同文件系统中无缝移动,引入了VFS。
    (1)VFS把文件系统的接口和具体实现分开。
    (2)在NFS中,也要有一个唯一标识远程文件的标识符,因此vnode类似inode,保存远程文件属性。
    因此通过vnode还是inode能区分本地和远程文件,再是通过特定文件类型来区分文件,因此我们可以正确的调用特定的操作。
    VFS定义的4个主要对象类型:
    (1)inode object。单独的文件。
    (2)file object。打开的文件。
    (3)superblock object。整个文件系统。
    (4)dentry object。单独的目录条目。
    对于每个对象类型都有一系列的操作。

    目录实现有很多种,
    (1)线性列表。
    存储文件名和指向FCB的线性链表。
    可以使用软件缓存来存储最近使用过的目录。
    (2)哈希表。
    给定一个文件名,通过哈希函数,快速找到指定目录。
    缺点:哈希函数及哈希值都是预先给定,不能灵活变换。
    解决方案:动态哈希即可扩展哈希、线性哈希等。或者使用溢出桶。

    文件分配空间方法:
    一、连续分配。
    每个文件都是连续分配。分配时遵循首次适应方法。
    目录是由(文件名,开始位置,长度)组成。
    优点:直接访问。
    缺点:
    (1)外部碎片。
    (2)确定文件大小。
    解决方法:
    (1)对于外部碎片,重新打包即把所有文件系统都复制到磁带上,清空整个磁盘,并重新分配连续空间。
    (2)对于无法确定文件大小,则重新分配孔,但是费时;或者使用扩展连续空间。那么目录就是(文件名,开始位置,块数,第二个开始位置)组成。
    二、链接分配。
    目录为(文件名,文件起始指针,文件结尾指针)组成。
    文件由链表组成。
    优点:分配时只要有空闲块即可。没有外部碎片。
    缺点:
    (1)顺序访问而不能随机访问。
    (2)指针需要空间。
    (3)内部碎片。
    (4)可靠性问题。因为由指针链接,只要有一个指针丢失,则文件就崩溃。
    解决方法:
    对于指针占用空间问题,需要利用更少的指针,则引入了cluster(簇),即一个簇由多个块组成。但是会加剧内部碎片问题。
    对于可靠性,我们可以用FAT(文件分配表),目录为(文件名,开始块)组成。先在FAT找到指定块,再指向块的具体位置。
    采用FAT会导致磁头寻道时间过长。
    三、索引分配。
    把所有索引放在一起,可以支持直接访问。
    但是索引可能会在一个块不够存放,因此有了几种方法:
    (1)链接方案:通过将索引块链接起来。
    (2)多层索引。
    (3)组合方案。例如Unix中的inode,在inode中有15个指针存在文件中,头12个指针为直接块。其他三个为间接索引块。第一个为一级间接块。依次类推,第三个为三级间接块。
    如果文件不大,则可以直接访问。

    对于空闲空间,我们也需要维护一个空闲空间链表。下面介绍几种方法实现。
    (1)位向量。
    通过已分配的块记为0,未分配的块记为1,则只需要简单的位运算就能得出第一个空闲块或者连续空闲块大小等结论。
    缺点:所占空间太大。
    (2)链表。
    空闲空间通过链表连起来,第一个空闲块的地址缓存在内存中。
    缺点:效率不高。
    (3)组。
    将n个空闲块的地址存在第一个空闲块中。
    (4)计数。
    空闲空间表中每个条目记录(起始,长度)的记录。

  • 相关阅读:
    The server must be started under an unprivileged user ID to prevent
    it starts (“forks”) a new process for each connection.
    kong
    flume采集微信小程序数据
    bc
    LINUX上一个命令计算PI
    parameters arguments 形式参数 实际参数
    极限编程 简单设计
    Communicating sequential processes CSP 通信顺序进程 CSP writing to a file by name (process, Erlang) vs. writing to a file descriptor (channel, Go)
    hcitool
  • 原文地址:https://www.cnblogs.com/rickhsg/p/3766320.html
Copyright © 2011-2022 走看看