【linux】基础IO(下)

news2024/11/17 14:39:46

8. 理解文件系统

8.1. 认识硬件 --- 磁盘

唯一的机械设备,也是一个外设

注意:

  • 磁头是一面一个,磁头和盘面不接触
  • 在软件设计上,设计者会有意识地将相关数据放在一起
  • 一般来说,运动越少,效率越高;运动越多,效率越低

8.2. 磁盘的存储构成

注意:

  • 磁盘被访问的最基础单位是扇区 ---- 512字节
  • 我们可以把磁盘看作无数个扇区构成的存储介质
  • 把数据存到磁盘上,第一个解决的问题是定位那一面(哪一个磁头),哪一个磁道,哪一个扇区

8.3. 磁盘的逻辑结构

磁盘是圆面,我们可以将它划分成线性结构

通过扇区编号,可以找到对应的CHS(C:磁道,H:磁头,S:扇区)

9. inode

文件 = 文件内容 + 文件属性

文件内容 ---- 储存在数据块

文件属性 ---- 储存在inode

代码

  • Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成
  • 超级块(Super Block):存放文件系统本身的结构信息。(记录的文件系统的基本信息:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息) Super Block的信息被破坏,可以说整个文件系统结构就被破坏了 , 所以一般,不止一个分区存放 Super Block
  • Group Descriptor Table:块组描述符,描述块组属性信息(会有inode 和 Data group的整体的使用率)
  • 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用
  • inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。
  • inode Table 节点表:存放文件属性 如 文件大小,所有者,最近修改时间等

  • Block group 数据区:存放文件内容

注意:

  • inode : 单个文件的所有属性,128字节,一般而言,一个文件,一个inode
  • 在linux系统中,识别一个文件,用的是inode编号
  • linux的文件在磁盘中存储,是将内容和属性分开存储的(inode属性中,不包括文件的名称)
  • 在一个分区被使用之前,都必须提前将部分文件系统的属性信息提前设置进对应的分区中,方便我们后续继续使用这个分区或者分组)【这种做法叫格式化】
  • 文件的删除其实只是修改 Block Bitmap 和 inode Bitmap ,数据块的内容没有动
  • 对于目录,目录也是文件,也有自己的 inode,目录也有自己的属性,目录的数据块存放的是,该目录下的文件名和其对应的inode编号的映射关系

10. 理解软硬链接

1. 认识硬链接

我们看到,真正找到磁盘上文件的并不是文件名,而是inode。 其实在linux中可以让多个文件名对应于同一个

  • ln + 已存在的文件名 + 新建的文件名

代码

不难发现 test.c 和 tmp.c是同一个文件,因为它们 inode编号一样

注意:

  • 如果要删除文件,在目录中将对应的文件删除,将硬连接数-1,如果为0,则将对应的文件释放
  • 硬链接不是一个独立的文件,因为他没有独立的inode
  • 不能硬链接目录(操作系统采用的除外,如 . .. 目录)

2. 硬链接应用场景

通常用来进行路径定位,可以进行目录间的切换

3. 软链接个数

这里 test 的硬链接个数为2,是因为 test 和 test目录下的 . 文件是同一个inode

3. 认识软链接

软连接是一个独立的文件,具有独立的 inode,也有独立的数据块,它的数据块存放的是指向文件的路径(相当于Windows的快捷方式)

  • ln -s + 目标文件名 + 新建的文件名

代码

  • unlink + 新建文件名

删除软链接

注意:

linux中,我们的每一个进程,打开的每一个文件都要有自己的inode属性和自己的页缓冲区

11. 动态库和静态库

(一)理解动静态库

 

  1. 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中(程序运行的时候将不再需要静态库
  2. 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码
  3. 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
  4. 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间

静态库 代码

生成静态库

ar -rc libmymath.a add.o sub.o

将多个 .o 文件进行打包

gcc + main.c(有main函数) + -I[大写i](头文件的所在路径) -L(库所在的路径) -l[小写l](具体哪一个库,即库的名称,库的名称是去掉 lib 和 . 后缀

库搜索路径 :

  1. 从左到右搜索-L指定的目录。
  2. 由环境变量指定的目录 (LIBRARY_PATH)
  3. 由系统指定的目录 (/lib , /usr/lib)

动态库 代码

生成动态库

gcc -shared -o libmymath.so add.o sub.o

gcc + main.c(有main函数) + -I[大写i](头文件的所在路径) -L(库所在的路径) -l[小写l](具体哪一个库,即库的名称,库的名称是去掉 lib 和 . 后缀

  • shared: 表示生成共享库格式
  • fPIC:产生位置无关码(起始位置 + 位置偏移量 = 在进程地址空间的位置)
  • 库名规则:libxxx.so

注意:

  1. 第三方库使用的时候,一定要用 gcc -l(告诉编译器链接哪一个动态库)
  2. 如果系统只提供静态链接,gcc 则只能对其进行静态链接
  3. 如果系统中需要连接多个库,则 gcc 可以链接多个库

(二)解决加载器问题

  1. 动态库在运行时,是要被加载的(静态库没有),所以存在编译器知道动态库的地址,但是加载器不知道的问题
  2. 动态库在系统中加载后,会被所有进程共享
  3. 系统在运行时,一定会存在多个动态库,需要被操作系统管理起来,即先描述,再组织,对于系统来说,所有库的加载情况是非常清楚的

解决加载找不到动态库的方法:

  1. 拷贝到系统默认的库路径/ib64/usr/lib64/
  2. 在系统默认的库路径/lib64usr/lib64/下建立软连接
  3. 将自己的库所在的路径,添加到系统的环境变量ldlibrarypath中
  4. /etc/ldso.conf.d建立自己的动态库路径的配置文件,然后重新ldconfig即可

(三)程序加载问题

1. 程序没有加载前的地址

程序编译好,内部有地址的概念,我们称为逻辑地址,逻辑地址和加载后的进程地址结构类似

2. 程序加载后的地址

注意:

PC所指向的可能是数据也可能是地址(该地址是虚拟地址)

(四)共享库加载问题

动态库会被加载到共享库中,而共享库很大,具体映射到哪里?

动态库被加载到固定地址空间的位置是不可能的,要使得库在虚拟内存中被任意加载,不采取绝对编址,只表示每个函数在库中的偏移量即可(fPIC 直接用偏移量进行对库中函数进行编址)

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

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

相关文章

vue单点登录异步执行请求https://xxx.com获取并处理数据

一、请求一个加密地址获取access_token再拼接字符串再次请求 接口返回数据 异步执行请求该地址获取数据并处理 二、请求代码第二步使用 access_token 获取 auth_key // 第二步:使用 access_token 获取 auth_keyconst access_token tokenData.access_token;const …

什么是NAND Flash?

什么是NAND Flash? NAND闪存是一种非易失性存储器技术,它彻底改变了数字时代的数据存储。它是闪存的一种形式,这意味着它可以被电擦除和重新编程。NAND闪存以NAND(NOT-AND)逻辑门命名,该逻辑门用于其基本架构。术语“…

服务运营 | 竞价风暴:在线广告交易的实时拍卖与定价艺术

编者按: 在广告交易领域,尤其是谷歌等平台的广告交易中,每一次广告展示——即向特定浏览者展示广告的机会——都是由出版商(publisher),例如《纽约时报》网站,通过实时拍卖的方式出售给广告商。…

中航通用飞机社招入职笔试:SHL题库综合能力性格问卷题型分析、高分攻略

中航通用飞机有限责任公司是中国航空工业集团有限公司旗下的大型国有企业,专注于通用航空产品的研制、通航运营与服务、航空零部件制造等业务。公司注册资本133.66亿元人民币,总资产约667亿元,员工人数超过16000人。产品线丰富,包…

8.使用 VSCode 过程中的英语积累 - Help 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂,各种生活的元素也都可以做为我们的学习对象,本文将利用 VSCode 页面上的各种英文元素来做英语的积累,如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的,借此做英语积累再合适不过&a…

C# 用Timer控件简单写一个倒计时60s功能

先放界面上一个Label和一个Timer控件,Label用来展示倒计时秒数 添加事件 设置属性,设置每隔一秒执行一次 放代码: //设置时间控件开始运行,具体放在哪里看具体需求 this.timer1.Start();//定义一个全局变量表示秒数 int time…

【手机直连卫星】除了华为Mate 60 Pro,支持卫星通信的手机还有哪些款

2023年底,华为推出的Mate 60 Pro手机,开创了智能手机卫星通信的新纪元。它支持卫星电话通话和短信功能,让用户即使在偏远山野或深海之上也能保持与外界的联系。这一技术的加入,无疑为户外探险者和遥远地区的工作者提供了难以估量的…

影院管理革新:小徐的Spring Boot应用

第二章开发技术介绍 2.1相关技术 小徐影城管理系统是在Java MySQL开发环境的基础上开发的。Java是一种服务器端脚本语言,易于学习,实用且面向用户。全球超过35%的Java驱动的互联网站点使用Java。MySQL是一个数据库管理系统,因为它…

港科夜闻 | 香港科大颁授荣誉大学院士予五位杰出人士

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大颁授荣誉大学院士予五位杰出人士。香港科大9月24日向五位杰出人士颁授荣誉大学院士,他们分别为包弼德教授、简吴秋玉女士、高秉强教授、吴永顺先生及容永祺博士(按姓氏英文字母排序)。荣誉大学院士颁…

数据结构——对顺序线性表的操作

大家好啊,今天给大家分享一下对于顺序线性表的相关操作,跟随我的步伐来开始这一篇的学习吧! 如果有知识性错误,欢迎各位指正!!一起加油!! 创作不易,希望大家多多支持哦…

一步步带你Linux内核编译与安装

Linux内核编译与安装 安装流程 #mermaid-svg-0PfY2uowOUJaN2Ov {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-0PfY2uowOUJaN2Ov .error-icon{fill:#552222;}#mermaid-svg-0PfY2uowOUJaN2Ov .error-text{fill:#5522…

高级算法设计与分析 学习笔记7 数据结构扩充

OS tree 数据统计树 本体是红黑树,除了自己的数字外还要记录自己这颗子树有几个节点。 这种特性可以让使用者迅速找到自己要找的第i个数。 往左走,给的那个数字就是排名,但是往右边走的话,那就的先加上当前的排名(也就…

宠物空气净化器希喂和352哪个好用?两大爆火机型哪款吸毛、除臭效果比较好?

猫毛、狗毛、鹦鹉毛,总之只要家里养着有带毛的宠物,毛就会出现在各种地方,床上、沙发上、衣服上、水杯里...根本躲不开。而且,除了肉眼可见的,呼吸时、说话时,不经意间还会吃到毛毛。这些毛毛飘在空气里时&…

数据结构-3.4.队列的基本概念

一.队列的定义: 1.图解: 2.重要术语: 空队列:队列中不含任何元素。 二.队列的基本操作: 三.总结:

气膜仓库:高效便捷的物流解决方案—轻空间

在现代物流行业中,效率与灵活性是关键。气膜仓库作为一种创新的仓储方式,凭借其独特的优势,正迅速成为物流企业的理想选择。 轻量化与快速搭建 气膜仓库的最大特点在于其轻量化结构。这种仓库由特制的气膜材料构成,能够在较短的时…

微服务JSR303解析部署使用全流程

目录 1、什么是JSR303校验 2、小试牛刀 【2.1】添加依赖 【2.2】添加application.yml配置文件修改端口 【2.3】创建实体类User 【2.4】创建控制器 【2.5】创建启动类 【注意】不必创建前端页面 3、规范返回值格式: 3.1添加ResultCode工具类 3.2添加Resul…

排序(插入,希尔,堆排,冒泡)

常见的排序算法: 插入排序: 直接插入排序:是一种简单的插入排序法,其基本思想是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个…

24 Vue3之集成TailwindCSS

Tailwind CSS Tailwind CSS是一个由js编写的CSS 框架 他是基于postCss 去解析的 官网地址Tailwind CSS 中文文档 - Tailwind CSS - 只需书写 HTML 代码,无需书写 CSS,即可快速构建美观的网站。 | TailwindCSS中文文档 | TailwindCSS中文网 对于PostCSS…

SigLIP技术小结

paperhttps://arxiv.org/abs/2303.15343githubhttps://github.com/google-research/big_vision个人博客位置http://myhz0606.com/article/siglip 1 背景 CLIP[1]自提出以来在zero-shot分类、跨模态搜索、多模态对齐等多个领域得到广泛应用。得益于其令人惊叹的能力&#xff0…