【Linux】操作系统中的文件系统管理:磁盘结构、逻辑存储与文件访问机制

文章目录

  • 前言:
  • 1. 磁盘机械结构
  • 2. 磁盘物理结构
  • 3. 磁盘的逻辑存储
    • 3. 1. 文件名呢?
    • 3.2 对文件的增删查改与 路径
    • 3.3. 文件
  • 4. 软硬链接
    • 4.1. 操作观察现象
    • 4.2. 软硬链接的原理
    • 4.3. 软硬链接的应用场景
  • 总结

前言:

在现代操作系统中,文件系统的管理是核心功能之一,它负责处理文件的存储、访问和组织。文件系统不仅需要高效地管理磁盘空间,还要能够快速地定位和检索文件。本文将深入探讨文件系统的工作原理,包括磁盘的物理结构、逻辑存储方式以及操作系统如何管理文件和目录。通过理解这些概念,我们可以更好地理解操作系统如何与硬件交互,以及如何优化文件系统的使用。

进程打开文件!
系统中是不是所有的文件都被被打开了呢? 大部分文件是没有被打开的。
如果没有被打开呢? 在哪里保存?磁盘,SSD。OS 要不要管理一下磁盘文件呢? 如何让OS快速定位一个文件。

1. 磁盘机械结构

在这里插入图片描述

盘片(Platters):硬盘内部通常包含多个金属或玻璃盘片,数据会被存储在这些盘片的表面上。盘片通常被涂覆有磁性材料,用于记录数据。

磁头(Read/Write Heads):硬盘内部会有多个磁头,它们位于每个盘片的上下两面,用于读取和写入数据。磁头会在盘片的表面上移动,以实现对数据的访问。

手臂(Actuator Arm):硬盘内部还包含一个或多个手臂,用于支撑磁头,并能够在盘片的表面上移动,从而让磁头能够定位到正确的磁道上进行读写操作。

主轴电机(Spindle Motor):硬盘内部的主轴电机用于旋转盘片,使得磁头能够在正确的位置上读取或写入数据。硬盘的旋转速度通常以每分钟转数(RPM)来表示。

2. 磁盘物理结构

在这里插入图片描述
磁道/柱面:唯一的编号。
扇区:是磁盘IO的基本单位(512字节,4KB) ,但不一定是系统和磁盘IO的基本单位。
磁头、盘面:都有唯一的编号

如果我想访问磁盘中的一个扇区:
通过磁头定位:磁道/柱面(cylinder),使用哪一个磁头(head),哪一个扇区(sector)。(CHS定位法)
那么任何文件,不就是多个扇区承载的数据吗?

3. 磁盘的逻辑存储

在这里插入图片描述
Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的,

  • Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。政府管理各区的例 子
  • 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super
    Block的信息被破坏,可以说整个文件系统结构就被破坏了
  • GDT,Group Descriptor Table:块组描述符,描述块组属性信息
  • 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。
  • i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等
  • 数据区:存放文件内容

Linux 磁盘文件特性:文件 = 内容 + 属性 (内容和属性分开存储)
类容: 大小不确定,可能很大,可能很小。
属性:固定大小的。(属性的类别是一样的,只不过每个类别内容不一样)

struct inode // 128字节
{// inode编号 (识别唯一性)// 类型// 大小// 权限// 时间// ...
}

注意:文件名不属于文件属性!
系统中,标识一个文件不是用的文件名,而是 inode!

3. 1. 文件名呢?

  • 任何一个普通文件,一定在一个目录中。
  • 目录 是不是文件?
    是,inode(inode编号) + 目录内容(文件名:inode编号的映射关系)
  • 如果一个目录没有r , w , x 表现是什么?
    因为创建文件最终是要修改目录的内容的,所以没有就创建不了。

3.2 对文件的增删查改与 路径

对一个文件,进行增删查改,都和改文件所在的目录由关系!
查找一个文件,在内核中,都要逆向的递归得到 / ,从根目录进行路径解析。

一个被写入文件系统的分区,要被Linux使用,必须要把这个文件具有文件系统的分区进行“挂载”。
一个文件系统所对应的分区,挂载在对应的目录中! 分区的访问,都是通过所挂载的路径访问的!

访问一个文件,可以根据路径前缀,优先区分出文件在哪一个分区下!

  1. open、fopen,都需要我们提供文件路径的
  2. 进程的当前路径!

3.3. 文件

  1. 打开的文件
  2. 没有打开的文件

4. 软硬链接

4.1. 操作观察现象

  • 创建软链接
ln -s test.txt soft 

软连接本质是一个文件,有独立的 inode

  • 创建硬链接
ln hello.txt link.hard

硬链接本质不是一个独立的文件,因为它的 inode 编号和目标文件相同,写入道指定目录的数据块中。

4.2. 软硬链接的原理

  • 硬链接本质就是在指定的目录下,插入新的文件名和目标文件的映射关系,并让 inode 引用计数++
  • 软链接本质就是一个独立文件,软链接内容里面存放的目标文件的路径!软链接类似 windows 下的快捷方式。

4.3. 软硬链接的应用场景

硬链接:维护目录间映射的关系,一个目录下有多少个子目录:硬链接数 - 2 计算得到。

因为环路问题,不允许给目录建立硬链接。

总结

本文详细介绍了文件系统的工作机制,从磁盘的物理结构到逻辑存储,再到操作系统如何管理文件和目录。我们了解到,尽管大部分文件在任何给定时间都是未被打开的,操作系统仍然需要有效地管理这些文件。磁盘的机械结构和物理结构决定了数据的存储方式,而文件系统的逻辑结构则决定了文件的组织和访问方式。

Linux文件系统,如ext2,通过使用块设备、块组、超级块、块位图和inode等概念来管理文件。每个文件都有其对应的inode,其中包含了文件的属性,而文件名则存储在目录中,目录本身也是一个文件。操作系统通过路径解析来查找文件,并可能需要跨多个分区进行搜索。

此外,我们还探讨了硬链接和软链接的概念及其应用场景。硬链接通过增加inode的引用计数来实现,而软链接则是一个包含目标文件路径的独立文件。硬链接常用于维护目录间的映射关系,而软链接则类似于Windows下的快捷方式。

通过理解这些概念,用户和开发者可以更有效地与文件系统交互,优化存储空间的使用,并提高文件访问的效率。操作系统的文件管理是一个复杂但至关重要的过程,它确保了数据的安全性、完整性和可访问性

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

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

相关文章

day27-完全平方数(背包问题)

题目描述 给你一个整数 n ,返回 和为 n 的完全平方数的最少数量 。 完全平方数 是一个整数,其值等于另一个整数的平方;换句话说,其值等于一个整数自乘的积。例如,1、4、9 和 16 都是完全平方数,而 3 和 1…

基于人工智能的运输路径规划系统

基于人工智能的运输路径规划系统是现代物流领域中一项重要的技术应用,该系统通过集成先进的人工智能算法和数据分析技术,为运输行业提供了更为高效、准确的路径规划服务。以下是关于该系统的详细介绍: 一、系统概述 基于人工智能的运输路径…

Python基础:在多个.py文件组成的项目中如何安全的使用文件路径(绝对路径安全,相对路径可移植性好,如何选?)

在Python项目中使用相对路径时,路径的计算是基于当前执行脚本的位置,即当前工作目录(Current Working Directory, CWD)。这通常是你从中启动Python解释器的目录。这种方式在简单脚本或当你直接从命令行运行单个脚本文件时行得通,但在较大的项目或多层目录结构中可能导致路…

Flutter 中的 PopupMenuTheme 小部件:全面指南

Flutter 中的 PopupMenuTheme 小部件:全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架,它允许开发者使用 Dart 语言构建美观、响应式的移动、Web 和桌面应用。Flutter 的 Material 组件库中包含了丰富的 UI 组件,其中 PopupMenuButt…

基于Springboot+vue实现的汽车服务管理系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:spring…

《effective c++》学习笔记一

从今天开始看《effective c》这本书,把学到的东西当做笔记记下来,算是督促自己学习吧,也算是和大家一起分享一点东西,理解不当的地方,请谅解。(每天更新三个条款)。 条款1:视C为一个…

外贸如何让新客户返单以及转介绍?

要让外贸新客户返单以及转介绍,关键在于提供卓越的服务、建立信任和维护良好的客户关系。以下方法可以借鉴: 1. 提供优质的产品和服务 - 产品质量保证:确保产品质量始终符合或超过客户预期。 - 定制服务:根据客户需求提供个性化…

45.自定义线程池(三)-拒绝策略

拒绝策略采用函数式接口参数传入&#xff0c;策略模式 FunctionalInterface public interface RejectPolicy<T> {void reject(BlockingQueue<T> queue, T task); } package com.xkj.thread.pool;import com.aspose.words.Run; import lombok.extern.slf4j.Slf4j;…

Flutter 中的 ButtonBarTheme 小部件:全面指南

Flutter 中的 ButtonBarTheme 小部件&#xff1a;全面指南 Flutter 是一个由 Google 开发的跨平台 UI 框架&#xff0c;它提供了丰富的组件来帮助开发者构建高性能、美观的应用。在 Flutter 的 Material 组件库中&#xff0c;ButtonBar 是一个用于展示按钮集合的组件&#xff…

java多线程之synchronized详解

锁的内存语义 锁可以让临界区互斥执行&#xff0c;还可以让释放锁的线程向同一个锁的线程发送消息锁的释放要遵循Happens-before原则&#xff08;锁规则&#xff1a;解锁必然发生在最后的加锁之前&#xff09;锁在java中的具体表现时Synchronized和Lock 复现步骤 通过gradle…

SaaS 电商设计 (十一) 那些高并发电商系统的限流方案设计

目录 一.什么是限流二.怎么做限流呢2.1 有哪些常见的系统限流算法2.1.1 固定窗口2.1.1 滑动窗口2.1.2 令牌桶2.1.3 漏桶算法 2.2 常见的限流方式2.2.1 单机限流&集群限流2.2.2 前置限流&后置限流 2.3 实际落地是怎么做的2.3.1 流量链路2.3.2 各链路限流2.3.2.1 网关层2…

Spring Boot(七十七):SpringBoot实现接口内容协商功能

1 什么是内容协商 简单说就是服务提供方根据客户端所支持的格式来返回对应的报文,在 Spring 中,REST API 基本上都是以 json 格式进行返回,而如果需要一个接口即支持 json,又支持其他格式,开发和维护多套代码显然是不合理的,而 Spring 又恰好提供了该功能,那便是Conten…

重学java 56. Map集合

我们要拥有一定成功的信念 —— 24.6.3 一、双列集合的集合框架 HashMap 1.特点: a.key唯一,value可重复 b.无序 c.无索引 d.线程不安全 e.可以存null键,null值 2.数据结构:哈希表 LinkedHashMap&#xff08;继承HashMap&#xff09; 1.特点: a.key唯一,value可重复 b.有序 c.无…

Spring All系列教程学习下

SpringAll SpringAll对应的博客 java-developer-document - 别人的学习笔记 Spring All系列教程 该仓库为个人博客https://mrbird.cc中Spring系列源码&#xff0c;包含Spring Boot、Spring Boot & Shiro、Spring Cloud&#xff0c;Spring Boot & Spring Security &a…

前端 JS 经典:LRU 缓存算法

前言&#xff1a;什么是 LRU 呢&#xff0c;单词全拼 Least Recently Used&#xff0c;意思是最久未使用。这个算法是做缓存用的&#xff0c;比如&#xff0c;你要缓存一组数据&#xff0c;你要划分缓存块出来&#xff0c;因为不可能每个数据都做缓存&#xff0c;那么划出来的这…

矩阵连乘问题

#include<iostream> using namespace std; #define N 7 void MatrixChain(int p[N],int n,int m[N][N],int s[N][N]) {for(int i1;i<n;i)m[i][i]0;for(int r2;r<n;r)//有多少个相乘(规模){for(int i1;i<n-r1;i){int jir-1;m[i][j]m[i][i]m[i1][j]p[i]*p[i1]*p[j…

小熊家务帮day10- 门户管理

门户管理 1 门户介绍1.1 介绍1.2 常用技术方案 2 缓存技术方案2.1 需求分析2.1.1 C端用户界面原型2.1.2 缓存需求2.1.3 使用的工具 2.2 项目基础使用2.2.1 项目集成SpringCache2.2.2 测试Cacheable需求Service测试 2.1.3 缓存管理器&#xff08;设置过期时间&#xff09;2.1.4 …

深入理解序列化:概念、应用与技术

在计算机科学中&#xff0c;序列化&#xff08;Serialization&#xff09;是指将数据结构或对象状态转换为可存储或传输的格式的过程。这个过程允许将数据保存到文件、内存缓冲区&#xff0c;或通过网络传输至其他计算机环境&#xff0c;不受原始程序语言的限制。相对地&#x…

URL编码:讲解,抓包

URL 编码&#xff08;也称为百分号编码&#xff09;是一种在 URLs 中编码数据的方法。它将特殊字符转换为由百分号&#xff08;%&#xff09;后跟两个十六进制数字组成的格式。URL 编码通常用于将数据传递到网页或 Web 服务器时&#xff0c;以确保 URL 在传输过程中保持一致和安…

167.二叉树:另一棵树的字树(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* Tre…