深入了解linux系统—— 操作系统的路径缓冲与链接机制

news2025/5/25 15:28:56

前言

在之前学习当中,我们了解了被打开的文件是如何管理的;磁盘,以及ext2文件系统是如何存储文件的。

那我们要打开一个文件,首先要先找到这个文件,操作系统又是如何去查找的呢?

理解操作系统搜索文件

1. 目录和文件名

我们知道:

  • 文件名是不作为文件属性存储在文件inode里的;
  • 在一个分区中,根据文件的inode值就可以找到该文件。

但是在之前的文件操作时,一种都是使用文件名进行对文件的相关操作,没有使用过文件inode值;

还用目录它是文件吗?

在这里插入图片描述

通过查看我们可以发现目录也是存在inode值的,那也就是说目录也是也文件;

文件 = 属性 + 内容,那目录的文件内容是什么呢?

首先属性不用多说;

目录文件的文件内容保存的是:文件名和inode号的映射关系。

  • 所以,访问文件时,必须打开当前工作目录,根据文件名获取对应的inode号,然后进行文件访问。
  • 所以,访问文件必须知道当前工作目录,本质就是必须打开当前工作目录文件,查看目录文件的内容获取要访问文件的inode号。

2. 路径解析

知道了访问当前工作目录下文件,要打开当前目录文件,查看当前目录文件内容;

那要打开当前工作目录,就要获取当前工作目录文件的inode号啊,如何获得呢?

很简单,打开上级目录,查看上级目录文件内容;那上级目录也是文件啊,要打开它也要知道它的inode号,那也要打开它的上级目录啊?

所以就一直访问上级目录,直到/根目录。

所以说:实际上,任何文件都存在路径;

比如:/home/lxb/linux/lesson8/code.c

这都要从根目录开始一次打开每一个目录文件,依次访问每个目录下的指定目录直到test.c文件(这个过程称之为Linux路径解析)

我们知道,访问文件本质就是进程去访问,在进程当中存在CWD当前工作路径;在我们open打卡指定文件时也给定了文件的路径。

所以我们访问文件必须要有目录+文件名(绝对路径)

3. 路径缓存

我们知道,文件都是在磁盘中存着的,那在Linux系统中存在真正的目录吗?

显而易见是不存在,只有文件;保存文件属性+内容。

在上述中,我们还了解到访问一个文件,都要从根目录/开始进行路径解析?

按道理来说是的,但是太慢了,在Linux系统中会缓冲历史路径结构。

Linux系统中,不存在目录,那在Linux系统中我们为什么可以看到目录路径结构?

打开的文件如果是目录,在系统中就在自己的内存中进行路径维护。

Linux系统中,内核里维护树状路径结构的内核结构体叫做:struct dentry

struct dentry {
    atomic_t d_count;
    unsigned int d_flags; /* protected by d_lock */
    spinlock_t d_lock; /* per dentry lock */
    struct inode *d_inode; /* Where the name belongs to - NULL is
    * negative */
    /*The next three fields are touched by __d_lookup. Place them here
      so they all fit in a cache line.
    */
    struct hlist_node d_hash; /* lookup hash list */
    struct dentry *d_parent; /* parent directory */
    struct qstr d_name;
    struct list_head d_lru; /* LRU list */
    /*d_child and d_rcu can share memory*/
    union {
    	struct list_head d_child; /* child of parent list */
    	struct rcu_head d_rcu;
    } d_u;
    struct list_head d_subdirs; /* our children */
    struct list_head d_alias; /* inode alias list */
    unsigned long d_time; /* used by d_revalidate */
    struct dentry_operations *d_op;
    struct super_block *d_sb; /* The root of the dentry tree */
    void *d_fsdata; /* fs-specific data */
#ifdef CONFIG_PROFILING
    struct dcookie_struct *d_cookie; /* cookie, if any */
#endif
    int d_mounted;
    unsigned char d_iname[DNAME_INLINE_LEN_MIN]; /* small names */
};
  • 每一个文件其实都有对应的dentry结构,包含普通文件;所以被打开的文件,在内存中就可以形成树状结构。
  • 整个树形节点也会同时属于LRU(Least Recently Used),在最近最少使用结构在,进行节点淘汰。
  • 同时也会属于Hash表,方便快速查找。
  • 这样有了树状结构,整体就有了Linux路径缓存结构,打开和访问任何文件,都先在该树下进行查找,找到了就返回inode和内容,没找到就从磁盘加载路径,添加到dentry结构中。

4. 挂载分区

在之前的描述中,都是在一个文件系统中,根据inode号查找文件,那inode号又不是跨分区的,如何根据inode确定是哪一个分区呢?

在分区写入文件系统后,我们没有办法直接使用;我们需要将文件系统与指定的目录进行关联(也就是挂载)才能使用

所以就可以根据我们访问目标文件的路径前缀来判断文件在哪一个分区。

这里关于挂载的相关操作,就不演示了;可以自己尝试一下。

软硬链接

1. 软链接

Windows中,我们可以给一个文件创建快捷方式,然后放到桌面,这样打开桌面的快捷方式就是打开文件了;

而在Linux系统中,我们也可以给文件创建快捷方式——就是软链接

ln -s code code.c

创建软链接文件code指向文件code.c;(可以说code文件是code.c的快捷方式)

在这里插入图片描述

软链接是一个独立的文件

2. 硬链接

我们直到一个目录中,存在...两个隐藏文件,.指向当前目录,..指向上级目录;

那也就是说,这些文件名都对应一个inode值。

这里...就是典型的硬链接。

而在内核中,记录了连接数:

在这里插入图片描述

创建硬链接:

ln 已存在文件 硬链接文件

在这里插入图片描述

这里要注意,我们只能给文件创建硬链接,不能给目录创建硬链接。

这里可能会感觉很奇怪,...不就是给目录创建硬链接吗?我们为什么不能创建?

这里还是为了避免循环路径问题,在内核中在路径搜索时,对...做了特殊处理,所以...不会造成循环路径问题;

而软链接,它是一个独立的文件,在路径遍历时不会把他当做目录文件来处理。

如果我们自己创建硬链接,就有可能造成循环路径问题。

3. 软硬链接的区别

  • 软链接是一个独立的文件
  • 硬链接只是文件名和目标文件的一组映射关系

4. 软硬链接的作用

  • 软链接就类似于快捷方式
  • 硬链接...,方便用户进程操作;文件备份。

到这里本篇文章内容就结束了,感谢各位大佬的支持

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

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

相关文章

华为2025年校招笔试真题手撕教程(一)

一、题目 输入: 第一行为记录的版本迭代关系个数N,范围是[1,100000]; 第二行到第N1行:每行包含两个字符串,第一个字符串为当前版本,第二个字符串为前序版本,用空格隔开。字符串包含字符个数为…

第9.2讲、Tiny Decoder(带 Mask)详解与实战

自己搭建一个 Tiny Decoder(带 Mask),参考 Transformer Encoder 的结构,并添加 Masked Multi-Head Self-Attention,它是 Decoder 的核心特征之一。 1. 背景与动机 Transformer 架构已成为自然语言处理(NLP…

基于PCRLB的CMIMO雷达网络多目标跟踪资源调度

针对分布式组网CMIMO雷达多目标跟踪(MTT)场景,博客分析了一种目标-雷达匹配方案与功率联合优化算法。在采用分布式组网融合架构的基础上,推导包含波束和功率分配的后验克拉美罗界(PCRLB)。随后,将该效用函数结合CMIMO雷达系统资源&#xff0c…

AtCoder Beginner Contest 407(ABCDE)

A - Approximation 翻译&#xff1a; 给你一个正整数 A 和一个正奇数 B。 请输出与实数 的差最小的整数。 可以证明&#xff0c;在约束条件下&#xff0c;这样的整数是唯一的。 思路&#xff1a; 令。比较来判断答案。 实现&#xff1a; #include<bits/…

VILT模型阅读笔记

代码地址&#xff1a;VILT Abstract Vision-and-Language Pre-training (VLP) has improved performance on various joint vision-andlanguage downstream tasks. Current approaches to VLP heavily rely on image feature extraction processes, most of which involve re…

掌握 npm 核心操作:从安装到管理依赖的完整指南

图为开发者正在终端操作npm命令&#xff0c;图片来源&#xff1a;Unsplash 作为 Node.js 生态的基石&#xff0c;npm&#xff08;Node Package Manager&#xff09;是每位开发者必须精通的工具。每天有超过 1700 万个项目通过 npm 共享代码&#xff0c;其重要性不言而喻。本文…

OpenCV CUDA模块特征检测与描述------一种基于快速特征点检测和旋转不变的二进制描述符类cv::cuda::ORB

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::ORB 是 OpenCV 库中 CUDA 模块的一部分&#xff0c;它提供了一种基于快速特征点检测和旋转不变的二进制描述符的方法&#xff0c;用于…

Awesome ChatGPT Prompts:释放AI对话潜力的开源利器

项目概览 Awesome ChatGPT Prompts 是由土耳其开发者 Fatih Kadir Akın 发起的开源项目,托管于 GitHub,旨在通过精心设计的提示词模板(Prompts)优化用户与 ChatGPT 的交互体验。项目以 Markdown 和 CSV 格式管理模板,无需复杂编程语言,但需文本处理能力,目前已在 GitH…

PP-YOLOE-SOD学习笔记2

一、解析X-Anylabeling标注后的json格式问题 最近在使用自动标注工具后json格式转化过程中&#xff0c;即标注框的四点坐标转换为两点坐标时&#xff0c;发现json格式的四点顺序是按顺时针方向开始的&#xff0c;那么在转换其实就是删除2、4坐标或者1、3坐标即可。 二、数据集…

算法学习——从零实现循环神经网络

从零实现循环神经网络 一、任务背景二、数据读取与准备1. 词元化2. 构建词表 三、参数初始化与训练1. 参数初始化2. 模型训练 四、预测总结 一、任务背景 对于序列文本来说&#xff0c;如何通过输入的几个词来得到后面的词一直是大家关注的任务之一&#xff0c;即&#xff1a;…

win10使用nginx做简单负载均衡测试

一、首先安装Nginx&#xff1a; 官网链接&#xff1a;https://nginx.org/en/download.html 下载完成后&#xff0c;在本地文件中解压。 解压完成之后&#xff0c;打开conf --> nginx.config 文件 1、在 http 里面加入以下代码 upstream GY{#Nginx是如何实现负载均衡的&a…

2025电工杯数学建模B题思路数模AI提示词工程

我发布的智能体链接&#xff1a;数模AI扣子是新一代 AI 大模型智能体开发平台。整合了插件、长短期记忆、工作流、卡片等丰富能力&#xff0c;扣子能帮你低门槛、快速搭建个性化或具备商业价值的智能体&#xff0c;并发布到豆包、飞书等各个平台。https://www.coze.cn/search/n…

【日志软件】hoo wintail 的替代

hoo wintail 的替代 主要问题是日志大了以后会卡有时候日志覆盖后&#xff0c;改变了&#xff0c;更新了&#xff0c;hoo wintail可能无法识别需要重新打开。 有很多类似的日志监控软件可以替代。以下是一些推荐的选项&#xff1a; 免费软件 BareTail 轻量级的实时日志查看…

Ollama-OCR:基于Ollama多模态大模型的端到端文档解析和处理

基本介绍 Ollama-OCR是一个Python的OCR解析库&#xff0c;结合了Ollama的模型能力&#xff0c;可以直接处理 PDF 文件无需额外转换&#xff0c;轻松从扫描版或原生 PDF 文档中提取文本和数据。根据使用的视觉模型和自定义提示词&#xff0c;Ollama-OCR 可支持多种语言&#xf…

OpenCV CUDA 模块中图像过滤------创建一个拉普拉斯(Laplacian)滤波器函数createLaplacianFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::cuda::createLaplacianFilter 是 OpenCV CUDA 模块中的一个函数&#xff0c;用于创建一个 拉普拉斯&#xff08;Laplacian&#xff09;滤波器…

图论学习笔记 3

自认为写了很多&#xff0c;后面会出 仙人掌、最小树形图 学习笔记。 多图警告。 众所周知王老师有一句话&#xff1a; ⼀篇⽂章不宜过⻓&#xff0c;不然之后再修改使⽤的时候&#xff0c;在其中找想找的东⻄就有点麻烦了。当然⽂章也不宜过多&#xff0c;不然想要的⽂章也不…

【将WPS设置为默认打开方式】--突然无法用WPS打开文件

1. 点击【开始】——【WPS Office】——【配置工具】&#xff1b; 2. 在出现的弹窗中&#xff0c;点击【高级】&#xff1b; 3. 在“兼容设置”中&#xff0c;将复选框勾上&#xff0c;点击【确定】。

电子人的分水岭-FPGA模电和数电

为什么模电这么难学&#xff1f;一文带你透彻理解模电 ——FPGA是“前期数电&#xff0c;后期模电”的典型代表 在电子工程的世界里&#xff0c;有两门基础课程让无数学生“闻之色变”&#xff1a;数字电路&#xff08;数电&#xff09; 和 模拟电路&#xff08;模电&#xff0…

(6)python爬虫--selenium

文章目录 前言一、初识selenium二、安装selenium2.1 查看chrome版本并禁止chrome自动更新2.1.1 查看chrome版本2.1.2 禁止chrome更新自动更新 2.2 安装对应版本的驱动程序2.3安装selenium包 三、selenium关于浏览器的使用3.1 创建浏览器、设置、打开3.2 打开/关闭网页及浏览器3…

Python之两个爬虫案例实战(澎湃新闻+网易每日简报):附源码+解释

目录 一、案例一&#xff1a;澎湃新闻时政爬取 &#xff08;1&#xff09;数据采集网站 &#xff08;2&#xff09;数据介绍 &#xff08;3&#xff09;数据采集方法 &#xff08;4&#xff09;数据采集过程 二、案例二&#xff1a;网易每日新闻简报爬取 &#xff08;1&#x…