Linux学习之软硬链接及动静态库

news2024/7/30 6:06:33

前言:在之前的文章http://t.csdnimg.cn/Lru5Ticon-default.png?t=N7T8http://t.csdnimg.cn/Lru5T

我们已经对Linux 系统里面的文件具有一定的理解了,现在我们将继续学习Linux里面的软硬连接和动静态库,这些是Linux里面的一些重要内容。

目录

一,文件管理

1)分区

2)文件编号

3)如何通过绝对文件编号找到文件

二,软硬链接

1)硬链接

2)软链接

三,动静态库

1)概念

 2)静态库优势

3) 动态库优势


一,文件管理

1)分区

首先我们要思考一下,Linux里面有成千上万的文件,我们该如何准确快速找到我们需要的文件并且进行管理呢?现在我们将来讲解一下这里面隐藏的秘密。

首先我们通过window系统的C,D盘,我们可以知道window操作系统对磁盘空间进行了分区,我们的Linux系统里面同样进行了这样的操作,为什么要分区呢?我们可以把我们想象成一个班主任,我们需要对班上50个同学进行管理,我们该如何入手呢?如果一次性直接对所有同学进行管理,把每个同学当作一个单位,任务未免太重了,这个时候我们不妨把同学分为四个小组,我们只要能将其中一个小组管理好,其他小组仿照这个小组的管理方法,我们不就能管理好所有的小组和同学了。

这就是Linux里面分盘的目的,将难以处理的问题分为类似的小问题,管理好一个小问题就能管理好所有的小问题,最后管理好整个大问题。

2)文件编号

现在我们已经将磁盘分为了很多个区,每个区里还是有成千上万的文件,这些文件我们该怎么处理呢?我们参照C/C++里面的地址概念,我们把每一个文件都分配一个编号,在这个分区里面我们通过编号就能管理好所有文件,但是一个新问题出现了,每个文件的编号如何分配和找到呢》文件都需要分配内存,这个内存该怎么分配呢?我们该如何找到和分配空余的空间呢?现在我先放一张图,根据这张图我们的一切疑惑都会解决的

 首先我们来看inodeTable里面存储的就是文件在分区里面的文件相对编号,注意是相对编号(等下我们会讲绝对编号,希望大家记住这个相对编号的概念),不是绝对的文件编号,也就是我们看到能的文件编号,这里面的编号分区里面是唯一的,但是不同分区之间是会有重复的,我们拿到一个相对文件编号发现它存在之后就能在inodeTable找到这个文件的属性,通过属性我们能知道它的各种信息从而对它进行管理。那我们该如何知道这个文件是否存在呢?很多人说遍历一遍就行了,这个观念是完全错误的,Linux里面删除文件不会把它的文件内容删除为空白,因为这样子效率不仅低而且干扰判断,这种做法相比于有了新文件覆盖老位置比无疑十分愚蠢,因此我们就会利用inodeBitmap了,这是什么呢?这是一个位图,每个比特位里面存储这信息,0和1代表存不存在文件,bitmap里面每个比特位代表了每个文件是否存在,我们查找文件之前需要先查看bitmap,看文件是否存在,不存在会返回查找不到的错误。创建一个文件就会将对应bitmap置为1,同理删除一个文件就会将对应bitmap置为0.

那文件的内存该如何分配呢?我们先看上图的data blocks,没错这就是文件的内容存储空间,眼尖的人可能会发现还有个block bitmap,这个是干嘛的呢?这个是用来标记data block开空间的分配的,和inode bitmap用法类似,但我们创建一个新文件需要分配空间就需要根据bitmap里面的内容来分配空间,并且将相应位置置为1,删除通过inode Table找到文件空间的bitmap将其置为0.

Group descriptor table是一个结构体,里面描述了data block的空间分配情况。

super Block也是一个结构体,里面存放文件系统本身的结构信息,bolck 和 inode的总量, 未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了,这个速配Block并不是所有分区都有,只有某几个分区里面有,并且每个super Block里面的内容一样。

上图里面的boot block是一个特定的磁盘区域,通常位于磁盘的开始部分,用于存储启动加载器(boot loader)的代码。这个区域在启动过程中被BIOS或UEFI固件读取,以启动操作系统。

3)如何通过绝对文件编号找到文件

首先给我们一个文件绝对编号,首先我们判断文件处于哪一个磁盘?每个磁盘都会有自己的文件inode绝对编号范围,然后绝对编号减去相对编号,通过相对编号里面的inode bitmap判断文件是否存在,存在通过inode table取到文件属性来管理文件。

二,软硬链接

1)硬链接

如何创建一个硬链接,现在先演示给一个文件test.c创建一个硬链接

 ln   被创建硬链接的文件   硬链接的名字

硬链接并没有创建新文件,只是提供了一个快捷方式而已,为什么这么说呢?大家看我给的图,里面的inode编号

大家发现了没有,这两个文件inode编号一样,我们都知道inode文件编号都是唯一的,这能说明,这根本就是同一个文件。另外我们需要注意,不能给目录创建硬链接,不然会陷入死循环递归。

2)软链接

软链接相比于硬链接只多了一个参数,在ln 后面加个-s就欧克啦。

 那我们按照上面的思路来看看软链接的inode编号

我们惊奇的发现两个文件的inode编号不一致,也就是说这是两个不同的文件,那为什么软链接也是一个快捷方式呢?因为软链接里面存储了文件的路径,通过这个文件我们同样能打开test.c。

三,动静态库

1)概念

静态库:在编译链接的时候将链接的代码加入源文件来编译运行。

动态库:在运行时链接动态库的代码,将代码加载到内存里面,多个程序可以共享一段代码。

 2)静态库优势
  1. 加载速度快:由于静态库在链接阶段就将汇编生成的目标文件与引用的库一起链接到可执行文件中,因此执行期间代码装载速度快。
  2. 移植方便:发布程序时无需提供静态库,使得程序在不同的环境或系统上的移植更为便捷。
3) 动态库优势
  1. 节省磁盘和内存空间:动态库允许多个应用程序共享内存中的同一份库文件。这意味着,即使多个程序使用相同的库,也只需要在内存中加载一份库文件,从而显著节省了磁盘和内存空间。相反,静态库在链接阶段将库代码直接加载到每个可执行文件中,导致相同的库代码在多个程序中重复存在,浪费空间。
  2. 更新维护方便:动态库在程序运行时才被加载,因此,当库文件需要更新时,只需要替换相应的动态库文件,而无需重新编译整个程序。这使得软件的维护和升级变得更加简单和高效。相比之下,静态库如果发生更新,所有使用它的应用程序都需要重新编译,这无疑增加了维护的复杂性和成本。
  3. 实现进程间资源共享:动态库允许不同的进程共享同一份库文件,这不仅提高了资源的利用率,还促进了进程间的协作和通信。
  4. 支持模块化开发:动态库支持模块化开发,这意味着开发者可以将代码拆分成多个独立的模块,每个模块可以单独编译和更新,提高了开发效率和代码的可维护性。

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

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

相关文章

基于Givens旋转完成QR分解进而求解实矩阵的逆矩阵

基于Givens旋转完成QR分解进而求解实矩阵的逆矩阵 目录 前言 一、Givens旋转简介 二、Givens旋转解释 三、Givens旋转进行QR分解 四、Givens旋转进行QR分解数值计算例子 五、求逆矩阵 六、MATLAB仿真 七、参考资料 总结 前言 在进行QR分解时,HouseHolder变换…

【opencv】教程代码 —features2D(5)旋转相机的基本全景拼接

基本全景拼接 panorama_stitching_rotating_camera.cpp 将第二张图像进行透视变换后与第一张图像拼接 #include <iostream> // 包含了一些用于输入输出的函数 #include <opencv2/core.hpp> // 包含了OpenCV核心库的一些常用类和函数 #include <opencv2/imgpro…

[leetcode] 46. 全排列

文章目录 题目描述解题方法dfsjava代码复杂度分析 相似题目 题目描述 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3]…

实验三智能手机互联网程序设计(微信程序方向)实验报告

实验目的和要求 请编写下方商品列表页面&#xff0c;展示商品名称和价格&#xff1b; 二、实验步骤与结果&#xff08;给出对应的代码或运行结果截图&#xff09; Index.WXML <view class"shop" wx:for"{{10}}"> <vie…

何從Microsoft下載Windows 10 最新版本的ISO

許多新手用戶不知道如何從Microsoft下載最新版本的Windows 10 ISO(32 位或 64 位)。在本指南中,我們將向您展示如何直接從Microsoft下載最新版本的Windows 10 ISO。請注意收藏以備不時之需哦。 您可能知道,除了幾個次要更新外,微軟每年都會向 Windows 10 發布兩個主要更新…

阿里云服务器ECS u1实例ecs.u1-c1m2.large性能测评

阿里云服务器u1是通用算力型云服务器&#xff0c;CPU采用2.5 GHz主频的Intel(R) Xeon(R) Platinum处理器&#xff0c;ECS通用算力型u1云服务器不适用于游戏和高频交易等需要极致性能的应用场景及对业务性能一致性有强诉求的应用场景(比如业务HA场景主备机需要性能一致)&#xf…

Yarn的安装和使用(2):使用及问题解决

Yarn是JavaScript的依赖管理工具&#xff0c;它与npm类似&#xff0c;但提供了一些额外的性能优化和一致性保证。 Yarn的使用&#xff1a; 初始化项目&#xff1a; yarn init 此命令会引导您创建一个新的package.json文件&#xff0c;用于记录项目的元信息和依赖。 添加依赖&…

如何恢复已删除的 Office 文件

丢失了重要文件并需要将其找回&#xff1f;这些提示将帮助您立即恢复 Office 文档。 没有什么比无法访问您已经处理了几个小时的文档更令人沮丧的了。无论文件是否已损坏、删除或以其他方式丢失&#xff0c;都会感觉浪费了巨大的时间和精力。 幸运的是&#xff0c;使用 Micro…

Apache Hive的基本使用语法(一)

一、数据库操作 创建数据库 create database if not exists myhive;查看数据库 use myhive; desc database myhive;创建数据库并指定hdfs存储 create database myhive2 location /myhive2;删除空数据库&#xff08;如果有表会报错&#xff09; drop database myhive;…

ubuntu之搭建samba文件服务器

1. 在服务器端安装samba程序 sudo apt-get install samba sudo apt-get install smbclient 2.配置samba服务 sudo gedit /etc/samba/smb.conf 在文件末尾追加入以下配置 [develop_share] valid users ancy path /home/ancy public yes writable y…

Python文件操作命令

文件操作 我知道你最近很累&#xff0c;是那种看不见的、身体上和精神上的疲惫感&#xff0c;但是请你一定要坚持下去。就算无人问津也好&#xff0c;技不如人也好&#xff0c;千万别让烦躁和焦虑毁了你的热情和定力。别贪心&#xff0c;我们不可能什么都有&#xff0c;也别灰心…

亚信安全荣获2023年度5G创新应用评优活动两项大奖

近日&#xff0c;“关于2023 年度5G 创新应用评优活动评选结果”正式公布&#xff0c;亚信安全凭借在5G安全领域的深厚积累和创新实践&#xff0c;成功荣获“5G技术创新的优秀代表”和“5G应用创新的杰出实践”两项大奖。 面向异构安全能力的5G安全自动化响应系统 作为5G技术创…

【C语言】结构体详解(一)

目录 1、什么是结构体? 2、结构体成分 3、结构体变量的定义与初始化 3.1、结构体变量的三种定义方式 3.2、结构体变量的初始化 4、结构体成员的访问&#xff08;两种方式&#xff09; 4.1、直接访问 4.2、间接访问 5、结构的特殊声明 5.1、不完全声明&#xff08;匿…

白色微立体的智能界面,就喜欢这种简洁白净。

本次发一些微立体风格的智能家居界面&#xff0c;风格为微立体&#xff0c;也叫轻拟物风格&#xff0c;或者新拟态风格。

规划控制如何兼顾安全与舒适性

规划控制如何兼顾安全与舒适性 附赠自动驾驶学习资料和量产经验&#xff1a;链接 **导读&#xff1a;**自动驾驶技术研发对于“安全第一”的追求是毋庸置疑的&#xff0c;但是这中间可能就忽视了舒适性。 因此&#xff0c;今天我想给大家分享的是&#xff0c;自动驾驶研发如何…

探究ThreadLocal的魔数0x61c88647和Entry数组

探究ThreadLocal 下面有一个很重要的HASH_INCREMENT,他的值是0x61c88647 public class ThreadLocal<T> {/***ThreadLocals依赖于附加到每个线程的每线程线性探针哈希映射 (thread.threadLocals和inheritableThreadLocals)。ThreadLocal对象充当键&#xff0c;通过threa…

uniApp使用XR-Frame创建3D场景(4)金属度和粗糙度

上一篇讲解了如何在uniApp中创建xr-frame子组件并创建简单的3D场景。 这一篇我们讲解xr-frame中关于mesh网格材质的金属度和粗糙度的设置。 1.先看源码 <xr-scene render-system"alpha:true" bind:ready"handleReady"> <xr-node visible"{…

Java使用数组实现栈、队列、堆

数组模拟栈&#xff1a; const int N 10010; // ******************** 栈 int stk[N], tt//tt是下标; // 插入 stk[k] x; // 删除 tt--; // 判断栈是否为空 if (tt > 0) not empty else empty // 栈顶 stk[tt]; // ******************** 队列 // 在队尾插入…

可视化图表:关系图,一图分清父子兄弟关系。

Hi&#xff0c;我是贝格前端工场的老司机&#xff0c;本文分享可视化图表设计的关系图设计&#xff0c;欢迎老铁持续关注我们。 在现代信息爆炸的时代&#xff0c;我们需要从庞大的数据中提取有用的信息和洞察。而可视化图表作为数据分析和展示的重要工具之一&#xff0c;被广泛…

《新机器智能》的深度解读与感悟

《新机器智能》的深度解读与感悟 引言[1] 脑科学对于人工智能研发的意义[2] 新皮质建立了世界模型[3] 记忆-预测模型[4] 记忆-预测模型是如何工作的[5] 意识与创造力[6] 智能的未来1.我们能创造人工智能吗&#xff1f;2.我们应该制造智能机器吗&#xff1f;3.智能机器能做些什么…