文件的状态有被打开和没有被打开,之前谈到一个文件被进行读写,就要打开加载到内存中,通过对应的系统调用,fd文件描述符的管理,write和read等函数的增删查改。并且借助缓冲区对文件属性和内容的修改。
大部分文件是没有被打开的(不需要访问),都在磁盘里保存的!对于没被进程打开的文件也要进行管理。在一个偌大的磁盘中,需要找到某份内容,就要进行核心工作------快速定位!
文件的管理工作包括:1、打开的文件进行管理? 2、没被打开的文件在磁盘里管理
这一个管理工作就叫文件系统。本质就是文件的存储问题。
磁盘是计算机唯一的机械设备,早些年计算机用的激素机械硬盘,这几年逐步过渡到ssd。根据冯诺依曼体系,里cpu越员,速度就会越慢。磁盘的速度是慢于内存慢于ssd。
虽然磁盘的速度效率慢,但是它的造价便宜,内存容量大。所以企业一般是使用机械硬盘。
包括盘片和磁头
盘片:一片有俩面
磁头:一个磁头负责一片,用来读取修改1或0
简述这一个过程:
一个磁盘会有多个盘片堆叠。一个磁头负责一个盘片。盘片沿着指定方向高速旋转,磁头沿着半径方向转动,一秒钟内盘片可能转了上万次。因此在这样的高速旋转下,盘面的每一个小单元都能被识别到。
这里需要主要磁头和盘片不是贴在一起,而是非常接近。因此一个细微的抖动或者是灰尘都会影响磁盘的数据。
写入:计算机的世界上只有0和1,0和1是一种标志,就好比N和S级。在高速旋转中,磁头通过磁化将一个比特位的空间磁化为0或1的过程就是写入。
这里对磁盘的盘片详细介绍。一个盘片可以等分分成多个扇形,每一个扇形就叫做扇区。
磁盘又可以做同心环,每俩个环之间包围的区域就叫做磁盘。
因此,研究盘片主要是研究扇区和磁道。一个磁道可以有多个扇区,一个扇区也可以有多个磁道。这是一个划分。
扇区就是磁盘的最小存储单元512字节,4kb.
磁头Head
磁道 Track
扇区 Sector
一个磁盘有许多块盘片,盘片上有扇区和磁道。如何在一个磁盘中找到指定位置的数据?
多个磁道堆叠,就好比一个空心的圆柱cylinder 。
寻找地址的方法:
这一个过程就是Head Cylinder Sector? CHS定位法?
存储的逻辑抽象
将磁盘的结构由圆盘抽象成线性
类似于磁带,我们将圆盘拉直后,就是线性的存储介质
这一个将磁盘的抽象线性化,得到的数组地址。就叫做LBA(逻辑块地址)。
那么我们想要对磁盘写入只需要知道LBA地址,然后通过LBA与CHS的映射关系就能在磁盘上找到那一块空间。
举例
假设:LBA地址为1234,有俩片盘片,共4面,每面可以存储1000字节,每面磁道有10个,扇区有100个1234 / 1000=1 在第一面上(从0开始计算)
234/10=23? 第23个磁道上
234/100=2? 第2个扇区上
因此就是得到HCS
这样,我们对磁盘的管理就转化为对扇区数组的管理
OS可以按照扇区为单位进行存取,也可以基于文件系统,按照文件块对文件系统数据存取。
总结:
对存储设备的管理,OS层面就是对数组的增删查改
磁盘里的文件是庞大的,为了便于管理,通常会将抽象的线性LBA拆分成小部分,将每一小份管理好,借鉴经验,来管理整体。这是分治的思想。
假设磁盘有500G。可以通过分区来将一个磁盘分成几个小区。通常我们的笔记本就有一块磁盘,一块磁盘被分成C盘\D盘。假设我们将500G分成五个区,每个区域就是100G,在对100G划分成组,每一份就是2G。
每个区的起始位置都有一个Boot Block
Boot? Block是至关重要的 记录OS用于引导用户的操作与配置,记录分区的信息等。
每个区的划分就是组,下面对组详细研究
一个组被划分成 super block(超级块)? ? ? ? ?group descriptor table(组织描述符)? block bitmap(块位图)? ? ? ? inode bitmap( i结点位图)? ? ? ? ? bata block(数据块)
用来存储文件的属性,如大小,所有组,权限,修改时间等
inode表应该是一个定长的结构体
struct inode{
大小,权限,所属组,ACM,inode编号等
引用计数
block[n]
}
每个inode结构体的大小是128字节,一般而言一个文件就有一个inode编号,一个组有多少个inode编号是可以计算的? 一个组的大小是4KB 4KB=4096字节 就有inode=4096/128=32个
:存放文件内容
ionde结构体会记录编号?
通过数据块的映射关系就能快速找到需要的内容
其中
0-12为 1 级映射
13为间接映射
14为3 级映射
一级映射:1-》2? ? 2-》3
间接映射? ?13-》20
三级映射? 向四面八方(发散)寻找
来标识每一个bit的inode(数据块)是否空闲可用
用法同位图 0表示空闲/1表示存在
用来记录文件系统本身的基本信息。包括inode和数据块的总量,未使用的inode和block数目,挂载信息,最后一次检擦磁盘的时间。
文件=内容+属性 都是数据 并且内容和属性是分开存储的
要把多个文件的数据写入组中,就要先把管理组的信息写入。
一个磁盘被格式化后,就是重新写入管理者信息。要想使用分区,就要先进行挂载。
如果超级块被破坏,那么就不能正常使用磁盘。但是OS会对超级块拷贝几份到不同的组起始位置,以备意外的修改。
文件的内容和属性是分开的,inode标识符是文件的唯一标志,文件名和inode是映射关系,Linux识别文件只认inode
根据文件名 映射到空闲的inode_bitmap 把0修改为1,找到对应inode表的结点,写入相应的属性。为其分配数据块,向数据块写入信息。再block_bitmap对应位置的0修改为1,建立inode 和 datablock的映射关系,最后返回inode
创建文件,一定是再某个路径底下!
通过inode编号->找到所处目录->根据文件的inode找到目录的data block->将文件名和inode编号映射关系写入目录数据块中。
在文件目录中找到 inode,再找到对应的block,在数据块里通过映射关系找到要删除文件的inode编号
再根据inode的编号找到block group(组) ,在俩个(inode和block)位图中,都将1修改为0。
最后在目录的数据块映射除,把文件名和inode映射关系解除。完成删除工作。
在当前路径底下,有test.txt文件和dir目录
类似于window的快捷方式
通过指令 ln -s test.txt test.soft 将前的文件链接到后
通过ls -il查看inode 得到源文件和软连接的文件的inode不同,不是同一份文件!
因此软链接是创建独立文件,有独立的inode
软链接的内容是指向目标文件的路径
如果删除了源文件,链接文件存在。但是不能存在或者执行
目录是无法进行软链接的
创建文件myfile.txt 通过硬链接指令 ln myfile.txt myfile.hard
通过ls -il指令 对比源文件myfile和硬链接文件myfile.hard得到这俩个文件是同一个inode编号,因此它们不是独立文件,是同一份文件。
还可以观察到 文件权限后的标识符是软硬链接数目
软链接不改变链接数目
硬链接改变链接数目
删除硬链接文件后,源文件的软硬链接数目减一
删除源文件后,硬链接的文件链接数目会减一
这里就涉及到了引用计数
硬链接的本质就是在目录下建立的文件名和inode的映射关系
被硬链接一次映射关系就会多1 ,引用计数会增加。
当文件名和inode的映射关系全部解除? ,计数从1减到0时。文件才会被删除。找到inode编号,修改inode位图和block位图
目录的链接数:
一个目录被创建出来,就有俩个链接数,链接文件为本身目录和当前目录下的 .
如果在目录下建立新目录,上一层目录的链接数也会增加
目录硬链接会出现路径错误
软硬链接就在为了不切换路径,而能够打开的快捷方式