一、文件
同一类型数据的集合组成一个文件,比如文本文件、音频文件、图片文件,对于文件需要一定的排列格式,方便不同的用户按照统一的格式可以正确读写文件,这种格式叫“文件格式”。当然文件格式可以用户自定义,但是为了方便文件的可读取性,最好用现成标准,比如txt、MP3、JPEG等。
1.1 文本文件txt
文本文件的字符内容,实际存储在计算机中以0和1进行存储的,那么字符时如何转化成0和1的呢?
首先,目前针对不同的字符有不同的编码标准,例如ASCII、GB2312标准、Unicode 字符集和编码,计算机中存储的字符实际上就是字符在编码标准中的字符编码。
计算机如何在屏幕上进行显示?
字模:每个字符的图形文件,实质上就是一个个像素点数据。
字库:多个字模数据组成的文件称为字库。
计算机显示字符时,根据字符编码与字模数据的映射关系找到对应的字模数据,液晶屏根据字模数据显示该字符。
1.2 音频文件wav
对于音频文件,后缀.wav,主要有两部分组成:元数据和音频数据。
元数据存在文件的开头,在实际数据前面,因此也叫文件头(Header)。元数据中包含码率(bit rate)、单声道还是立体声,是一种关于数据的数据,主要作用是在读取文件时,告知文件的一些信息以及应该以何种方式进行读取。
WAV文件的前44个字节长这样。有的部分总是一样的,比如写着WAVE的部分,其它部分的内容,会根据数据变化。音频数据紧跟在元数据后面,是一长串数字,数字代表每秒捕获多次的声音幅度。电脑和手机麦克风,每秒可以对声音进行上千次采样。每次采样可以用一个数字表示,声压越高数字越大,也叫“振幅”,WAVE文件里存的就是这些数据,每秒上千次的振幅,播放声音文件时, 扬声器会产生相同的波形。
1.3 图像文件bmp
位图(Bitmap),后缀.bmp,一种用于保存图片的格式,计算机上,图片有多个叫“像素”的方块组成,每个像素有三种颜色组成:红、绿、蓝,叫“加色三元色”,混在一起可以创造其它颜色。和WAV文件一样,BMP文件开头也是元数据,有图片宽度,图片高度,颜色深度,元数据之后是图形数据。
图形是由多个像素组成,而图形数据就是单个像素的数据,这里以24位色深度为例,表示一个像素有24位数据,其中8位表示红,8位表示绿,8位表示蓝,一个像素通过三种颜色的混合就能达到屏幕显示的目的。所以一个图形数据就是24位二进制数据。
再次强调,不管文本文件,WAV,BMP或者其它文件,文件在底层全是一样的:一长串二进制。为了知道文件是什么,文件格式至关重要。
二、文件系统
2.1 目录文件
现代存储器中,不仅仅是存储一个文件,如何在一个存储器中存多个文件?最简单的方法是把文件连续存储,这样能用,但怎么知道文件开头和结尾在哪里?
存储器没有文件的概念,只是存储大量位。所以为了存多个文件,需要一个特殊文件,记录其它文件的位置,这个特殊文件有很多名字,这里泛称“目录文件”,这个文件经常存在最开头,方便找。
目录文件里,存所有其它文件的名字,存储其它文件名的格式为:文件名+一个句号+扩展名。
扩展名帮助得知文件类型,目录文件还存文件的元数据,比如创建时间、最后修改时间、文件所有者是谁、是否能读写、或读写都行,最重要的是,目录文件有文件起始位置和长度。
如果要添加文件,删除文件,更改文件名等,必须更新目录文件。
在UNIX中,文件名只是给用户查看使用的,在系统内部是通过inode编号,inode 表包含一份清单,其中列出了对应文件系统的所有 inode 编号。当用户搜索或者访问一个文件时,UNIX系统通过 inode 表查找正确的 inode 编号。在找到 inode 编号之后,相关的命令才可以访问该 inode ,并对其进行适当的更改。
如果两个用户试图对同一个文件进行编辑, inode 已经在第一个编辑会话期间分配给了另一个用户 ID (UID),因此第二个编辑任务就必须等待,直到该 inode 释放为止。
软链接是依据文件的路径产生的一个新文件,这个文件和原先的文件是有不同的inode编号,不同的创建时间,这个操作和windows下的创建快捷方式是很类似的。如果删除原先的文件,那么这个软链接生成的文件就无法打开。
硬链接相当于复制一个原先的文件,并且这两个文件之间可以实现同步。这两个文件之间具有相同的inode编号,相同的创建时间,可以这么理解,原先一个inode编号对应一个文件名,后来硬链接进行了映射,导致一个inode编号对应两个文件名。如果删除其中一个文件,另一个文件也是可以进行编辑操作。删除只是删除了一个映射关系。
2.2 平面文件系统
目录文件,以及对目录文件的管理是一个非常简单的文件系统例子。文件系统专门负责管理文件。
(个人理解:一个存储器中有目录文件以及其它的文件,当需要读取存储器中的文件时,首先应该去找目录文件,而找到目录文件后应该以怎么样的方式去解读这个目录文件,这就需要操作系统有相应的目录文件管理的程序去解读。不同的系统支持解读不同的文件系统,比如windows中的文件系统常用的是NTFS和FAT,而linux中的文件系统常用的是ext2/3/4,windows就不直接支持ext文件系统的操作。)
平面文件系统:文件都在同一个层次上,没有子目录。
如果给todo.txt加一点数据,会覆盖掉后面carrie.bmp的一部分,所以现代文件系统会做两件事:
1、把空间划分成一块块,导致有一些“预留空间”可以方便改动,同时也方便管理。
2、拆分文件,存在多个块里。
假设打开todo.txt加了些内容,文件太大存不进一块里,我们不想覆盖掉隔壁的块,所以文件系统会分配一个没使用的块,容纳额外的数据。目录文件会记录不止一个块,而是多个块,只要分配块,文件可以轻松增大缩小。
假设想删掉carrie.bmp只需要在目录文件删掉那条记录,让一块空间变得可用,注意这里没有擦除数据,只是把记录删了。之后某个时候,那些块会被新数据覆盖,但在此之前,数据还在原处。所以被删掉的文件其实是可以“恢复”数据。
假设往todo.txt加了更多数据,所以操作系统分配了一个新块,用了刚刚carrie.bmp的块。现在todo.txt在三个块里,隔开了,顺序也是乱的,这叫碎片。碎片是增/删/改文件导致的,不可避免。对很多存储技术来说,碎片是坏事,如果todo.txt存在磁带上,读取文件要先读块1,然后快进到块5,然后往回转到块2,来回转个半天。
现实世界中,大文件可能存在数百个块里,你可不想等五分钟才打开文件,答案是碎片整理。计算机会把数据来回移动,排列成正确的顺序。整理后todo.txt在1,2,3,方便读取。
2.3 分层文件系统
目前只说了平面文件系统,文件都在同一个目录里。如果存储空间不多,这可能就够用了,因为只有十几个文件,但随着容量爆炸式增长,文件数量也飞速增长。很快,所有文件都存在同一层变得不切实际。就像现实世界,相关文件放在同一个文件夹会方便很多,然后文件夹套文件夹。这叫“分层文件系统”,你的计算机现在就在用这个。实现方法有很多种,以下是其中一种方法。
之前目录文件只是指向文件,现在目录文件不仅要指向文件,还要指向目录,此时需要额外元数据来区分开文件和目录。
这个目录文件在最顶层,因此叫根目录,所有其它文件和文件夹,都在根目录下,图中可以看到根目录有3个文件,2个子文件夹:“音乐”和“照片”,如果想知道“音乐”文件夹里有什么,必须去那边读取目录文件(格式和根目录文件一样)。
根目录文件:
文件名 | 是否是目录 | 创建时间 | 上一次修改时间 | 存储在哪些块中 |
---|---|---|---|---|
todo.txt | no | 03:14 2020/2/6 | 03:14 2020/2/7 | 1,2,3 |
theme.wav | no | 08:00 2020/2/6 | 08:00 2020/2/7 | 5 |
script.doc | no | 22:54 2020/2/6 | 22:54 2020/2/7 | 4 |
music | yes | 07:01 2020/2/6 | 07:01 2020/2/7 | 6 |
photos | yes | 13:55 2020/2/6 | 13:55 2020/2/7 | 8 |
music目录文件:
文件名 | 是否是目录 | 创建时间 | 上一次修改时间 | 存储在哪些块中 |
---|---|---|---|---|
beat.mp3 | no | 03:14 2020/2/6 | 03:14 2020/2/7 | 9,11,25 |
believe.wav | no | 08:00 2020/2/6 | 08:00 2020/2/7 | 13,37,23 |
royals.mp3 | no | 22:54 2020/2/6 | 22:54 2020/2/7 | 24,26,27,28 |
majic.aiff | no | 07:01 2020/2/6 | 07:01 2020/2/7 | 19 |
breathe.mp3 | no | 13:55 2020/2/6 | 13:55 2020/2/7 | 20,29,30 |
除了能做无限深度的文件夹,这个方法也让我们可以轻松移动文件,如果想把theme.wav从根目录移到音乐目录,不用移动任何数据块,只需要改两个目录文件,一个文件里删一条记录,另一个文件里加一条记录,theme.wav依然在块5。
三、参考资料
[1]: 软链接和硬链接到底有啥作用和区别
[2]: 计算机科学速成课
来源:CSDN
作者:npc666666
链接:https://blog.csdn.net/weixin_42258222/article/details/104209792