【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…

深度学习,训练集准确率高,但验证集准确率一直不上升,很低的问题

在训练过程中,训练集的准确率稳步上升,但是验证集的准确率一直在40%左右徘徊,从网上搜索可能的原因有: 1、学习率太小,陷入局部最优。 2、数据量太小(4000多条数据,应该还可以吧) …

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

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

期刊选择【生物医学工程】

所有数据来源letpub Academic radiology【共一共通,速度√杠杠的】 【LetPub】ACADEMIC RADIOLOGY 影响因子3.800分,是几区,2023-2024年期刊投稿经验分享,ACADEMIC RADIOLOGY主页,推荐审稿人、编辑,审稿…

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

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

Flink如何设置合理的并行度

一个Flink程序由多个Operator组成(source、transformation和 sink)。 一个Operator由多个并行的Task(线程)来执行, 一个Operator的并行Task(线程)数目就被称为该Operator(任务)的并行度(Parallel)。即并行度就是相对于Operator来说的。 合理设置并行度可以有效提高Flink作业…

【PostgreSQL】PG多实例部署

注释 PGPORT 和 PGDATA 环境变量 su - postgresvim ~/.bash_profileexport PATH=/usr/local/pgsql/bin:$PATH export MANPATH=/usr/local/pgsql/share/man:$MANPATH export LD_LIBRARY_PATH=/usr/local/pgsql/lib #export PGPORT=5432 export LANG=en_US.UTF8 export PS1=&quo…

【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中…

《CPython Internals》阅读笔记:p1-p19

《CPython Internals》学习第 1 天,p1-p19 总结,总计 19 页。 一、技术总结 无。 二、英语总结(生词:2) 1.humble vs humbled (1)humble: humus(“earth”) adj. 字面意思是“on the ground”, 后面引申为“lowly in kind, state, cond…

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、所有内网应用都不能直接访问外网,但需要…

字玩FontPlayer开发笔记4 性能优化 首屏加载时间优化

字玩FontPlayer开发笔记4 性能优化 首屏加载时间优化 字玩FontPlayer是笔者开源的一款字体设计工具,使用Vue3 ElementUI开发,源代码: github: https://github.com/HiToysMaker/fontplayer gitee: https://gitee.com/toysmaker/fontplayer …

MySQL Binlog 监听方案

如果 EmbeddedEngine 类在 debezium-connector-mysql 中不可用,原因是 Debezium 的新版本移除了 EmbeddedEngine。这是因为 Debezium 的架构变更,它现在鼓励使用 Kafka Connect 或 Debezium Server 来处理数据变更事件。 下面是几种替代方法来实现 MySQ…

JSP内置对象、Servlet与MVC

目录 1、JSP内置对象1. 1、**out 对象**1.2、 **request 对象**1.3、 **response 对象**1.4、 **session 对象**1.5、 **application 对象**1.6、 **cookie 对象** 2、Servlet2.1、Servlet 概念2.2、Servlet 体系结构2.3、Servlet 接口2.4、ServletConfig 接口2.5、Servlet 案例…

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

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