目录
一.认识硬件-磁盘
1.磁盘的组成
上图所示,就是一个磁盘,其中,主要有以下几个部分:
1.盘面
盘面是储存数据的载体,盘面的表面有无数磁性颗粒组成,大家都玩过吸铁石吧,我们都知道,吸铁石有南北两级,磁性颗粒也是一样,不同的是磁性颗粒的磁场方向可以被磁头改变,这个就可以表示二进制数(0和1)。并且盘面的两面都可以用,且一个磁盘往往有多个盘面。
2.主轴与转动马达
主轴是连接所有盘面的金属轴,由底部的转动马达驱动,马达以恒定的速度顺时针或逆时针转动盘面。转速直接决定了数据读写的延迟和吞吐量。
3.磁头
每个盘面都有一个磁头(正反两面都是),悬浮在盘面几纳米的距离,没有与盘面直接接触通过感应或改变磁场来读写数据。
4.磁头臂
所有磁头臂通过一个装置一起移动,确保多个磁头始终对其不同盘面的磁道。同时不断地左右旋转,本质带动磁头是寻找磁道或柱面。
2.磁盘的存储构成
如上图所示,磁盘的存储构成主要包括磁道,柱面,和扇区。
1.磁道
1.定义:每个盘面划分的成百上千的同心圆环。
2.柱面
定义:所有盘面的半径相同的磁道构成的柱面。
3.扇区
1.定义:每个磁道换分的多个扇形区域
2.特点:扇区是磁盘存储的最小单位。类似与字节是内存存储的最小单位。
扇区的大小一般为512字节,也有4KB的格式。
4.总结
1.磁头的左右摆动本质是在寻找数据存储在那个盘面和磁道,而盘面的旋转是在找一个磁道上的具体的扇区。所以,如果要提升存储效率,必须减少磁头和盘面的机械运动,所以要尽可能将关联的数据放到相近的地方储存。
2.要把数据存储在磁盘,第一个要解决的问题是要找到对应的盘面(磁头),磁道,扇区。
至于如何寻找,其实,我们可以给所有的扇区编号,只要我们知道了扇区编号,然后根据算法就可以找应的盘面,磁道,扇区。
3.磁盘的逻辑结构
磁盘的逻辑结构其实是线性结构。
我们可以根据LBA地址转化为chs地址。
比如每个盘面有2w个扇区,每个盘面有50个磁道,每个磁道有400个扇区,扇区编号是28888,那么s=28888/20000=1,c=8888/400=22 s=8888%400=88.这样就完成了LBA地址到chs地址的转换。
最后,内存的数据是怎么到磁盘上的呢?
其实,磁盘也有寄存器,分别是控制寄存器,用来控制磁盘是读是写,数据寄存器里面是读到的或者要写入的数据,地址寄存器里面放着要在哪里读或者那里写,状态寄存器保存了是否读取完成或者写入完成。
二.理解文件系统
1.引入
假如我们有一块800G磁盘空间需要管理该怎么办?其实我们可以先对磁盘进行分区,把他划分为几块分区就好操作了。例如在Windows下磁盘一般被分为C盘和D盘两个区域
如上图所示,我们可以把800G的磁盘分为一个200G分区和其他几个分区,要想管理好800G的磁盘,只需要把200G的分区管理好就行了,至于其他几个分区,只需要复制管理200G的分区的方法管理其他分区就能管理好所有分区,所有分区管理好,800G的磁盘也就被管理好了,这就是分治的思想。 注意:在分区之后,还要进行磁盘的格式化,磁盘的格式化就是对磁盘的分区进行初始化的操作,这种操作往往会导致现有分区的文件被删除,并且,磁盘格式化会对磁盘的分区后的区域写入管理信息,并且,写入的管理信息通常是由对应的文件系统决定的,常见的文件系统包括ext2等
2.分区
由上图所知,每个分区包括Boot Block还有多个Block group。
1.Boot Block
他是存放引导程序的特殊区域,负责在开机的时候启动操作系统。
2.Block group
3.块组
1.super Block(超级块)
存储的是整个文件系统的关键信息
2.GDT
存储的是该块组的基本信息,包括inode总数,已经使用的inode
3.Block Bitmap
确定一个data Block是否被使用
4.inode Bitmap
确定一个inode是否被使用
5.inode Table
存放的是文件的属性信息。这些属性被称为元数据。inode其实是以结构体的方式存储的。
#define N 15
struct inode
{
inode number;
文件类型
权限;
引用计数;
拥有者;
所属组;
acm时间;
int blocks[N];
...
};
其中struct inode中数组blocks存放了该文件内容的data Blocks。其中前12个元素被称为一级索引,数组直接存放的就是data blocks的编号,这些dataBlock直接存放的就是文件内容,而第13和14个元素则是二级索引,存放的datablock里面的内容全部是存贮文件内容的dataBlock编号。最后一个是三级索引,存放的的Block的内容全是dataBlock的编号,而这些datablock存放的也是datablock的编号。这些编号指向的dataBlocks的内容才是文件内容。
注意:文件名不存储在inode当中。一个inode的大小是128个字节。
6.Data Blocks
存放的是文件的内容。存储大小是一般是4KB
4.理解目录
我们都说Linux下一切皆文件,那么目录也是文件。目录也有自己的inode和数据块。目录的inode里面也是他自己的权限,acm时间等属性信息。而数据块中存储的是当前目录下的文件的文件名和文件对应的inode的对应关系。
5.理解一些问题
1.如何创建一个文件?
首先,我们知道,创建文件肯定要给创建文件的路径和文件名。那么OS首先就会根据路径从根目录找到当前目录,然后OS会在当前分区中找到一个块组,在这个块组里通过inodebitmap 找到一个空闲的inode编号,把当前编号置为1,再通过编号找到对应的inode,往inode里面填充信息,然后通过Blockbitmap找到空闲的数据块,把这些Blockbitmap中这些空闲的数据块的值置为1,再把这些数据块号填到inode里的数组里面。最后在目录下的数据块里面把创建的文件名和这个inode编号建立映射关系。
2.如何删除一个文件?
首先根据路径找到当前目录,访问目录的数据块,在里面找到待删除文件的文件名和对应的inode编号,通过inode编号,找到对应的inode,在里面又找到数据块的编号,再通过这些编号找到inodebitmap,blockbitmap里的这些位置置为0.最后删除当前目录的数据块中的要删除的文件名和他的inode编号。
6.软硬链接
1.软链接
可以通过以下方法创建一个软链接
ln -s 被链接的文件 待创建的文件
由图可知,我们创建了一个软链接link,并且有一个箭头指向a.out,那么link和a.out有什么关系吗?其实link是一个独立的文件,他的数据块中存放的是a.out的路径,因此,link和a.out的效果相同,但是文件大小link要远小于a.out。可以把link理解为a.out的快捷方式。
如上图,两者的inode编号不同,证明是不同文件。
同时,如果a.out被删除,那么link指向的路径就失效了。link就会出现问题。
2.硬链接
可以通过以下方法创建一个硬链接
ln 被链接的文件 待创建的文件
和软链接不同,硬链接不是独立的文件,而是类似取别名这样一种感觉。在底层上,硬链接本质是在当前目录下的被链接的文件名和inode的对应关系中再添加一个文件名与被链接的inode的对应关系
如上图,两者的inode编号一致,证明两者是同一个文件。这时,如果我们删除a.out,link会怎么样呢?补充:如果删除link,可以用rm,也可以用指令unlink。
如上图,a.out被删除之后,link依然能运行,这是因为引用计数的原因,inode里面有一个硬链接数的属性,如果建立一个硬链接,就会++,如果删除任意一个指向该inode的文件,就会--,只用等他减为0时,inode才会被inodebitmap置为0。
3.软硬链接的区别
- 软链接是一个独立的文件,有独立的inode,而硬链接没有独立的inode。
- 软链接相当于快捷方式,硬链接本质没有创建文件,只是建立了一个文件名和已有的inode的映射关系,并写入当前目录