深入了解linux系统—— 操作系统的路径缓冲与链接机制
前言
在之前学习当中,我们了解了被打开的文件是如何管理的;磁盘,以及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 hereso 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_PROFILINGstruct dcookie_struct *d_cookie; /* cookie, if any */
#endifint 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. 软硬链接的作用
- 软链接就类似于快捷方式
- 硬链接
.
和..
,方便用户进程操作;文件备份。
到这里本篇文章内容就结束了,感谢各位大佬的支持
相关文章:

深入了解linux系统—— 操作系统的路径缓冲与链接机制
前言 在之前学习当中,我们了解了被打开的文件是如何管理的;磁盘,以及ext2文件系统是如何存储文件的。 那我们要打开一个文件,首先要先找到这个文件,操作系统又是如何去查找的呢? 理解操作系统搜索文件 …...
Ansible快速入门指南
Ansible 是一款基于 Python 开发的开源自动化运维工具,主要用于实现服务器配置管理、应用部署、任务自动化执行等功能。它通过 简单的 YAML 脚本(Playbook) 定义任务,结合 SSH 协议 对远程主机进行管理,无需在被控节点…...

华为2025年校招笔试真题手撕教程(一)
一、题目 输入: 第一行为记录的版本迭代关系个数N,范围是[1,100000]; 第二行到第N1行:每行包含两个字符串,第一个字符串为当前版本,第二个字符串为前序版本,用空格隔开。字符串包含字符个数为…...

第9.2讲、Tiny Decoder(带 Mask)详解与实战
自己搭建一个 Tiny Decoder(带 Mask),参考 Transformer Encoder 的结构,并添加 Masked Multi-Head Self-Attention,它是 Decoder 的核心特征之一。 1. 背景与动机 Transformer 架构已成为自然语言处理(NLP…...
postgresql 常用参数配置
#01 - Connection-Authentication 优化点: listen_addresses 0.0.0.0 建议:生产环境应限制为具体IP(如 192.168.1.0/24,127.0.0.1),避免暴露到公网。 ssl off 建议:启用SSL(ssl on…...
Python模块中的私有命名与命名空间管理:深入解析与实践指南
文章大纲 引言 在Python开发中,模块是代码组织和复用的重要方式,而私有命名和命名空间管理则是确保代码清晰和避免冲突的关键机制。私有命名通过特定的命名约定限制了模块中某些内容的访问,有效保护了内部实现细节;命名空间管理则帮助开发者理解标识符的作用域和查找规则…...

基于PCRLB的CMIMO雷达网络多目标跟踪资源调度
针对分布式组网CMIMO雷达多目标跟踪(MTT)场景,博客分析了一种目标-雷达匹配方案与功率联合优化算法。在采用分布式组网融合架构的基础上,推导包含波束和功率分配的后验克拉美罗界(PCRLB)。随后,将该效用函数结合CMIMO雷达系统资源,…...
AtCoder Beginner Contest 407(ABCDE)
A - Approximation 翻译: 给你一个正整数 A 和一个正奇数 B。 请输出与实数 的差最小的整数。 可以证明,在约束条件下,这样的整数是唯一的。 思路: 令。比较来判断答案。 实现: #include<bits/…...

VILT模型阅读笔记
代码地址: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命令,图片来源:Unsplash 作为 Node.js 生态的基石,npm(Node Package Manager)是每位开发者必须精通的工具。每天有超过 1700 万个项目通过 npm 共享代码,其重要性不言而喻。本文…...

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

Awesome ChatGPT Prompts:释放AI对话潜力的开源利器
项目概览 Awesome ChatGPT Prompts 是由土耳其开发者 Fatih Kadir Akın 发起的开源项目,托管于 GitHub,旨在通过精心设计的提示词模板(Prompts)优化用户与 ChatGPT 的交互体验。项目以 Markdown 和 CSV 格式管理模板,无需复杂编程语言,但需文本处理能力,目前已在 GitH…...
Prompt Tuning:轻量级微调与反向传播揭秘
Prompt Tuning 损失函数与反向传播原理解析 在Transformers中,Prompt Tuning是一种轻量级参数高效微调方法,其核心思想是只训练额外添加的提示词向量(prompt embeddings),而冻结预训练模型的主体参数。 损失函数设计 Prompt Tuning的损失函数与标准的语言模型训练类似,主…...
C++ 继承详解:基础篇(含代码示例)
目录 1. 什么是继承? 2. 继承的访问控制 3. 派生类构造与析构 (1) 构造顺序 (2) 析构顺序 4. 函数隐藏(Name Hiding) 1. 什么是继承? 继承(Inheritance)是面向对象编程(OOP)的…...

PP-YOLOE-SOD学习笔记2
一、解析X-Anylabeling标注后的json格式问题 最近在使用自动标注工具后json格式转化过程中,即标注框的四点坐标转换为两点坐标时,发现json格式的四点顺序是按顺时针方向开始的,那么在转换其实就是删除2、4坐标或者1、3坐标即可。 二、数据集…...
OpenLayers 加载测量控件
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图控件是一些用来与地图进行简单交互的工具,地图库预先封装好,可以供开发者直接使用。OpenLayers具有大部分常用的控件&#x…...
.NET ORM开发手册:基于SqlSugar的高效数据访问全攻略
SqlSuger是一个国产,开源ORM框架,具有高性能,使用方便,功能全面的特点,支持.NET Framework和.NET Core,支持各种关系型数据库,分布式数据库,时序数据库。 官网地址:SqlS…...
【PostgreSQL】数据探查工具1.0研发可行性方案
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 想抢先解锁数据自由的宝子,速速戳我!评论区蹲一波 “蹲蹲”,揪人唠唠你的超实用需求! 【PostgreSQL】数据探查工具1.0研发可行性方案,数据调研之秒解析数据结构,告别熬夜写 SQL【PostgreSQL】数据探查工具…...
C++ 内存管理与单例模式剖析
目录 引言 一、堆上唯一对象:HeapOnly类 (一)设计思路 (二)代码实现 (三)使用示例及注意事项 二、栈上唯一对象:StackOnly类 (一)设计思路 ࿰…...

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

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

2025电工杯数学建模B题思路数模AI提示词工程
我发布的智能体链接:数模AI扣子是新一代 AI 大模型智能体开发平台。整合了插件、长短期记忆、工作流、卡片等丰富能力,扣子能帮你低门槛、快速搭建个性化或具备商业价值的智能体,并发布到豆包、飞书等各个平台。https://www.coze.cn/search/n…...
软考软件评测师——软件工程之开发模型与方法
目录 一、核心概念 二、主流模型详解 (一)经典瀑布模型 (二)螺旋演进模型 (三)增量交付模型 (四)原型验证模型 (五)敏捷开发实践 三、模型选择指南 四…...
前端表单中 `readOnly` 和 `disabled` 属性的区别
前端表单中 readOnly 和 disabled 属性的区别 定义与适用范围 readOnly 是一种属性,仅适用于 <input> 和 <textarea> 元素。当设置了此属性时,用户无法修改这些元素的内容,但仍能聚焦并选中文本。disabled 则是一个更广泛的属性…...

【日志软件】hoo wintail 的替代
hoo wintail 的替代 主要问题是日志大了以后会卡有时候日志覆盖后,改变了,更新了,hoo wintail可能无法识别需要重新打开。 有很多类似的日志监控软件可以替代。以下是一些推荐的选项: 免费软件 BareTail 轻量级的实时日志查看…...
OceanBase数据库全面指南(基础入门篇)
文章目录 一、OceanBase 简介与安装配置指南1.1 OceanBase 核心特点1.2 架构解析1.3 安装部署实战1.3.1 硬件要求1.3.2 安装步骤详解1.3.3 配置验证二、OceanBase 基础 SQL 语法入门2.1 数据查询(SELECT)2.1.1 基础查询语法2.1.2 实际案例演示2.2 数据操作(INSERT/UPDATE/DE…...
异步处理与事件驱动中的模型调用链设计
异步处理与事件驱动中的模型调用链设计 在现代AI系统中,尤其是在引入了大模型(如LLM)或多步骤生成流程的业务场景中,传统的同步调用模型已越来越难以应对延迟波动、资源竞争和流程耦合等问题。为了提升系统响应效率、降低调用失败…...
redis配置带验证的主从复制
IP地址主机名192.168.10.161redis161192.168.10.162redis162192.168.10.163redis163 配置主机host161,redis服务连接密码为123456主机host162设置连接host61的redis服务密码 给host161主机的Redis服务设置连接密码,如果从服务器不指定连接密码无法同…...

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

OpenCV CUDA 模块中图像过滤------创建一个拉普拉斯(Laplacian)滤波器函数createLaplacianFilter()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::cuda::createLaplacianFilter 是 OpenCV CUDA 模块中的一个函数,用于创建一个 拉普拉斯(Laplacian)滤波器…...