机械硬盘
在我们装载在笔记本的硬盘大部分都是固态硬盘ssd,但是在实际开发中,更多还是使用固态用品(便宜、容量大),作文文件的存储介质,有必要好好介绍一下固态硬盘
固态硬盘是计算机自带的唯一的机械设备,也是一个外设。
物理结构介绍
固态硬盘HDD最主要的就是磁头与磁盘,磁盘是用来存储数据的。
存储数据的最小操作单元是512byte(哪怕你只想用1bite,那也得把512字节全部加载到内存)
磁盘存储数据的区域是由一个个同心圆构成,这些相同半径的同心圆(即磁道)称之为柱面
磁盘被访问的基本单元是扇区---512byte
磁头左右摆动目的就是定位磁道或柱面。这就是定位扇区的过程。由于是机械设备,所以性能要比ssd要差。
CHS寻址
想要读取磁道的信息,需要经过几步定位:磁头定位(确定扇面)----磁道定位----扇区定位。
CHS即这三个要素的首字母。
逻辑结构介绍
物理上磁盘是圆的,但是磁盘我们在理解时(逻辑上) 可以像磁带一样去延展开,变成线性结构。
磁盘的逻辑线性结构
每一段都有无数个扇区
因此整个磁盘就可以被抽象成一个以扇区为基本单位的数组(集合)
由于数组的下标是唯一的,因此我们可以根据下标去反推在哪个扇面,哪个磁道,哪个扇区
每个柱面的磁道数目是一致的(只需要控制好密度即可)。但是现在的技术已经能做到扇区的长度一致了。
OS是可以控制硬盘的,但是如何管理硬盘?就是靠这样的线性结构!
LBA寻址法
对于OS而言,就可以进行这样抽象过的逻辑结构去管理磁盘
在OS中,对应的地址称为LBA地址(logic block address)逻辑地址。
文件系统与磁盘管理
磁盘是一个巨大的存储介质,假设一个磁盘800G,那么就需要分区管理
磁盘太大:磁盘分区
OS去管理磁盘的时候:先描述后组织。对于800G的硬盘只需要定义一个结构,内部包含起始与结束。定义一个数组包含5个元素即可。
当然。这200G(一个分区)还是太大,应该继续分层管理分成10G、5G(block group0, block group 1)等小区域
这个东西就叫做文件系统。
Boot Block
Boot Block(引导块)是存储设备上的一部分,通常位于设备的起始位置,它的主要作用是在计算机启动过程中加载操作系统。
- Boot Block通常包含引导加载程序(Boot Loader),这是计算机启动时运行的第一个软件。
- 引导加载程序负责初始化硬件、检查系统配置,并将控制权传递给操作系统的内核。
- 在启动过程中,引导块会检测可用的启动介质,如硬盘、光盘、USB驱动器等。
- Boot Block可能会包含启动配置数据,如启动菜单、默认启动设备选择等。
Boot Block是确保计算机能够成功启动的关键部分,如果Boot Block损坏或配置错误,可能会导致系统无法启动。
Data block
存放文件内容的区域,以块的形式呈现,最常见的大小4KB----文件系统的块大小
inode block
存放某个文件的属性信息。一个文件对应一个inode。
在linux中,文件的属性与数据是分开存放的。
-li的i就是inode码的意思
OS不关心名称,只关心文件编号。linux标识文件用的是inode码。
如何将属性和数据块联系起来呢
每个数据块都在data blocks中有自己的编号,这个blocks数组就记录了数据块(单位4KB)的编号。可以去查找内容
索引的指示着在data block的那一块区域
索引分级,分为一级到多级索引(存在多级映射)
0-11块为一级索引存放文件内容的存储位置
12-13为二级索引。通过二级索引在data blocks中找到的存储块存在着一级索引。
Block Bitmap
采用位图的结构用来揭示,哪些data blocks的单元被使用,哪些没有被使用。
所以删除文件时,只需要位图制成0并取消索引即可,不需要去释放块空间。对属性和内容没有任何关系。这就是为什么下载慢删除快的原因。
Inode Bitmap
inode位图用来管理inode结构有没有被合法使用(伪删除)
Group Descriptor Table(GDT)
组描述符表,描述的是整个分组的使用情况、使用信息。
超级块super block
保存整个文件系统的基本信息,不会在每个分组都存在。
格式化:
每一个分区使用之前,都必须提前将文件系统的某些属性信息提前设置到对应的分区中,方便我们后续使用分区。
总结


如何理解目录
inode表示文件的所有属性,文件名不属于inode内的属性。
那我们怎么将文件名与inode关联起来呢?
文件 = 内容+属性
对于一个目录而言,也存在自己的内容。文件的内容就是内部文件的inode与内部文件名的映射。
因此,在一个目录内部无法使用相同的文件名:防止出现映射错误
没有w就意味着的无法将文件名与inode的对应信息进行关系的映射。
目录可以将文件名与inode编号进行映射,那么目录的inode如何确定呢?
根目录/名称与inode是确定的,可以确定根目录在哪里,通过路径就能找到对应的目录
以下是inode结构内部包含的文件信息
文件类型:例如可执行文件、块特殊文件等。
权限:如读、写权限等。
所有者:文件的所有者。
组:文件所属的组。
文件大小:文件的大小。
文件访问、更改和修改时间:Linux/Unix系统不存储文件创建时间,但会记录文件的访问、更改和修改时间。
文件删除时间:文件被删除的时间。
链接数:文件的软链接和硬链接数量。
扩展属性:例如“仅追加”属性,或者“无人可删除文件”属性,包括root用户也不能删除(不可变属性)。
访问控制列表(ACLs):控制文件访问的列表
补充
OS如何管理内存
内存与磁盘的数据交互的固定单位4kb的原因
1.提高硬件IO效率
减少IO次数,减少磁盘等待,空间换时间---硬件
2.提高软件执行效率
根据局部性原则,存在预加载机制,提升软件运行的效率。
OS管理内存时,先描述,后组织,只需要将内存单元处理成一个数组即可
struct page mem_array[10000]
其中struct page内部存在着内存page页的必要属性信息。
我们要访问一个内存时,先找到这个4kb对应的page,就能在OS找到对应的页框,去找到合适的物理内存。
其实所有申请内存的动作,都是在访问内存page数组。
补充2:linux中,我们在进程中打开的每一个文件,都有自己独立的文件页缓冲区和inode属性
数据写入到磁盘:三次拷贝。C缓冲区、文件缓冲区、磁盘,每次写入都要一次拷贝。