操作系统的文件系统思考

简介: 文件系统是操作系统的一部分,最终是目的是管理文件。   操作系统中之所以产生文件的概念,是为了方便多个进程可以共享一些数据,那么这些数据就要存储在磁盘上。多个进程可以进行访问。   把文件看成是磁盘上的地址空间。

文件系统是操作系统的一部分,最终是目的是管理文件。

 

操作系统中之所以产生文件的概念,是为了方便多个进程可以共享一些数据,那么这些数据就要存储在磁盘上。多个进程可以进行访问。

 

把文件看成是磁盘上的地址空间。

 

文件的内容其实对计算机而言,就是字节序列。对用户看到的才是一行一行数据。

 

文件系统要解决的关键性问题是什么?

就是记录一个文件用到哪些磁盘块(哪些磁盘块分配给了哪些文件),这样找一个文件的时候,就知道去哪个磁盘块上寻找。

不同的操作系统使用不同的方式来实现这一目标。

大体分为三种方式:

 

1、连续分配。

没怎么理解,到底区别是在哪里呢?

 

一个文件,占据着多个磁盘块,特点是这些磁盘块是连续相邻在一起的。

 

每个文件是预先分配大小吗?预先申请多少个磁盘块?

这种方式的缺点是,一旦删除,增加文件,就会形成大量的空闲磁盘块(叫做磁盘碎片)。如果想要新加入的文件,去使用这些空闲磁盘块,那么就要计算一个文件的大小,然后才能找合适大小的磁盘块存入。关键问题是,很难确定一个文件的大小(因为一个文件以后会写入新的数据进去,或者会删除文件里面数据,大小总是在变化中)。正因为文件大小很难固定死,所以反而比较适合cd上的文件来存储,因为cd上的文件大小是固定的,不会改变的。

磁盘碎片多是它的缺点。

 总体来说,这种文件分配方式只适合文件大小固定的文件。

 

2、链表分配(fat方案,文件分配表简称)

 

包括在链表存储在磁盘上,链表放入内存中。放在内存中的时候,速度是快。

链表是相对于连续分配磁盘块的方式而言的。这样子,一个文件不需要固定在连续的磁盘块。比如文件a的内容,在连续分配方式中。随着文件内容的增加,扩容。会使用磁盘块1,磁盘块2,磁盘块3,也就是必须是连续(位置相邻,连续的一片区域)的磁盘块。

优点:避免了连续分配方式中的磁盘碎片。

 

而链表方式,不需要连续的磁盘块。每个磁盘块的第一个字节存储指针,指向下一个磁盘块的地址。这样就能顺着指针去寻找。不需要连续的磁盘块都可以了。

 

为了提高速度,将链表存入到内存中去。内存中维护的这样一个表格(实际上可以理解成一个key->value的映射表),英文名称叫做file acllocation table(文件分配表),缩写是取每个单词的首个字母,就叫FAT。

 

联想到实际例子加深印象

我们经常在使用window的时候,会有fat32文件系统。就是这种原理来维护的。

 

某天,我在安装软件的时候,注意到一个现象,我删除了目录,但是这个目录还是在列表中:

 

 

这让我想起了fat文件系统的知识,把这个映射表放入了内存中(为了提高速度)。所以即便是删除了目录,在选择的时候还是会列出来(什么时候会删除呢?)。

我新加一个目录,看来只要往内存中的映射表(fat)加一条记录项即可,所以上图看到,新增加的目录develop会显示出来,因为直接是从内存的表中载入进来的。

 

重启电脑后,内存中的映射表会重新加载一次

 

 

 

 

 

3、i节点

链表分配法的缺点是,要占据着很大的内存(链表放入内存中为提高速度)。一个目录多少个文件,那么就要维护多少个项在内存中。

那么n多的目录,就会更加多。

磁盘空间越大,所需要维护的链表就越大,意味着内存中链表占据的内存空间就越大。比如200g的磁盘,每个磁盘块是1kb。那么总共就有200g*1kb个项。

这个项的目的,就是指明这个磁盘块的位置。

这个表需要2亿个项,大致需要600-800m的内存。太浪费内存空间了。

 

于是发明了一种改进办法,只有用户打开的文件,才将其节点信息载入内存中。这样子就会占据内存少很多。

 

 

 

3、目录的实现

 

每个目录,就会建一个目录表。目录表里面的每一项叫做目录项,其实就是这个目录中的一个文件对应一个项,通俗点说,就是把这个目录所有的文件都放到目录表里面记录起来。

查找一个目录里面的文件,或者是加入文件,都要搜索这个目录表里面的文件项。

 

目录的本质其实也是文件,只不过是一种特殊的文件,因为它包含了多个文件。所以目录其实是包括这几项:目录名称,目录的开始磁盘块编号,结束磁盘块编号。

 

 

两种实现算法,线性表和hash表。hash表的长度是一个问题。

 

 

理解操作系统,理解了它的三个概念,就几乎成为一个操作系统专家了:

1、进程(线程)。对cpu建立模型

2、地址空间。操作系统对内存的抽象模型

3、文件。难怪在linux操作系统中,一切皆是文件的概念。

 

 

操作系统有自己的文件系统。那么数据库系统如何与磁盘打交道,难道是按照自己的组织方式,还是说没有使用操作系统提供的文件系统呢。

 

但是,要知道,数据库系统最终是在操作系统上运行的,那么要操作磁盘数据,就离不开文件系统的使用。

 

数据库的物理管理有两种方式:

 

1、 借助操作系统的文件系统来组织数据。

由文件系统负责与磁盘交互,申请与分配磁盘块。

 

2、 自己实现一套管理方式,负责申请磁盘块与分配。可以理解为自己实现一套文件系统

实际上,大部分数据库系统一开始就申请固定大小的磁盘空间,然后由自己来进行分配和管理。

 

 

备份:磁盘控制器处理磁盘坏块的操作是透明的,甚至连操作系统都不知道。

目录
相关文章
|
8月前
|
存储 索引
操作系统基础:文件系统基础【上】
操作系统基础:文件系统基础【上】
|
4月前
|
存储 算法 安全
操作系统之文件系统的奥秘
【9月更文挑战第19天】本文将深入探索操作系统中不可或缺的组件——文件系统,揭示其工作原理与实现细节。我们将通过浅显的语言和生动的比喻,一步步解析文件系统如何组织数据、管理存储空间,并确保数据的完整性和安全性。文章不仅适合初学者构建基础概念,也能帮助有经验的开发者更深入地理解文件系统的高级特性。
|
30天前
|
安全 Linux 数据安全/隐私保护
深入Linux操作系统:文件系统和权限管理
在数字世界的海洋中,操作系统是连接用户与硬件的桥梁,而Linux作为其中的佼佼者,其文件系统和权限管理则是这座桥梁上不可或缺的结构。本文将带你探索Linux的文件系统结构,理解文件权限的重要性,并通过实际案例揭示如何有效地管理和控制这些权限。我们将一起航行在Linux的命令行海洋中,解锁文件系统的奥秘,并学习如何保护你的数据免受不必要的访问。
|
2月前
|
存储 安全 大数据
深入浅出操作系统:文件系统的秘密
【10月更文挑战第35天】本文将揭示文件系统背后的奥秘,从其基本概念到复杂的实现机制。我们将一起探索文件系统的结构和原理,并了解它如何影响我们的日常计算体验。通过简单的例子和比喻,文章旨在使读者对文件系统有一个清晰而深刻的理解,就像甘地所言:“你必须成为你希望在世界上看到的改变。”让我们一起成为理解操作系统的先行者。
|
7月前
|
存储 Linux 数据处理
探索Linux操作系统的内核与文件系统
本文深入探讨了Linux操作系统的核心组件,包括其独特的内核结构和灵活的文件系统。文章首先概述了Linux内核的主要功能和架构,接着详细分析了文件系统的工作原理以及它如何支持数据存储和检索。通过比较不同的文件系统类型,本文旨在为读者提供一个关于如何根据特定需求选择合适文件系统的参考框架。
|
8月前
|
存储 Unix Linux
手写操作系统(4)——计算机是如何启动的?BIOS、GRUB、文件系统......
手写操作系统(4)——计算机是如何启动的?BIOS、GRUB、文件系统......
139 1
|
4月前
|
存储 缓存 文件存储
探索操作系统中的文件系统管理
【9月更文挑战第25天】在数字世界的海洋中,操作系统是指引我们航行的灯塔。它不仅管理着硬件资源,还维护着软件的秩序。本文将深入探讨操作系统中一个至关重要的部分——文件系统管理。我们将从基础概念出发,逐步深入到文件系统的设计与实现,最后通过代码示例来直观展示文件系统的操作。让我们一起揭开文件系统管理的神秘面纱,理解其背后的逻辑与奥秘。
|
5月前
|
编解码 Linux 程序员
深度探索Linux操作系统 —— 构建根文件系统2
深度探索Linux操作系统 —— 构建根文件系统
57 12
|
5月前
|
Linux Shell 网络安全
深度探索Linux操作系统 —— 构建根文件系统1
深度探索Linux操作系统 —— 构建根文件系统
65 6
|
5月前
|
存储 人工智能 数据管理
深入理解Linux操作系统之文件系统管理探索人工智能:从理论到实践的旅程
【8月更文挑战第30天】在探索Linux的无限可能时,我们不可避免地会遇到文件系统管理这一核心话题。本文将深入浅出地介绍Linux文件系统的基础知识、操作命令及高级技巧,帮助你更有效地管理和维护你的系统。从基础概念到实践应用,我们将一步步揭开Linux文件系统的神秘面纱。