您的位置 首页 java

文件存储-一切皆文件

摘要

  1. 文件的使用
  2. 文件的存储

文件的使用

如何打开一个文件?

系统调用

如何使用文件?

  fd  = open(name, flag); # 打开文件

write(fd, ...); # 写数据

close(fd);  # 关闭文件
  
  1. 使用open系统调用打开文件,获得 文件描述符
  2. 使用 write 写数据
  3. 使用完文件以后,使用close系统调用关闭文件,避免资源泄漏

打开文件表的作用是什么?

操作系统维护了所有进程所打开的文件列表,文件表里的每一项都代表了一个文件描述符,每当我们打开文件时,都会往该表中添加一项。

文件表项的主要信息有哪些?

  • 文件的指针:系统跟踪上次读写位置当做当前文件位置指针,这个指针对于某个进程是唯一的
  • 文件打开 计数器 :文件关闭时,必须重用文件表项,防止内存不够。多个进程可能打开同一个文件,因此只有当文件打开计数器为0时,系统关闭文件,删除该条目。
  • 文件磁盘位置:一般我们都需要修改文件数据,该信息保存在内存中,以免每个操作都从磁盘中读取
  • 访问权限:每个进程都会一个访问模式(只读、读写等)打开文件,该信息保存在文件表中,以便操作系统可以允许或拒绝后续的IO请求。

文件系统的基本操作单位是?

数据块。

  • 当用户进程从文件读取1字节的数据时,文件系统需要获取字节所在的数据块,再返回数据块中用户进程所需要的数据部分
  • 当用户进程把1字节写入文件时,文件系统需要找到写入数据的数据块位置,然后修改数据块中对应的部分,最后把数据块再写回磁盘

文件的存储

文件的数据在磁盘上的存储方式有哪几种?

  • 连续空间存储方式
  • 非连续空间存储方式

连续空间存储方式

连续空间存储使用前必须要知道文件的大小,这样文件系统才可以在磁盘上找到一块连续的空间分配给文件。文件头里需要指定起始块的位置和长度。

连续空间存储优点?

文件数据紧密相连,一次磁盘寻道便可读出整个文件,读写效率高。

连续空间存储缺点?

  • 磁盘空间碎片:较小的空间块无法进行分配,降低了磁盘使用率
  • 文件长度不易扩展:文件扩展需要更多的磁盘空间,假设相邻的空闲不够,那么就只能移动文件了,这种方式效率非常低

非连续空间存储方式

非连续空间存储方式有哪几种?

  • 链表 方式(又分为显式链表和隐式链表)
  • 索引方式

链表方式的优点?

  • 存放离散,不用连续,消除了磁盘碎片,提高了磁盘空间的利用率
  • 文件长度可以动态扩展

隐式链表特点?

隐式链表实现的方式是文件头中包含第一块和最后一块的位置,并且每个数据块里面留出一个指针空间,用来存放一下个数据块的位置,通过该指针就可以找到所有的数据块。

  • 隐式链表缺点在于无法直接访问数据块,只能通过指针顺序访问文件,且数据块指针消耗了一定的存储空间。
  • 隐式链表分配的稳定性较差,系统在运行过程中由于软件或者硬件错误导致链表指针丢失或损坏,会导致文件数据的丢失

显式链表的特点?

显式链表将每个磁盘块的指针取出来放在一个内存表中。该表对于整个磁盘只设置一张,每个表项中存放链接指针,指向下一个数据块号。该表称为文本分配表( File Allocation Table, FAT )。

显式链表整个查询过程都是在内存中进行,因此检索速度快,而且大大减少了磁盘的访问次数。但是由于整张表都存放在内存中,所以 不适合大磁盘

索引 方式的特点?

索引的实现方式是为每个文件创建一个索引数据块,里面存放的是指向文件数据块的指针列表。

文件头需要包含指向索引数据块的指针,这样通过文件头就知道索引数据块的位置,再通过索引数据块里的索引信息找到对应的数据块。

索引方式优点:

  • 文件的创建、增大、缩小很方便
  • 不会有碎片问题
  • 支持顺序读写和随机读写

索引方式缺点:

  • 如果文件很小,一个块就可以存储所有数据,此时还需要额外分配一块磁盘空间来存储索引,造成了存储的开销。

如果文件过大,一个索引数据块无法存放,如何处理?

处理方式主要有两种:

  • 链式+索引组合(链式索引块)
  • 索引+索引(多级索引块)

链式索引块的实现方式是在索引数据块留出一块区域存放下一个索引数据块的指针,这种方式也会存在之前链表中的指针损坏的问题。

多级索引块的实现方式是通过一个索引块来存放多个索引块,一层套一层。

Unix 中文件数据的存储方式?

在Unix中它会根据文件的大小,存储方式有所变化:

  • 如果存放文件所需的数据块小于10,那么采用直接查找的方式
  • 如果存放文件所需的数据块超过10,采用一级索引方式
  • 如果前面两种方式都不够存放大文件,采用二级索引方式
  • 如果二级索引也不够存放大文件,采用三级索引方式

因此在文件头中需要包含13个指针:

  • 10个指向数据块的指针
  • 第11个指向索引块的指针
  • 第12个指向二级索引块的指针
  • 第13个指向三级索引块的指针

文章来源:智云一二三科技

文章标题:文件存储-一切皆文件

文章地址:https://www.zhihuclub.com/178081.shtml

关于作者: 智云科技

热门文章

网站地图