Linux:理解磁盘与文件系统

news2024/11/16 23:51:25

文章目录

  • 前面基础的总结
  • 文件系统
    • 文件的管理目的问题
    • 文件的管理内容问题
  • 磁盘
    • 磁盘的结构和基本原理
    • 磁盘的分区
    • 磁盘的索引原理
    • 磁盘的逻辑抽象写入

本篇主要对于磁盘进行深入的理解,从而对于文件系统有一个基本的认识

前面基础的总结

在开始对文件系统做理解前,先对于前面的文件部分进行初步的总结

如何理解操作系统管理文件这个过程呢?

当进程运行到特定的代码语句时,需要对于文件进行访问,在操作系统内部会有关于当前进程的PCB,通过这个PCB可以找到一个指针,这个指针指向的结构体是专门用来管理文件的结构体,而在这个结构体中,又包含一个指针数组,这个指针数组也叫做进程文件描述符表,而数组中存储的是一个一个的指针,这些指针又分别指向对应的结构体,这个指向的结构体就是用来描述文件的结构体,每一个结构体都对应着磁盘上的文件信息,这样就把从语言,到操作系统,到磁盘外部这三个模块建立起来了联系

简单来说,当语言层面需要用到关于文件的操作时,就会调用系统调用的接口,操作系统作为内存中的管理者,就会承担起接受系统调用接口的责任,因此就会通过这个进程在内存中创建的PCB,找到指向管理文件的结构体,同时,操作系统会把磁盘中的文件加载到内存中,为这个文件建立起来一个描述文件的结构体,在进程的PCB找到的这个文件描述符表中,就会与这个建立起来的专门用来描述外部的文件建立一定的联系,这样就形成了一张网,建立起来了联系,因此我们说,操作系统在访问文件的过程中,它只认识文件描述符,基于这样的原理,就可以很轻松的理解重定向的原理,所谓重定向的原理就是把文件描述符进行了一次覆盖,用新的描述符代替原来旧的描述符,这样当原本向显示器中打印的信息就会被重定向到其他指定的文件,它背后的原理就是因为原来向显示器中打印文件的文件描述符被覆盖成了一个新的文件描述符,这样就实现了重定向的基本原理

上述就是关于操作系统管理文件的一个过程

如何理解一切皆文件?

在操作系统中,由于存在上述的体系,因此就存在这样的技术,可以将外部的硬件用描述文件的结构体表示出来,这样的技术也叫做虚拟文件系统,在这样的技术下,就可以实现了将每一个硬件的信息都用一定的文件描述的方法进行一些表示,这样在把文件加载到内存中后,就可以参与到上述所表示的文件系统的运作中,也就是说,虚拟文件系统就是将不同硬件的读写方式用相同的文件结构体来描述出来,在文件结构体中存在包括但不限于有读和写的方法,将不同硬件的读写方式分别录入到这样的文件系统中,就可以达到特定的想要的效果,也就能做到屏蔽不同的硬件带来的属性差异,而能在操作系统中用相同的方式实现文件接口的调用,来进行方便于文件的管理

上述就是关于一切皆文件的理解,在这样的基础上,下一步是进行了关于缓冲区的概念

如何理解缓冲区?

在Linux系统中,存在有两种意义的缓冲区,一种是语言类提供给我们的缓冲区,一种是操作系统向外部进行交互的时候使用的内核缓冲区,不管是什么样的缓冲区,它们的主要目的都是为了提升效率,使得只需要将请求传递给缓冲区,就能立刻拿到所需要的返回值信息,可能是返回成功也可能是返回的错误信息,至于后续的操作就不在用户的考虑范围内,如何将信息从缓冲区刷新到指定的位置就交由操作系统来完成

基于上面所说的这几点理论,下面来对文件系统进行进一步的理解

文件系统

文件的管理目的问题

在磁盘中存在很多很多的文件,而实际上只有很少的一部分文件是要被打开的,换句话说,只有很少的文件是需要被加载到内存中的,大致上可以把文件分成两种文件:

  1. 已经打开的文件
  2. 大多数都是没有被打开的文件,它们存储在磁盘中

对于第一种文件来说,如何进行管理?答案是有操作系统在内存中对这些文件进行管理,那第二种文件需不需要管理呢?答案是肯定是需要的,管理的目的是为了快速查找,将这些文件进行管理起来,才能在需要的时候可以立刻定位到所需要的位置,进而进行调用或是其他的各种操作,那么初步的,将管理这些文件的目标设置为需要定位文件,提供一个合适的路径,进而可以在所需要的时候进行快速的定位

文件的管理内容问题

在磁盘中管理的文件,管理的本质是什么?

从前面的知识体系中,有这样的基本认知:文件 = 内容 + 属性,所以管理文件的本质就是管理的是文件的内容和文件的属性,也就是说是目的是为了方便用户进行文件的增删查改,换句话说是为了便利与操作系统对于文件的增删查改

文件的内容是被放置到哪里的?

这是一个很显然的问题,文件的内容当然是存储在了磁盘中,换句话说是存储在了一个硬件,一个物理的存储结构中

文件要在哪里被管理?

这也是一个很显然的问题,文件的管理当然要被放置在操作系统中进行管理了,操作系统本质上来说是内存中的管理,也就是一种逻辑的存储结构

因此现在的问题是,如何将文件的管理从硬件的物理存储结构转换成逻辑抽象的逻辑存储结构呢?这就是本篇要讨论的核心问题,这对于理解操作系统管理磁盘,和理解文件系统来说是至关重要的,进而会延伸到软硬链接的问题

磁盘

那么想要理解磁盘是如何管理内容,就必须要先走近磁盘,理解它内部的结构信息

磁盘的结构和基本原理

在这里插入图片描述
上述展示的是关于一个磁盘的结构,关于上述的复杂结构也不必过多理解,只需要知道磁盘总体来说是由磁片和磁头组成的,而在一个磁片中是存在多个这样的结构的,每一个磁头会用于寻找一个磁片中的信息,磁片会随着主轴而进行高速旋转,而磁头是可以左右进行旋转的,而磁片的旋转和磁头的旋转就可以保证磁头可以访问到磁片中的任意一个位置的信息,也就达到了访问的目的

磁盘的分区

在这里插入图片描述
磁盘的信息是如何存储的?结论肯定是经过一定的区域划分才能进行数据的存储,而划分的方式就是通过上图进行划分的

对于单个磁片来说,可以划分为很多个磁道,而每一个磁道又会组成一个一个的扇区,而扇区就是最小的存储单元,对于不同的扇区来说存储的数据密度肯定是不相同的,这也就能保证虽然离中心点近的扇区区域小,但是依旧可以保证存储的空间和外部的扇区存储的空间是相同的

基于上述的这个原理,可以做出一些初步的总结

  1. 一个盘面可以有多个同心的轨道
  2. 一圈磁道可以有多个扇形的扇区组成
  3. 扇区是磁片的最小存储单元,通常是512字节或是4kb

磁盘的索引原理

在这里插入图片描述
上图展示的是磁盘的一个立体的图片,一个磁盘是由多个磁片所组成的,这是可以看出的,因此也就包括了磁道,扇区,和柱面这样的组成部分

现在的问题是:当需要对于磁盘中某个特定的位置进行写入,如何具体的定位呢?

  1. 选择某一面,本质上来说是选择一个合适的磁头
  2. 选择这个面上的吗,某个轨道
  3. 选择这个磁道上的某个扇区

这样的过程就叫做CHS定位法,通过这样的三个步骤,就可以定位到所需要的某个扇区,进而进行数据的读和写,这样就可以向任意一个或者多个的连续扇区中进行写入,也可以进行随机写入

磁盘的逻辑抽象写入

磁盘的外部结构已经基本理解了,那么操作系统自然是需要得到磁盘中的信息的,那么操作系统是如何读取和存储关于磁盘的信息的呢?是直接存储这些物理结构吗?答案是否定的,在操作系统内部,会把整个磁盘想象成一个数组,不断的拉长拉长再拉长,这样就能把这样的磁盘抽象成数组,也就是把磁盘的存储的逻辑抽象结构描述了出来

将磁盘想象成一个线性的空间:

在这里插入图片描述
通过上述的这个过程,就可以把整个磁盘用一个数组来表示起来,这样就能像访问数组一样进行访问磁盘,进而进行数据的增删查改等等行为…

例如给定一个字符的下标是123,那么假设下标1-100000是第一面磁盘,下标1-10000是第一个磁道,那么就可以有如下的定位计算方式:

1234 / 100000 = 0 表示现在是第一个磁片
1234 / 10000 = 0 表示现在是第一个磁道
123 % 10000 = 123 表示现在是123所在的扇区

在实际的映射计算中可能比上述的计算要复杂的多,但是基本原理已经从上述的计算中可以看的出来,的确通过这样抽象出来的数组可以找到磁盘中对应的位置

操作系统,可以按照扇区为单位进行存取,也可以基于文件系统,按照文件块为单位进行数据的存储,一般来说选择后者进行数据的存储,这里按照八个扇区为一个文件块,因此就可以把扇区又进行划分,每八个扇区为一个文件块

LBA地址:全称叫做logical block address,LBA作为地址,可以对应到CHS地址,也就是通过操作系统内部抽象出来的逻辑结构的地址,可以与外部的磁盘的实际地址做出一个对应,这样就完成了初步的目标

到这里,就把存储设备的管理,在操作系统层面转换成了对数组的增删查改

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1390683.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【PostgreSQL】安装和常用命令教程

PostgreSQL window安装教程 window安装PostgreSQL 建表语句: DROP TABLE IF EXISTS student; CREATE TABLE student (id serial NOT NULL,name varchar(100) NOT NULL,sex varchar(5) NOT NULL,PRIMARY KEY (id) );INSERT INTO student (id, name, sex) VALUES (…

Ubuntu 22.04安装使用easyconnect

EasyConnect 百度百科,EasyConnect能够帮助您在办公室之外使用公司内网的所有系统及应用。在您的公司部署深信服远程应用发布解决方案后,您的公司所有业务系统及应用都可以轻松迁移至移动互联网上。您可以通过手机、PAD等智能移动终端随时随地开展您的业…

程序员接私活还不知道这几个平台?那你真的亏了!

程序员接私活现在已经是一个老生常谈的话题了,现在市面上各种程序员接单平台层出不穷,也参差不齐,有比较老牌的知名平台,也有比较好的新兴平台,如此多的平台就容易让人眼花缭乱,不知道该如何选择。 这期文…

CSS3背景样式详解(图像大小,图像位置等)

背景样式 在CSS3中,新增了3个背景属性 属性说明background-size背景大小background-origin背景位置background-clip背景剪切 background-size属性 概念:在CSS3之前,我们是不能用CSS来控制背景图片大小的,背景图片的大小都是由…

【HarmonyOS】消息通知场景的实现

从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…

(N-139)基于springboot,vue宠物领养系统

开发工具:IDEA 服务器:Tomcat9.0, jdk1.8 项目构建:maven 数据库:mysql5.7 系统分前后台,项目采用前后端分离 前端技术:vue3element-plus 服务端技术:springbootmybatis-plusr…

C练习——杨辉三角

题目: 打印近似杨辉三角,行数n自选 百度找的杨辉三角,参考一下: 解析: 把它的全部元素左对齐,就可以看成近似杨辉三角的样子 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 …… 每个数等于它上方两数…

C++基础1

一、形参带默认值的函数 二、inline内联函数 内联函数是一种在编译器处理时,将函数的实际代码插入到调用处的方法。通常,函数调用涉及一定的开销,包括保存和恢复调用现场、跳转到函数的代码位置等。而内联函数通过在调用处直接插入函数的代码…

十五.流程控制与游标

流程控制与游标 1.流程控制1.1分支结构之IF1.2分支结构值CASE1.3循环结构之LOOP1.4循环结构之WHILE1.5循环结构之REPEAT1.6跳转语句之LEAVE语句1.7跳转语句之ITERATE语句 2.游标2.1什么是游标2.2使用游标步骤4.3举例4.5小结 1.流程控制 解决复杂问题不可能通过一个 SQL 语句完…

智慧校园大数据平台架构

平台架构 基础硬件层 基础硬件层是由一组低廉的PC或服务器组合构建而成。基础硬件层主要承载着数据的存储、运算、容错、调度和通信等任务,对基础应用层下达的指令进行执行和反馈。 数据集成 大数据特征表现在实时、交互、海量等方面,并且以半结构化、非结构化数据为主,价…

SpringBoot中 如何优雅的 重试调用 第三方API?

引言 在实际的应用中,我们经常需要调用第三方API来获取数据或执行某些操作。然而,由于网络不稳定、第三方服务异常等原因,API调用可能会失败。为了提高系统的稳定性和可靠性,我们通常会考虑实现重试机制。 本文将深入探讨如何在…

基于JAVA的固始鹅块销售系统 开源项目

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 鹅块类型模块2.3 固始鹅块模块2.4 鹅块订单模块2.5 评论管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 鹅块类型表3.2.2 鹅块表3.2.3 鹅块订单表3.2.4 鹅块评论表 四、系统展示五、核心代码5.…

vue前端开发自学,祖孙多层级组件嵌套关系数据传输

vue前端开发自学,祖孙多层级组件嵌套关系数据传输!官方提供了一个解决方案,就是,在根组件内使用provide,哪个子孙组件想调用这个数据,就可以inject接收就行了。虽然是方便了,但是这个有点要求,就是只能自上…

重新认识Word——页眉页脚

重新认识Word——页眉页脚 节设置页脚第X页,共Y页 奇偶页不同页眉包含章节号清除页眉横线 我们之前已经全面的构建了我们的文章,现在我们来了解一下,我们毕业论文的页眉(页面信息)页脚(页码)的设…

JVM运行时数据区(下篇)

紧接上篇:JVM运行时数据区(上篇)-CSDN博客 堆 一般Java程序中堆内存是空间最大的一块内存区域。创建出来的对象都存在于堆上。 栈上的局部变量表中,可以存放堆上对象的引用。静态变量也可以存放堆对象的引用,通过静态…

Java中的Servlet你了解吗?

☆* o(≧▽≦)o *☆嗨~我是小奥🍹 📄📄📄个人博客:小奥的博客 📄📄📄CSDN:个人CSDN 📙📙📙Github:传送门 📅&a…

《数据结构》实验报告-实验一 线性结构及其应用

《数据结构》实验报告-实验一 线性结构及其应用 一、问题分析 题目要求收集两个班的学生成绩信息并按降序排列,其中每个学生的数据包括班级,学号和成绩信息,需要用一个结构体作为整体存储。并且数据是可以不断添加进来的,可以用…

c语言实现b树

概述:B 树(B-tree)是一种自平衡的搜索树数据结构,广泛应用于数据库和文件系统等领域。它的设计旨在提供一种高效的插入、删除和查找操作,同时保持树的平衡,确保各个节点的深度相差不大。 B 树的特点包括&a…

Vue keep-alive的使用和原理解析

✨ 专栏介绍 在当今Web开发领域中,构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架,正是为了满足这些需求而诞生。它采用了MVVM架构模式,并通过数据驱动和组件化的方式,使…

基于ssm的中文学习系统的设计与实现+jsp论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本中文学习系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…