【linux】:模拟文件基本操作以及文件在磁盘中如何存储的学习(下)

简介: 【linux】:模拟文件基本操作以及文件在磁盘中如何存储的学习(下)

二、磁盘文件



一个文件在不被打开的时候是存储在磁盘中的,那么这个文件如何在磁盘中合理的存储呢?要了解文件如何在磁盘中存储,我们要先了解磁盘,如下图所示:

d7c02aa068e94f5295241b1bdaaa40cb.png




磁盘有几个重要的接口,分别是马达,盘片,磁头,一个磁头可以读取一个面的数据。磁盘中每个数据都是0 1,,01 的表示有很多种,波峰波谷,南极北极等,并且磁头和盘面是不接触的,只不过他们离的距离很近,下面是盘面的结构:

5053c2bc53d3490f8b787865c9a57556.png


在盘面上有扇区和磁道,一般的磁盘所有的扇区都是512字节,那么如何在硬件上定位一个扇区呢?要定位扇区首先要定位哪一个盘面,而盘面又是通过磁头确定的,因为磁头有相应的编号,通过磁头的编号就能找到哪个面了,找到面后我们要找扇区需要先定位在哪一个磁道,而磁道是通过半径决定的,在确定在该磁道在哪一个扇区,根据扇区的编号定位一个扇区。理解了以上的知识,我们就能谈文件是如何在磁盘中存储的了,一个普通文件(属性+数据)都是数据0,1,对于0 1这样的数据无非就是占用一个或者多个扇区,来进行自己的数据存储的,我们既然能够用CHS定位任意一个扇区,我们就能定位任意多个扇区,从而将文件从硬件角度,进行读取或者写入。


下面我们根据操作系统和磁盘的关系分析一下磁盘:


根据我们上面的描述,如果操作系统能够得知任意一个CHS地址,就能访问任意一个扇区,那么操作系统内部是不是直接使用的CHS地址呢?答案其实不是,因为操作系统是软件,磁盘是硬件,硬件定位一个地址,如果操作系统直接用了这个地址,玩意硬件变了呢?这样的话操作系统也要发生变化,操作系统要和硬件做好解耦工作所以不能直接用硬件上的地址。并且扇区才512字节,操作系统实际向外设写入的基本单位是4KB,与扇区并不符合,所以操作系统需要有一套新的地址来进行块级别的访问。现在我们画一张图表示一下磁道中的扇区结构:

5c30d64277a24ce38fa703b309d7d1a1.png

每一个扇区都是512,我们从头开始数512就找到了第一个扇区。这就印证了计算机常规的访问方式:起始地址 + 偏移量的方式,也就是说我们只需要知道数据块的起始地址(第一个扇区的下标地址)+4KB(块的类型)如下图所示:

4edb2b231e8d48208d5b23fbbd59e0bb.png


所以块的地址,本质就是数组的一个下标N,以后我们表示一个块,我们可以采用线性下标N的方式定位任何一个块了。OS->N->LBA->逻辑块地址,前面我们说了,磁盘只认CHS方式,所以要让这两个联系起来就需要LBA到CHS互相转化。就拿我们的电脑而言,我们进入我的电脑发现有ABCD 4个盘或者几个盘,而实际只有一个盘,是因为将这一个盘分区管理得到的四个盘,就如下图所示:

c87b8f024dcc480eadbc68a851ddd33d.png


如上图所示,我们将500G的磁盘分为150G一组,那么在这个150G的盘中都有什么呢?其实上图已经给出答案了,Boot Block主要保存与操作系统启动相关的内容,比如分区表,操作系统镜像的地址等,所以一般分区会在0号盘面0号磁道1号扇区保存的,对应的在C盘的某个区域存储,而这个块又被称为启动块,如果这个块坏了就不能开机了。文件= 内容+属性,linux下是将内容和属性分离的。


1.SuperBlock保存的是文件系统的所有属性信息,比如文件系统的类型,整个分组的情况。而SuperBlock在各个分组里面可能都存在,而且是统一更新的,这样做的原因是防止SuperBlock区域坏掉,如果出现故障,整个分区不可以再被使用。


2.GroupDescriptorTable:组描述符,改组内的详细统计等属性信息。


3.inodeTable:一个文件内部所有属性的集合,inode节点(128字节),一个文件一个inode,其中即便是一个分区,内部也会存在大量的文件即会存在大量的inode节点,一个group需要有一个区域,专门保存该group内的所有文件的inode节点。分组内部,可能存在多个inode,需要将inode区分开来,每一个inode都有自己的inode编号,inode编号也属于对应文件的属性id。


4.DateBlocks:文件的内容是变化的,我们是用数据块来进行文件的内容的保存的,所以一个有效文件要保存内容,就需要[1,n]数据块,那么如果是多个文件所以就需要更多的数据块,而DateBlock就是保存这些数据块的。而linux查找文件是要根据inode编号来进行文件查找的,包括读取内容,一个inode对应一个文件,而改文件inode属性和改文件对应的数据块是有映射关系的。


5.块位图BlockBitmap:BlockBitmap中记录着DateBlock中哪个数据块已经被占用,哪个数据块没有被占用。


6.inode位图inodeBitmap:每个bit表示一个inode是否空闲可用


总结



本篇文章的主要内容是在上一篇文件操作的基础上再次深刻理解系统文件操作,然后我们又大致讲解了磁盘的物理空间是什么样的是如何存储数据的,通过软硬件共同学习我们能知道文件的各个属性在磁盘中是如何存储的,每个分

目录
相关文章
|
14天前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
66 34
|
8天前
|
Linux
Linux文件与目录的日常
目录的切换 一般使用(”pwd“)显示当前所在的目录 比如:当前目录是在home下面的,与用户名相同的文件夹,可以使用(”cd“)命令来切换目录; 进入下载目录(”cd home/a/下载“)这种从给目录开头的一长串路经”叫做绝对路径“; 进入图片目录(”cd .. /图片/“)".."代表当前路径的上级路径,相对于当前的目录而言的”叫做相对路径“,(”.“)代表当前路径; 如果,想快速切换,上一个所在目录可以(”cd - / cd..“); 如果,想快速切换,追原始的目录可以(”cd --“); 查看目录及文件
33 14
|
4天前
|
Linux Shell
Linux 将所有文件和目录名重命名为小写
Linux 将所有文件和目录名重命名为小写
20 3
|
1月前
|
Ubuntu Linux 网络安全
Linux磁盘挂接教程
Linux磁盘挂接教程
68 14
|
2月前
|
Ubuntu Linux Go
golang编译成Linux可运行文件
本文介绍了如何在 Linux 上编译和运行 Golang 程序,涵盖了本地编译和交叉编译的步骤。通过这些步骤,您可以轻松地将 Golang 程序编译成适合 Linux 平台的可执行文件,并在目标服务器上运行。掌握这些技巧,可以提高开发和部署 Golang 应用的效率。
319 14
|
2月前
|
存储 NoSQL Linux
linux积累-core文件是干啥的
核心文件是Linux系统在程序崩溃时生成的重要调试文件,通过分析核心文件,开发者可以找到程序崩溃的原因并进行调试和修复。本文详细介绍了核心文件的生成、配置、查看和分析方法
178 6
|
9月前
|
Linux
linux(二十八)磁盘管理类命令df、du和free查看磁盘和目录空间占用
linux(二十八)磁盘管理类命令df、du和free查看磁盘和目录空间占用
192 0
|
9月前
|
机器学习/深度学习 缓存 监控
linux查看CPU、内存、网络、磁盘IO命令
`Linux`系统中,使用`top`命令查看CPU状态,要查看CPU详细信息,可利用`cat /proc/cpuinfo`相关命令。`free`命令用于查看内存使用情况。网络相关命令包括`ifconfig`(查看网卡状态)、`ifdown/ifup`(禁用/启用网卡)、`netstat`(列出网络连接,如`-tuln`组合)以及`nslookup`、`ping`、`telnet`、`traceroute`等。磁盘IO方面,`iostat`(如`-k -p ALL`)显示磁盘IO统计,`iotop`(如`-o -d 1`)则用于查看磁盘IO瓶颈。
410 10
|
9月前
|
IDE Linux Shell
linux查看硬盘是否挂载--和磁盘相关命令
linux查看硬盘是否挂载--和磁盘相关命令
297 0
|
9月前
|
运维 Linux
Linux系统调优详解(五)——磁盘IO状态查看命令
Linux系统调优详解(五)——磁盘IO状态查看命令
196 5