【linux基础I/O(2)】理解文件系统|文件缓冲区|软硬链接|动静态库

目录

  • 前言
  • 1. 理解C语言的缓冲区
  • 2. 对文件系统的初认识
  • 3. 理解软硬链接
    • 1. 软硬链接的特征
    • 2.软硬链接的作用
  • 4. 理解动静态库
  • 5. 总结

前言

对于文件来讲,有打开的在内存中的文件,也有没有打开的在磁盘上文件,上一篇文章讲解的是前者,本篇文章将带大家了解后者!

本章重点:

本篇文章着重讲解在磁盘中的文件的存储方式以及inode相关概念.在这之前会解释C语言缓冲区的概念以及作用,最后会带大家了解软硬链接如何创建,软硬链接的区别,理解动静态库.

1. 理解C语言的缓冲区

缓冲区的本质就是一段内存空间,那么为什么要有缓冲区?讲个例子:

你在深圳大学想要将一本书送给你在哈工大的好友,你会亲自将书带过去给他然后再回云南吗?显然不可能你会去楼下的顺丰快递将书籍让顺丰帮你寄到北京区,你就代表一个用户,而书籍
就是你要发送给其他用户的数据,顺丰就是这个缓冲区.很明显缓冲区有以下性质:

1. 顺丰拿到你的快递立刻发送(立刻刷新)
2. 等累计快递达到一定数量统一发送(行刷新)
3. 或者当快递站放满了再发送快递(满刷新)

在这里插入图片描述

行缓存的设备文件: 显示器(关心用户体验)
全缓存的设备文件: 磁盘文件(关心效率)

printf("abcdef");
sleep(5);
return 0;

因为printf后没有\n刷新缓冲区,所以信息不会立刻打印出来,当休眠五秒后程序退出时才会进行刷新缓冲区!

在这里插入图片描述

除此之外,既然操作系统只认识文件描述符fd,所以C语言的FILE结构体中一定封装了fd,并且C语言的缓冲区实际上也是在FILE结构体中维护的!也就是说直接使用系统调用去进行输出工作是不会有缓冲区的概念的!

在这里插入图片描述

2. 对文件系统的初认识

对于已经在内存中打开的文件来说,它的结构无非就是OS为它创建的struct file,但是对于未打开的文件也就是存储在磁盘上的文件,是怎样管理的呢?

看看关于磁盘结构的剖析图:
在这里插入图片描述
磁盘看似是一张盘面,实际上内部分为很多个面,一个面对于一个磁头,这是正视图的磁盘.

再来看看俯视图的磁盘:
在这里插入图片描述

对于磁盘的每一个面来说,并不是所有的区域都可以用来存储数据,可以把特定的磁道中特定的扇区看作是一个小数组,此小数组中存储文件的属性内容,一般而言一个扇区的大小是512字节.

在这里插入图片描述

所以我们把把整个磁盘文件的管理,细拆分为对一个扇区的管理!!!

块组的基本结构:
在这里插入图片描述

  • 1.inode Table保存对应文件的属性.每一个inode块都有一个inode编号,也就是说一个文件,一个inode,一个inode编号.
  • 2.Block Bitmap是个位图,表示特定的块组是否被使用.
  • 3.inode Bitmap也是个位图,表示特定的inode是否被占用.
  • 4.Data Blocks存储此文件的内容.
  • 5.GDT是块组描述符,表征这个块组有多大,已被使用了多少,有多少个inode,还剩多少个等等.
  • 6.SuperBlock保存着文件系统的属性信息,每个块组都会备份一份,里面有每一个块组的信息.

从今往后,要在磁盘中找到一个文件只需: 找到inode编号->分区特定的块组->inode->属性->内容.
那么问题是文件的inode是什么我怎么知道?是的,OS都考虑好了,在文件的目录中,存放着文件名和此文件的inode对应的映射关系,可以通过文件名直接找到inode!!!

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


在这里插入图片描述

3. 理解软硬链接

我们看到,真正找到磁盘上文件的并不是文件名,而是inode. 其实在linux中可以让多个文件名对应于同一个inode,这就是硬链接的原理.

建立软链接,使用指令: ln -s 已存在的文件 要建立的软链接

在这里插入图片描述

建立硬链接,使用指令: ln 已存在的文件 要建立的软链接

在这里插入图片描述

硬链接是什么呢?

1. 硬链接就是一个文件名和inode的映射关系建立硬链接,就是在指定目录下,添加一个新的文件名和inode number的映射关系!
2. 删除目标文件后可以发现,在硬链接文件中仍然有一套完整的目标文件的属性和内容,可以认为硬链接就是在 重命名!

1. 软硬链接的特征

1.软连接是一个独立的文件,因为有独立的inode number.
软连接的内容:目标文件所对应的路径字符串,类似于windows当中的快捷方式.
2.硬链接不是一个独立的文件,因为你没有独立的inode number,你用的是目标文件的inode.
3.属性中有一列硬链接数.那是文件的磁盘级引用计数:有多少个文件和这个inode number有映射关系.

2.软硬链接的作用

1.软链接的作用:
在linux中就是快捷方式!
当我们要找一个路径很深的文件时,可以进行软链接方便找到并使用那个文件。
2.硬链接的作用:
(1) 构建Linux的相对路径结构,让我们可以使用 . 或 . . 来进行路径定位.
(2)一般用硬链接来做文件备份.

4. 理解动静态库

在Linux中:

  • 静态库(.a结尾): 程序在编译链接时就把库的代码链接到可执行程序.
  • 动态库(.so结尾): 程序运行时才去链接动态库的代码,动态库的代码是被共享的.

gcc/g++默认使用的动态链接的方式,若想要变为静态链接,在编译时加上-static.

如何写一个自己的库?

.h文件写声明,.c写实现,将.c文件编译成.o文件后,再将所有的.o文件通过指针ar打包成一个库,将这个库和.h文件放在同一目录,别人就能用了.

制作静态库指令: ar -rc libhello.a mymath.o myprintf.o

在这里插入图片描述


在这里插入图片描述
在这里插入图片描述

制作动态库指令: gcc -shared myadd.o myprintf.o -o libhello.so

理解动态库的加载

可执行程序先加载到内存里,运行到调用库函数的地方,发现需要库,此时缺页中断,在让0S去检测库是否加载,若没有加载,就根据路径找到库,再加载进内存,接下来进行映射,映射后就能在地址空间的共享区得到库的起始信息地址,而在正文代码段我们调用的库函数的地址是相对地址,再用这个相对地址+偏移量,就可以在地址空间定位库的位置了。

在这里插入图片描述

5. 总结

Linux的基础IO部分已经全部讲解完毕,下一章将进入进程信号的学习.掌握文件的inode相关知识可以更好的帮助我们理解文件在打开和关闭时分别是怎样运作的!

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

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

相关文章

什么是Redis的渐进式ReHash?

文章内容收录到个人网站,方便阅读:http://hardyfish.top/ 文章内容收录到个人网站,方便阅读:http://hardyfish.top/ 文章内容收录到个人网站,方便阅读:http://hardyfish.top/ Redis 的渐进式 rehash 是一…

Linux应用软件编程--网络通信(udp协议,tcp协议)

网络通信:不同主机,进程间通信,分为广域网和局域网 OSI 七层模型:是一种理论模型 应用层:通信传输的数据内容 http、FTP、TFTP、MQTT 表述层:数据加密,解密操作,压缩&#xff…

【C++】构造函数与析构函数

写在前面 构造函数与析构函数都是属于类的默认成员函数! 默认成员函数是程序猿不显示声明定义,编译器会中生成。 构造函数和析构函数的知识需要建立在有初步类与对象的基础之上的,关于类与对象不才在前面笔记中有详细的介绍:点我…

【简博士统计学习方法】3. 统计学习方法的三要素

3. 统计学习方法的三要素 3.1 监督学习的三要素 3.1.1 模型 假设空间(Hypothesis Space):所有可能的条件概率分布或决策函数,用 F \mathcal{F} F表示。 若定义为决策函数的集合: F { f ∣ Y f ( X ) } \mathcal{F…

【llm/ollama/qwen】在本地部署qwen2.5-coder并在vscode中集成使用代码提示功能

说在前面 操作系统:windows11ollama版本:0.5.4vscode版本:1.96.2continue插件版本:0.8.66 ollama安装 访问官网,点击下载安装即可 默认装在了C盘,比较蛋疼;但是可以指定路径安装:Ol…

PHP零基础入门笔记

表达式:任何有值的东西就是表达式 php可以解析双引号,不可以解析单引号,双引号中引用变量可以输出引用变量的值,但是单引号不可以 1.变量和变量的销毁 unset(变量名) //销毁变量 变量是严格区分大小写的,在php中…

macos安装java8

下载 dmg方式安装 安装 双击pkg运行 输入java -version验证 配置环境变量 cd ~ ls -a输入 ls -a后查看是否已经存在.bash_profile文件,如果已经存在就不需要创建,如果不存在,继续执行下方命令创建文件 touch .bash_profile /usr/l…

自定义校验注解

已有的注解不能满足所有的校验需求,特殊的情况需要自定义校验(自定义校验注解) 1.自定义注解,并在注解上指定校验逻辑 Constraint(validatedBy StateValidation.class) // 指定校验逻辑 package com.example.demo.validation;import jakarta.validation.Constraint; import j…

指代消解:自然语言处理中的核心任务与技术进展

目录 前言1. 指代消解的基本概念与分类1.1 回指与共指 2. 指代消解的技术方法2.1 端到端指代消解2.2 高阶推理模型2.3 基于BERT的模型 3. 事件共指消解:跨文档的挑战与进展3.1 联合模型3.2 语义嵌入模型(EPASE) 4. 应用场景与前景展望4.1 关键…

Chapter4.1 Coding an LLM architecture

文章目录 4 Implementing a GPT model from Scratch To Generate Text4.1 Coding an LLM architecture 4 Implementing a GPT model from Scratch To Generate Text 本章节包含 编写一个类似于GPT的大型语言模型(LLM),这个模型可以被训练来生…

nginx正向代理从安装到使用一网打尽系列(二)使用

一、背景 使用场景大总结,可作为参考手册用 nginx正向代理从安装到使用一网打尽系列(一)安装 nginx正向代理从安装到使用一网打尽系列(二)使用 二、使用场景 1、所有内网应用都不能直接访问外网,但需要…

论文解读 | NeurIPS'24 IRCAN:通过识别和重新加权上下文感知神经元来减轻大语言模型生成中的知识冲突...

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 作者简介 史丹,天津大学博士生 内容简介 大语言模型(LLM)经过海量数据训练后编码了丰富的世界知识。最近的研究表明&#xff0c…

大语言模型训练所需的最低显存,联邦大语言模型训练的传输优化技术

联邦大语言模型训练的传输优化技术 目录 联邦大语言模型训练的传输优化技术大语言模型训练所需的最低显存大语言模型训练所需的最低显存 基于模型微调、压缩和分布式并行处理的方法,介绍了相关开源模型及技术应用 核心创新点 多维度优化策略:综合运用基于模型微调、模型压缩和…

(CICD)自动化构建打包、部署(Jenkins + maven+ gitlab+tomcat)

一、平滑发布与灰度发布 **什么叫平滑:**在发布的过程中不影响用户的使用,系统不会因发布而暂停对外服务,不会造成用户短暂性无法访问; **什么叫灰度:**发布后让部分用户使用新版本,其它用户使用旧版本&am…

Python 科学计算

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

【pytorch】注意力机制-1

1 注意力提示 1.1 自主性的与非自主性的注意力提示 非自主性提示: 可以简单地使用参数化的全连接层,甚至是非参数化的最大汇聚层或平均汇聚层。 自主性提示 注意力机制与全连接层或汇聚层区别开来。在注意力机制的背景下,自主性提示被称为查…

Qt窗口获取Tftpd32_svc服务下载信息

前言 一个由Qt开发的Windows小工具需要布置Tftp协议服务端来支持设备下载数据,并显示下载列表(进度、下载源等)。 考虑开发方便,优先使用了Qtftp方案,经测试发现,不够稳定,会有下载超时的情况&a…

<OS 有关> DOS 批处理命令文件,用于创建 python 虚拟机,并进入虚拟机状态执行后继命令 判断虚拟机是否存在,在批处理文件中自定义 虚拟机名字

前言: 经常要敲重复的命令: python -m venv venv.\venv\Scripts\activate.bat (虽然能按 Tab 省几下,多了也烦恼,后来写了四行脚本 start.bat) DOS批处理 create_venv_start.bat 功能: 批处理显示支持中文在 creat…

【算法刷题】leetcode hot 100 哈希篇

文章目录 1. 两数之和49. 字母异位词分组128. 最长连续序列总结 1. 两数之和 leetcode:https://leetcode.cn/problems/two-sum/description/?envTypestudy-plan-v2&envIdtop-100-liked暴力解决: public int[] twoSum(int[] nums, int target) {for …

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer

iOS 逆向学习 - iOS Architecture Cocoa Touch Layer 一、Cocoa Touch Layer 简介二、Cocoa Touch Layer 的核心功能1. UIKit2. Event Handling(事件处理)3. Multitasking(多任务处理)4. Push Notifications(推送通知&…