文件系统和软硬链接

文章目录

  • 文件系统
    • 磁盘
    • 磁盘逻辑抽象
    • inode
  • 软硬链接
    • 软链接
    • 硬链接

文件系统

文件分为打开的文件和没有被打开的文件,而只有打开的文件是在内存的,也就是我们之前讲的,然而大部分文件都不是被打开的(当前不需要被访问的),它们都在磁盘中存放,显而易见,他们也是需要被管理的。而对于这部分文件的核心就是我们需要快速的定位它们在磁盘中的位置。

文件的管理:

  1. 打开文件进行管理
  2. 没有被打开的文件也要在磁盘中进行管理

对于打开文件和没有被打开文件的管理,我们称之为文件系统。

磁盘

磁盘是硬件,物理存储结构。
在这里插入图片描述

在这里插入图片描述

磁盘一片有两面,每一面都有一个磁头,可以左右移动,盘面是可以旋转的,所以这两个一结合,磁头就可以访问磁盘中的任意位置。一个盘面有很多的磁道,每一圈磁道可以有很多的扇形的扇区。而扇区是磁盘的最小存储单元(512字节)。
在这里插入图片描述
如果我们想向一个扇区写入,应该如何寻址?

  1. 选择磁头(head)
  2. 选择该面的那一个磁道(cylinder)
  3. 选择哪一扇区(sector)

这样的寻址方式为CHS定位法
现在可以向一个扇区进行写入,就可以向任意一个/多个扇区进行写入,可以多个扇区进行写入,当然也可以进行随机的读写。

磁盘逻辑抽象

一圈一圈的磁道我们可以想象一下一个圆可以抽象成一个长方形,所以我们的一圈圈磁道就是一个一个的圆形,所以我们可以把一个盘面抽象成一个数组,而数组元素的大小就是扇区,所以我们可以把整个磁盘也就是多个盘面抽象成一个超级大的数组。

在这里插入图片描述
所以我们根据数组的下标,然后根据每个盘面多大,每圈的磁道多大,就可以通过计算,定位到一个扇区的CHS地址。

操作系统可以根据扇区为单位进行存取,也可以基于文件系统以文件块为单位进行存取。Linux中OS一般读取的大小为8个扇区的大小(4KB),所以每次只需要给一个初始地址,然后向后读取8个单位即可,这样的以8个扇区为单位大小的起始地址为LBA地址

最终结论: 对于存储设备的管理就转化为了对数组的增删查改。

假设我们现在有500GB的空间需要我们管理,如果我们把这500GB的空间整体使用,从技术层面来说当然是可以的,但是我们用起来非常的不方便,所以我们会把一个非常大的空间进行分区,然后对分区进行管理,只需要把一个分区管好其他的分区可以复用这个分区的策略来进行管理。

在这里插入图片描述
然后可以让一个分区进行分组,然后只需要把一个组管好,其他组可以复用这个组的方式,所以对500GB的管理就转化为了对一个组的管理。所以磁盘也是设备
在这里插入图片描述
操作系统中管理文件无非即使我自己的文件信息和很多管理我的文件的信息,所以在文件系统开始用之前一定要把管理数据写入到块组中,而我的文件信息无非就是内容+属性,Linux下属性和内容是分开存储的。

格式化就是把磁盘中管理我们自己文件的信息初始化,相当于恢复出厂设置。

inode

Linux下,使用ls 加个-li选项就可以看到我们文件的indode。
在这里插入图片描述图中圈红的就是我们自己文件的inode。一般情况下一个文件一个inode,基本上inode每个文件都要有,inode在整个分区具有唯一性,Linux内核中识别文件和文件名无关,之和inode有关。由于文件我们用户用的是文件名,但是内核用的是inode,所以一定存在文件名和inode的映射关系。

在这里插入图片描述

我们在看这个图,我们会发现每个块组中包含很多的属性,我们看一下每个属性代表什么含义。

  1. 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
  2. GDT,Group Descriptor Table:块组描述符,描述块组属性信息。
  3. 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没
    有被占用
  4. inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。
  5. inode表:存放文件属性 如 文件大小,所有者,最近修改时间等
  6. 数据区:存放文件内容

inode中除了存放的有文件的属性之外,还有一个block的数组,表示自己的内容放在哪几个块中。一般来说这个数组的大小是15。后两个位置并不值就存放内容,倒数第二个存放二级映射,而倒数第一个存放三级映射。

所以后四个是存放我们自己的文件内容,而前两个是存放管理文件的内容。一般超级块没隔几个块组就会有一个,因为为了防止因为超级块坏的话整个磁盘就会挂掉,所以为了防止这种情况,如果一个坏了,就可以去后面把正确的拷贝回来,可以增强容错率。

对于普通文件来说,创建一个普通文件只需要通过inode位图找到一个没有用过的inode,然后把位图修改成1,通过inode表,索引找到inode,把属性填进去,把内容放进block中,修改blocd的位图,把内容存在的block的下标填入自己的block数组中,就搞定了。
对于目录文件来说,它的创建方式和普通文件完全一样,只不过它的内容是它目录下的文件的文件名和inode的映射关系。而删除一个文件只需要修改一个文件对应的inode位图和block位图即可。

上面说的所有都是在一个分区中,那么我们如何区分在哪一个分区呢?
每一个文件都有路径,可以通过判断路径的前缀来判断文件在哪一个分区下。

如何查找一个文件?
一般查找一个文件是,不是是打开还是怎样,文件的路径都是我们用户提供,所以每个进程都会有一个CWD,所以OS只需要通过用户给的路径确定在哪一个分区,然后依次根据文件名和inode的映射关系就可以找到我们需要的文件。

软硬链接

软链接

Linux中可以通过ln -s 的方式来建立软链接。
在这里插入图片描述
可以发现软链接是一个独立的文件,有独立的inode,文件的内容就是指向文件的路径。类似于Windows中的快捷方式。软链接就是普通文件。

硬链接

Linux中可以通过ln 的方式来建立软链接。
在这里插入图片描述
圈红的为硬链接数。

可以发现硬链接的inode和指向的文件是相同的,所以硬链接不是一个独立的文件,他是一个目录内部文件名和inode的映射关系,所以一个文字只有在硬链接数为0时,才会被真正的删除。
一般目录文件不能被建立硬链接,因为我们在查找的时候,如果目录被创建了硬链接,在实现某种查找算法是无法区分硬链接指向的目录和真正的目录、,很可能会出现死循环。所以一般是不允许创建目录的硬链接。
在这里插入图片描述

但是Linux中存在目录的硬链接,这个被OS的特殊处理,我们用户是不允许创建硬链接的。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

arping命令详解

arping – send ARP REQUEST to a neighbour host. arping 是一个在网络中发送 ARP 请求以查找特定 IP 地址对应的 MAC 地址的命令行工具。它的功能类似于 ping 命令,基于ARP协议报文的交互机制,只能测试同一网段或子网的网络主机的连通性。 ARP 是 Add…

中国人的谦逊与生俱来

中国人的谦逊是与生俱来的,我们从老子的《道德经》就能探知一二: 一、不自夸、不自傲 《道德经》原文:自见者不明;自是者不彰;自伐者无功;自矜者不长。(第二十四章) 译文&#xff…

就业班 第三阶段(ansible) 2401--4.16 day2 ansible2 剧本+角色

六、Ansible playbook 简介 playbook 是 ansible 用于配置,部署,和管理被控节点的剧本。   通过 playbook 的详细描述,执行其中的一系列 tasks ,可以让远端主机达到预期的状态。playbook 就像 Ansible 控制器给被控节点列出的的…

AI助力科研创新与效率双提升:ChatGPT深度科研应用、数据分析及机器学习、AI绘图与高效论文撰写

2022年11月30日,可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5,将人工智能的发展推向了一个新的高度。2023年4月,更强版本的ChatGPT4.0上线,文本、语音、图像等多模态交互方式使其在…

Virtualenv:Python项目管理的救星

在Python的世界里,依赖包冲突是开发者的噩梦,但也是成长的催化剂。最近在写Python项目中就碰到了这样的问题,明明代码在自己的电脑上表现都是正常的,在另外一台电脑上却始终有些小问题,两台电脑安装的Python版本都是一…

(1)认识人工智能

第一章 认识人工智能 引言 本人目前大三,双非一本的人工智能专业,代码能力不算太差,做过项目,也打了比赛,获了奖,但是走技术路线总会有否定自己的感觉,可能是感觉自己的才能没有在搞技术方面实…

java-Spring-入门学习-第二天(单例模式和多例模式)

目录 Bean作用域 单例模式(默认可以不写) Spring下的 AutoWired 依赖注入 JaveEE下的 Resource 依赖注入 多例模式 Bean作用域 ​在Spring框架中,Bean是按照作用域来创建的,常见的作用域有两种:Singleton 和 Prototype。Singleton (单例…

数据结构----顺序表

在学习顺序表之前,我们先来了解一下数据结构。 数据是什么呢? 我们在生活中常见的名字,数字,性别等都属于数据。 结构又是什么呢? 在计算机中,结构就是用来保存数据的方式。 总的来说,数据…

anaconda配置的环境对应的地址查看,环境安装位置

打开conda指令窗口 这个和上面的都一样,哪个都行 点开后,输入 conda env list 这里显示的就是自己的每个环境对应的地址了

OpenCV杂记(1):绘制OSD(cv::getTextSize, cv::putText)

1. 简述 我们使用OpenCV时,有时会在图像的某个位置绘制OSD信息,如绘制一些字符串作为指示信息。 本文将简要介绍在图像(cv::Mat)上绘制固定的字符串信息。 2. 使用的API (1)cv::getTextSize() CV_EXPORT…

C++模板template(二十一)

在C的模板体现了一种泛型编程的思想,当我们不确定要传入的参数是何种数据类型时我们可以写一个模板类型来代替,当传入参数时才将类型告诉它。模板也是属于一种静态多态,,模板的不同类型发生在编译时。泛型编程:不是针对…

react中useState的值没有改变,而是旧的数值

问题背景 想实现点击按钮就改变数据的效果,但是在控制台的打印结果,总是上一次的修改情况,并不是最新的修改后的数据 代码: import { useState, useRef } from "react";// 实现sonA的数据传递给sonB const SonA () …

排序之插入排序:从斗地主到插入排序

目录 1.斗地主如何摸牌 2.从摸牌想到插入排序 3.完成插入排序 4.结束语 1.斗地主如何摸牌 不知道各位是否玩过几乎人人都玩过的斗地主游戏呢?相必各位或多或少都玩过一点,再没玩过也看别人打过。今天博主就将从这个游戏为大家讲解我们的插入排序。 在…

Zabbix监控Oracle归档日志空间

1、oracle查看归档日志空间的sql语句 select sum(PERCENT_SPACE_USED) from v$recovery_area_usage; 2、交互式查看oracle归档日志空间的命令&#xff0c;可以手动执行一下&#xff0c;注意要用oracle用户 sqlplus -S "/ as sysdba" << EOF select sum(PER…

攻防世界---misc---[中等] QR1

1.下载附件&#xff0c;是一张空白图片&#xff0c;打开看看&#xff0c;仔细看会发现有黑色小点点 2.图片太大了&#xff0c;我们缩小图片的宽高比例 3.将修改后的图片&#xff0c;用Stegsolve打开&#xff0c;切换图层&#xff0c;得到二维码 4.用QR进行二维码扫描 5.得到fla…

Spring之CGLIB和JDK动态代理底层实现

目录 CGLIB 使用示例-支持创建代理对象&#xff0c;执行代理逻辑 使用示例-多个方法&#xff0c;走不同的代理逻辑 JDK动态代理 使用示例-支持创建代理对象&#xff0c;执行代理逻辑 ProxyFactory 如何自动在CGLIB和JDK动态代理转换 使用示例-使用CGLIB代理方式 使用示…

OpenCV基本图像处理操作(十一)——图像特征Sift算法

图像尺度空间 在一定的范围内&#xff0c;无论物体是大还是小&#xff0c;人眼都可以分辨出来&#xff0c;然而计算机要有相同的能力却很难&#xff0c;所以要让机器能够对物体在不同尺度下有一个统一的认知&#xff0c;就需要考虑图像在不同的尺度下都存在的特点。 尺度空间的…

浏览器渲染流程中的 9 个面试点

记得 08 年以前&#xff0c;打开网页的时候一个页面卡死整个浏览器凉凉。 这是因为当时浏览器是单进程架构&#xff0c;一个页面或者插件卡死&#xff0c;整个浏览器都会崩溃&#xff0c;非常影响用户体验。 经过了一代代工程师的设计&#xff0c;现代浏览器改成了多进程架构&…

AD高速板设计-DDR(笔记)

【一】二极管 最高工作频率&#xff1a; 定义&#xff1a;二极管的最高工作频率&#xff0c;即二极管在电路中能够正常工作的最高频率。常见的硅二极管的最高工作频率通常在几十MHz到几百MHz之间。在高频下&#xff0c;二极管可能无法有效地阻止反向电流&#xff0c;但也不会…

Redis入门到通关之数据结构解析-Dict

文章目录 概述构成Dict的扩容Dict的rehash总结 概述 我们知道Redis是一个键值型&#xff08;Key-Value Pair&#xff09;的数据库&#xff0c;我们可以根据键实现快速的增删改查。而键与值的映射关系正是通过Dict来实现的。 Dict由三部分组成&#xff0c;分别是&#xff1a;哈…