4.存储和文件

1.文件

文件命名

文件结构

文件类型

  • 普通文件

    • 普通文件一般分为ASCII文件和二进制文件。ASCII文件由多行正文组成。在某些系统中,每行用回车符结束,其他系统则用换行符结束。有些系统还同时采用回车符和换行符(如MS-DOS)。文件中各行的长度不一定相同。
    • ASCII文件的最大优势是可以显示和打印,还可以用任何文本编辑器进行编辑。
    • 其他与ASCII文件不同的是二进制文件。打印出来的二进制文件是无法理解的、充满混乱字符的一张表。通常,二进制文件有一定的内部结构,使用该文件的程序才了解这种结构。
  • 目录

  • 字符特殊文件

    • 和输入/输出有关,用于串行I/O类设备,如终端、打印机、网络等。
  • 块特殊文件

    • 用于磁盘类设备。

文件读取

  • 顺序存取
  • 随机存取

文件属性

文件都有文件名和数据。另外,所有的操作系统还会保存其他与文件相关的信息,如文件创建的日期和时间、文件大小等。这些附加信息称为文件属性(attribute),有些人称之为元数据(metadata)。文件的属性在不同系统中差别很大。一些常用的属性在图4-4中列出,但还存在其他的属性。

2.目录

结构

  • 一级目录系统
  • 层次目录系统

路径名

3.文件系统的实现

文件系统布局

多数磁盘划分为一个或多个分区,每个分区中有一个独立的文件系统。磁盘的0号扇区称为主引导记录(Master Boot Record,MBR),用来引导计算机。在MBR的结尾是分区表。该表给出了每个分区的起始和结束地址。表中的一个分区被标记为活动分区。

在计算机被引导时,BIOS读入并执行MBR。MBR做的第一件事是确定活动分区,读入它的第一个块,称为引导块(boot block),并执行之。引导块中的程序将装载该分区中的操作系统。为统一起见,每个分区都从一个启动块开始,即使它不含有一个可启动的操作系统。

文件的实现

  • 连续分配
    • 把每个文件作为一连串连续数据块存储在磁盘上
    • 实现简单,记录第一块的磁盘地址和文件的块数即可
    • 读操作更好
    • 缺点: 磁盘碎片
  • 链表分配

    • 没有磁盘碎片

    与连续分配方案不同,这一方法可以充分利用每个磁盘块。不会因为磁盘碎片(除了最后一块中的内部碎片)而浪费存储空间。同样,在目录项中,只需要存放第一块的磁盘地址,文件的其他块就可以从这个首块地址查找到。

    • 随机存取缓慢,需要链表查找
    • 指针占去了一些字节
  • 在内存中采用表的链表分配

    • 如果取出每个磁盘块的指针字,把它放在内存的一个表中,就可以解决上述链表的两个不足。
    • 内存中的这样一个表格称为文件分配表(File Allocation Table,FAT)
    • 保留所有磁盘块的链接表的表大小正比于磁盘自身的大小,磁盘越大,这个表可能很大。
  • i节点
    • 给每个文件赋予一个称为i节点(index-node)的数据结构,其中列出了文件属性和文件块的磁盘地址。
    • 只有在对应文件打开时,其i节点才在内存中
    • i节点机制需要在内存中有一个数组,其大小正比于可能要同时打开的最大文件个数。它与磁盘无关
    • 相对于在内存中采用表的方式而言,这种机制具有很大的优势,即只有在对应文件打开时,其i节点才在内存中

目录的实现

所有目录项大小一样的实现

非-所有目录项大小一样的实现

“有三个文件,project-budget、personnel和foo”

实现

  • NTFS
  • FAT
  • EXT2
    • https://wizardforcel.gitbooks.io/vbird-linux-basic-4e/content/59.html
  • HFS (苹果)