当前位置: 首页 > news >正文

济南建设厅网站安全员悦西安

济南建设厅网站安全员,悦西安,聊天app开发报价单,上海网站设计与开发公司目录 前言#xff1a; 一、 磁盘 #xff08;一#xff09;磁盘的物理结构 #xff08;二#xff09;磁盘的物理存储结构 1. 数据存储 2. 存储结构 二、磁盘的逻辑抽象 三、磁盘信息 #xff08;一#xff09;具体结构 #xff08;二#xff09;重新认识目录…目录 前言 一、 磁盘 一磁盘的物理结构 二磁盘的物理存储结构 1. 数据存储 2. 存储结构 二、磁盘的逻辑抽象 三、磁盘信息 一具体结构 二重新认识目录  四、理解文件系统中的增删查改 五、软硬链接 一软链接 二硬链接 三二者区别 实现原理  四取消链接 五ACM时间 六、动静态库 一什么是库 1. 库的作用 二制作一个静态库 三静态库的使用 1. 通过指定路径使用静态库 2. 将头文件和静态库文件安装至系统目录中 四制作一个动态库 五动态库的使用 2. 建立软链接 3. 更改配置文件 七、动静态库的加载 一静态库的加载 二动态库的加载 1. 加载过程 2. 动态库地址的理解 八、动态库知识补充 总结 前言 文件分为 内存文件 和 磁盘文件。磁盘文件这是一个特殊的存在因为它不属于冯诺依曼体系而是位于专门的存储设备中因此 磁盘文件 存在的意义是将文件更好的存储起来以便后续对文件进行访问。在高效存储 磁盘文件 这件事上前辈们研究出了十分巧妙的管理手段及操作方法而这些手段和方法共同构成了我们今天所谈的 文件系统。 文件系统是操作系统中负责管理持久数据的子系统简单点就是负责把用户的文件存到磁盘硬件中因为即使计算机断电了磁盘里的数据并不会丢失所以可以持久化的保存文件。 文件系统的基本数据单位是文件它的目的是对磁盘上的文件进行组织管理那组织的方式不同就会形成不同的文件系统。 一、 磁盘 一磁盘的物理结构 现在市面上的磁盘主要分为 机械硬盘 和 固态硬盘前者读取速度慢但便宜、稳定后者读取速度快但价格高昂且数据易损两者各有其应用场景本文主要介绍的是 机械硬盘。磁盘的是计算机中唯一一个机械设备同时它还是一个外设其图片如下 根据 冯诺依曼体系结构机械硬盘 在速度上远远慢于 CPU 和 内存  举例机械硬盘有多慢 假设 CPU 运行速度是纳秒级那么内存就是微秒级而机械硬盘只不是是毫秒级 为何 机械硬盘 如此慢这与它的结构有很大关系 其主要的核心物理结构有三个 磁盘片磁盘片是硬盘中承载数据存储的介制磁盘是由多个盘片叠加在一起互相之间由垫圈隔开的。盘面一片磁盘片是由两面的每一面被称为盘面磁盘片的两面都可以存储数据的。每一个盘面都有对应的磁头也就是说一个磁盘片有两个磁头的。磁头磁头是向磁盘读取数据的媒介其通过磁性原理读取磁性介质上数据。所以磁头不与盘面接触磁头悬浮在盘面上面或下面。其中还有重要的一点是磁头是共进退的.... 机械设备 控制是需要时间的因此导致 机械硬盘 读写数据速度相对于 CPU 和 内存 来说比较慢 二磁盘的物理存储结构 1. 数据存储 总所周知数据是以 0 和 1 的方式进行存储的常见的存储介质有强信号与弱信号、高电平与低电平、波峰与波谷、南极与北极 等而盘面上比较适合的是 南极与北极。 当磁头移动到指定位置时 向磁盘写入数据N-S删除磁盘中的数据S-N 磁盘中读写的本质更改基本元素的南北极、读取南北极 注意 磁头并非与盘面进行直接接触而是以 15 纳米的超低距离进行磁场更改         这个距离相当于一架波音747距离地面1米进行超低空飞行所以如果磁头制作工艺不够精湛可能会导致磁头在写入/读取数据时与盘面发生摩擦高速旋转发热从而导致磁场消失该扇区失效数据丢失。         所以机械硬盘 不能在其运行时随意移动因为角度的偏转也有可能导致发生摩擦造成数据丢失更不能用力拍打 机械硬盘 2. 存储结构 在磁盘的盘面上磁盘被一个个的同心圆以及射线进行分割从而出现了磁道 扇面扇区 扇区 被一个个的同心圆以及射线进行分割出的一个个扇形区域。扇面 两条相邻的射线之间夹的所有扇区构成扇面。磁道盘面上半径相同的扇区构成一个磁道。 柱面由于现实世界中磁盘的立体结构所以把空间中所有半径相同的磁道定义为一个柱面 其中扇区是存储的基本单元, 每个扇区其大小为512 byte或 4kb ,一般来说都是512 byte(下面我们讨论时也是以512 byte为准) 由于扇区是最小的存储单元所以在硬件的角度一个文件内容 属性无非是占用一个或多个扇区进行数据的存储。 那么在硬件上磁盘是怎么定位一个扇区的呢? —— 答案是CHS定位法 cylinder柱面 head磁头 sector扇区 磁盘中的磁头是有编号的我们首先根据扇区所在的盘面先确定使用几号磁头。每个扇区都有自己所在的磁道根据扇区所在的磁道就可以确定磁头的偏移位置。每一个扇区在所在的扇面上都已经被编好了号码磁头最后根据扇面所在的号码确定扇区。 我们既然能够通过CHS定位一个扇区那么也能定位多个扇区从而将文件能够从硬件的角度进行读取和写入 二、磁盘的逻辑抽象 有了上面的知识我们知道能够通过CHS去定位一个文件的基本单元但是操作系统是不是采用这种方式去定位磁盘中的数据呢答案是不是  这主要有以下两点原因 操作系统是软件磁盘是硬件硬件通过CHS定位扇区操作系统如果采用和硬件一样的定位方式就会和硬件之间产生很大的耦合关系如果我们的硬件变了例如机械磁盘变为固态硬盘那么操作系统也要进行变化这并不是一个好的情况。扇区的大小是512 byte 以扇区为单位进行IO时的数据量太小了在进行大量IO时这会极大的影响到运行的速度。 操作系统实际进行IO时是以4kb为单位的这个大小是可以调整的4kb 512 * 8 byte  因此将8个扇区定义为一个块操作系统按照一个块的单位进行IO。 磁盘片的物理结构是一个圆环型结构假设我们能够将每一个盘面按照磁道进行拉伸展开就像使用胶布一样那不就变成了一个线性结构了吗 展开以后对于每一个磁道里面都有许多扇区这些扇区组合起来便可以被抽象为一个数组 但是这个数组太大了而且每一个单位的数据量也有点太小了我们还要对其进行抽象我们将8个扇区组成一个块这样数组的长度就缩短了8倍经过这一层抽象后由原来的一个扇区数组变为块数组。 其中逻辑块的数组下标被定义为逻辑块地址 (LBA地址) 现在 OS 想访问具体的扇区时只需通过 起始扇区的地址 偏移量 就可以获取 LBA 地址然后通过特定手段转为 CHS 地址交给外设进行访问即可 LBA和CHS转换这个操作的原理类似于指针的解引用。 于是操作系统通过LBA地址进行访问存储的数据这就是操作系统对磁盘等存储硬件的逻辑抽象。 因此对于外设中文件的管理经过 先描述再组织 后变成了对数组的管理这个数据就是 task_struct 中的 struct block。 最后我们就能理解为什么 IO 的基本单位是 4 kb 了因为直接读取一个数据块4 kb这样可以提高 IO 效率内存对齐。 三、磁盘信息 一具体结构 经过上面的抽象我们操作系统便拿到了一个逻辑块的大数组但是这个数组太大了我们对这个大数组直接管理还是太过于困难了于是我们操作系统就可以对这个大数组进行分区管理类似于windows的分盘当我们管理好了一个分区就可以将一个分区的管理方法复制到其他的分区中从而实现了全局的数据管理。 但是每个分区的数据还是太大了操作系统还要对每一个区进行分组通过分组再次降低管理的难度其中每个分区其内部的结构如下图  Boot Block: 里面存放的是与操作系统启动相关的内容诸如分区表操作系统镜像的地址等一般这个区域被放在磁盘的0号磁头,0号磁道1号扇区中如果这个区域的内容受到破坏那么操作系统将无法启动!超级块Super Block存放文件系统本身的结构信息。记录的信息主要有bolck 和 inode的总量未使用的bolck 和inode的数量一个bolck 和inode的大小最近一次挂载的时间最近一次写入数据的时间最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏可以说整个文件系统结构就被破坏了。GDTGroup Descriptor Table块组描述符描述块组属性信息。块位图Block BitmapBlock Bitmap中记录着Data Blocks中哪个数据块已经被占用哪个数据块没有被占用。inode位图inode Bitmap每个bit位表示对应的inode是否空闲可用。i节点表inode Table:一般来说一个文件内部的所有属性被保存在一个inode节点中一个inode节点的大小一般是128字节一个分区会存在大量的文件所以一个分区中会有大量的inode节点每一个inode节点都有自己的编号这个编号也属于文件属性。为了更好的管理inode节点就要有一个专门的区域存放所有的inode节点这个区域就是inodeTable其内部可以看成一个数组结构。数据区Date blocks里面是大量的数据块,每一个数据块都可以用来存放文件内容。 细节注意要点 每一个块组都有Block Bitmap inode Bitmap inode Table Date blocks其他的部分每个块组里面可能没有。Super Block 在每一个块组里都可能存在也可能不存在但至少要有一个块组存在超级块而且每一个存在超级块的块组里面的超级块是一样的并且所有存在超级块的块组其里面的超级块是联动更新的。超级块存在多份的意义是万一其中一个超级块损坏还有其他超级块可以使用并且可以利用其他完好的超级块去修复已损坏的超级块。不至于一个超级块损坏导致整个分区的文件系统直接损坏。inode节点中有一个数组这个数组里面存放了对应文件使用的数据块的编号。inode编号不能跨分区使用每一个inode编号在一个分区内唯一有效根据inode可以确定一个分区内的分组 二重新认识目录  在Linux的命令行中我们可以使用ls -il命令可以看到文件的inode编号 其实在Linux中系统对于文件只认识inode编号并不认识文件名那你可能会很好奇我们平时一直使用的都是文件名没有使用过inode编号为什么我们还能够操作文件呢 这其实和目录有关我们的打开任意一个文件都是在一个目录里面打开的而且目录本身也是文件目录也有inode编号其里面也有内容也需要数据块其里面的内容是该目录下文件名与该文件的inode映射关系。 因此当我们使用文件名时目录会自动帮我们找到对应的inode编号完成相应的要求。 例如我们在Linux下使用cat xxx.xx 命令其大致的执行过程是 在目录下找到log.txt 的inode编号。利用inode编号在inode Table中找到inode。根据inode找到 xxx.xx文件 使用的数据块的编号。根据数据块的编号找到数据块将内容提取出来并刷新到显示器上面。   四、理解文件系统中的增删查改 查见上面的cat xxx.xx 文件的例子  删 根据当前要删除的文件名到目录中找到对应的inode编号。根据inode编号到inode Table中找到inode节点。根据inode节点中的内容找到该文件对应的Block Bitmap,然后将相应的bit进行置0表示内容的删除。根据inode编号将inode bitmap 对应的bit进行置0表示属性的删除。将当前目录中inode 编号与文件名的映射关系进行删除。   增创建一个内容为空的文件 操作系统在inode bitmap 中从低向高依次扫描将找到的第一个bit为0的位置置成1。然后在inode Table 中的对应位置写入新的属性。然后向当前目录中增加新的inode 编号与文件名的映射关系。  改 根据当前的文件名到目录中找到对应的inode 编号。根据inode编号到inode Table中找到inode节点。计算需要的数据块的个数在Block bitmap中找到未使用的数据块并将相应的bit由0置成1。将分配给文件的数据块的编号填入inode中。将数据写入到数据块中   补充细节 如果文件被误删了该怎么办数据应该怎么被恢复这里我们只讨论大致的原理答案是最好什么都不做因为Block bitmap被置为0以后相应的数据块已经不受保护了此时再创建新文件就有可能覆盖原来的文件。 数据恢复的原理是Linux系统为我们提供了一个日志这个日志里面的数据会根据时间定期刷新所有被删除的文件的inode 编号在这里都有记录通过被删除文件的inode 编号先把inode bitmap相应的位置的bit由0置成1然后根据inode 编号到inode Table中找到对应的数据块编号然后到Block bitmap中将相应位置的bit由0置成1。 上面我们说的分区分组填写系统属性是谁在做什么时候做的呢?答案是是操作系统在做是在格式化的时候做的在我们操作系统分区完成以后为了能让分区能够正常使用需要对分区进行格式化格式化的本质就是操作系统向分区内写入文件系统管理属性的信息 inode里面只是用数组来与数据块进行单纯的一 一映射吗答案是并不是的如果一个inode 里面存放数据块的编号的数组大小是15如果只是单纯的一 一映射 那么一个文件只能存储15 * 4KB 60 KB的内容。这显然是不合理的 所以inode里面存放数据块的编号的数组被规定它的前几个下标是直接索引中间几个是二级索引后面几个的三级索引 …直接索引直接指向数据块。二级索引指向一个数据块这个数据块里面的内容是直接索引。三级索引指向一个数据块这个数据块里面的内容是二级索引。 二级索引对应的数据量单位4KB / 4 * 4KB 4 MB。 三级索引对应的数据单位(4KB / 4 )^2 * 4KB 4G 。 有没有一种可能一个分组数据块没用完inode没了或者inode没用完数据块用完了 答案是有可能的如果我们一直创建空文件就可能导致inode 使用完毕而数据块没有使用完如果我们的所有内容都放在一个文件中就可能导致inode 没有使用完而数据块使用完了。 五、软硬链接 一软链接 当我们有一个文件在一个很深的目录时我们是不方便去使用这个文件的那有没有一种方式能够让我们能够轻松的找到并使用这个文件呢有的那便是软链接。软连接非常类似于windows中的快捷方式。 我们可以在当前的目录里面建立一个软连接其中软链接文件名可以自定义来让我们能够更加方便的去使用mytest 可执行程序 ln -s 文件名 软链接名可以看到执行软链接跟执行源可执行程序没有任何差别 二硬链接 生成硬链接文件就更简单了对文件 mytest 进行硬连接生成硬连接文件 my-hard-link 其中硬链接文件名也可以自定义 ln 文件名 硬连接名 // 不带参数默认是硬链接可以看到执行软链接跟执行源可执行程序没有任何差别  三二者区别 当我们进行创捷一个文件时在文件权限后面会有一个数字这个数字就是硬链接数。我们查看一下他们的inode编号 我们可以发现它们的编号并不相同源程序跟硬链接编号一样但软链接就不一样。 区别一 软链接文件的 inode 编号与源文件不同独立存在软连接文件比源文件小得多软连接的内容就是自己所指向的文件的路径硬链接文件与源文件共用一个 inode 编号对源文件其别名硬链接文件与源文件一样大并且硬链接文件与源文件的链接数变成了 2 我们再给 mytest 创建一个硬链接并且可以发现源文件的硬链接数1了同时也再次证实了硬链接与源文件 inode 一样 实现原理  那为什么源文件跟硬链接inode编号一样并且源文件硬链接数会1捏与实现原理有关 当我们创建硬链接时操作系统在当前目录里面建立新的映射关系操作系统把原文件的inode编号与硬链接建立映射关系此时一个inode编号就有了两个文件名同时在inode节点中会有一个引用计数的变量ref_count当我们建立一个硬链接时这个引用计数的变量就会自增一下表示硬链接数目加一 软链接又称为符号链接它是一个单独存在的文件拥有属于自己的 inode 属性及相应的文件内容不过在软连接的 Data block 中存放的是源文件的地址因此软连接很小并且非常依赖于源文件。 我们分别删除掉源文件看看软硬链接有什么区别 区别二 当我们将源文件删除后软连接失效因为软链接文件依赖于源文件当我们将源文件删除后硬链接仍然有效因为硬链接文件是源文件的别名 原理 假设只是单纯的删除软连接文件那么对源文件的内容没有丝毫影响就好比 windows 桌面上的快捷方式有的人以为将快捷方式软链接文件删除了就是在 “卸载” 软件其实不是如果想卸载软件直接将其源文件相关文件夹全部删除即可。 当我们删除一个文件时目录会正常帮我们删除文件名与inode的映射关系但是操作系统不一定会为我们删除原文件操作系统会将该文件对应的inode节点中的引用计算变量也会自减一下如果减完之后等于0就删除文件否则只是修改了引用计数变量。  这也就解释了为什么删除源文件后硬链接文件不受任何影响仅仅只是 硬链接数 - 1同理删除硬链接文件也不会影响源文件。 为什么新建目录的硬链接数为 2 因为一个目录在新建后其中默认存在两个隐藏文件. 与 ..其中 . 表示当前目录.. 表示上级目录 Linux 中的目录结构为多叉树即当前节点目录需要与父节点上级目录、子节点下级目录建立链接关系并且还得知道当目录的地址否则就会导致切换目录时出现错误。 为了避免因用户的误操作而导致的目录环状问题规定用户不能手动给目录建立硬链接关系只能由 OS 自动建立硬链接比如新目录后默认与上级目录和当前目录建立硬链接文件在当目录下创建新目录后当前目录的硬链接数  1 操作系统拒绝了我们的请求操作系统不允许给一个目录建立硬链接因为给目录建立硬链接可能导致环路路径问题 。 一般来说一个目录文件的硬链接数 -2 就是该目录下的目录个数。  四取消链接 取消链接的方式有两种 直接删除链接文件通过 unlink 取消链接关系 五ACM时间 每一个文件都有三个时间访问 Access、修改属性 Change、修改内容 Modify简称为 ACM 时间 可以通过 stat 查看指定文件的 ACM 时间信息 这三个时间的刷新策略如下 Access最近一次查看内容的时间具体实现取决于系统Change最近一次修改属性的时间Modify最近一次修改内容的时间内容更改后属性也会跟着修改 Access是高频操作如果每次查看都更新的话会导致 IO 效率变低因此 实际变化取决于刷新策略查看 N 后次刷新 注意 修改内容一定会导致属性时间被修改但不一定会导致访问时间被修改因为可以不打开文件对文件进行操作比如直接重定向到文件echo .... xxx.xx 六、动静态库 一什么是库 简单来说库是一些可重定向的二进制文件这些文件在链接时可以与其他的可重定向的二进制文件一起链接形成可执行程序。 一般来说库被分为静态库和动态库他们是有不同的后缀来进行区分的。 系统平台静态库动态库Windows.lib.dllLinux.a.so 另外对于C/C来说其库的名称也是有规范要求的例如在Linux下一般要求是 lib  库的真实名称 版本号 .so /.a (版本号)版本号是可以省略不写的。 比如 libstdc.so.6 去掉前缀跟后缀最终库名为 stdc libc-2.17.so去掉前缀跟后缀最终库名为 c 有了上面的一点基础知识以后我们就能够去见一见库了Linux系统在安装时已经为我们预装了CC的头文件和库文件。 对于C/C头文件在Linux里面一般在/usr/include目录下面存放我们的头文件 对于C/C的库文件一般在 /usr/lib64 和 /lib64 里面/lib64里面给的是root和内核所需so或者a之类的库文件而 /usr/lib64 是普通用户能够使用的。 1. 库的作用 提高开发效率 系统已经预装了 C/C 的头文件和库文件头文件提供说明库文件提供方法的实现 头文件提供方法说明库提供方法的实现头和库是有对应关系的是要组合在一起使用的头文件是在预处理阶段就引入的程序在链接时链接的本质其实就是链接库! 如果没有库文件那么你在开发时需要自己手动将 printf 等高频函数编写出来因此库文件可以提高我们的开发效率比如 Python 中就有很多现成的库函数可以使用效率很高。 我们在使用像vs2019这样的编译器时要下载并安装开发环境这其中是在下载什么安装编译器软件安装要开发的语言配套的库和头文件。我们在使用编译器都会有语法的自动提醒功能但是都需要先包含头文件这时为什么呢语法提醒本质是编译器或者编辑器它会自动的将用户输入的内容不断的在被包含的头文件中进行搜索自动提醒功能是依赖头文件而来的我们在写代码的时候我们的环境怎么知道我们的代码中有哪些地方有语法报错哪些地方定义变量有问题?不要小看编译器编译器有命令行的模式还有其他自动化的模式编辑器或集成开发环境可以在后台不断的帮我们调用编译器检查语法而不生成可执行文件从而达到语法检查的效果。 二制作一个静态库 库的使用能够提高我们的开发效率接下来我们来制作一个库 //myadd.h #pragma once int myadd(int x, int y);//myadd.c #include myadd.h int myadd(int x int y) {return x y; }//mysub.h #pragma once int mysub(int x, int y);//mysub.c #include mysub.h int mysub(int x, int y) {return x - y; }//main.c #include stdio.h #include myadd.h #include mysub.hint main() {int a 10, b 20;printf(%d %d %d\n, a, b, myadd(a, b));printf(%d - %d %d\n, a, b, mysub(a, b));return 0; } 我们将库的头文件与库的实现文件放在了mylib 文件夹里面了将 main.c 放在了 otherPerson 里面此时 main.c 与库的头文件以及实现文件不在一起此时编译会报错。 提示我们找不到头文件就算我们将头文件移过去也会有链接错误。如果我们想让其他人调用自己程序的一些功能但是不想把源代码交给其他人则可以把自己的程序经过预处理、编译、汇编生成 .o 文件即可重定位目标二进制文件交给别人使用。 gcc -c myadd.c mysub.c main.c再把实现功能的源代码与二进制文件、使用功能的程序分别分离到 mylib 与 otherPerson 目录中把 main.c 文件也使用指令 gcc -c 生成 .o  文件再与其他 .o 文件进行链接最后生成可执行文件 同样执行成功。 上面的整个过程就是我们制作静态库的基本流程当然这样的制作其实还是有缺陷的当我们的项目文件过于庞大时我们要给一个.c文件十几个这样的.o文件而且文件过于分散了,不利于管理于是我们就需要将多个这样的.o文件打成一个包我们将这个包直接给别人别人就能直接使用了。 打包的命令是 ar -rc [lib库名.a] [*.o] ar 命令用于建立或修改备存文件或是从备存文件中抽取文件。可集合许多文件成为单一的备存文件在备存文件中所有成员文件皆保有原来的属性与权限。r 如果打包好的 xxx.a 库中没有 xxx.o 那么就会把模块 xxx.o 添加到库的末尾如果有的话就会替换之位置还是原来的位置。c 建立备存文件。 三静态库的使用 1. 通过指定路径使用静态库 在我们实际使用库时我们一般将头文件放在一个目录里面将库放到另外一个文件里面这样便于我们进行分类管理。我们也按照这种标准化的做法来整理一下我们的目录结构。 我们 libmymath.a 静态库不是C的标准库编译器不认识第三方库需要提供第三方库的路径及库名所以gcc不会在进行编译时去链接我们自己写的静态库所以我们还要给gcc添加一些参数用来指明我们要链接的静态库。  正确写法加上需链接的库 其中 -I - L -l ,其后面传递的内容可以加空格进行分割也可以不加空格 -I: 指明我们要包含的头文件路径此处为 ../include-L :指明我们包含的库的路径此处为 ../mylib-l:指明我们要包含的库文件名这里的库文件名是指真实名称库名称为 mymath 为什么编译 C/C 代码时不需要指定路径 因为这些库都是系统级的gcc/g 默认找的就是 stdc/stdc 库 2. 将头文件和静态库文件安装至系统目录中 除了这种比较麻烦的指定路径编译外我们还可以将头文件与动态库文件直接安装在系统目录中直接使用无需指定路径需要指定静态库名 所谓的安装软件就是将自己的文件安装到系统目录下 sudo cp ./include/*.h /usr/include/ sudo cp ./mylib/*.a /lib64/注意 将自己写的文件安装到系统目录下是一件危险的事导致系统环境被污染用完后记得手动删除 。 总结:第三方库的使用 需要指定的头文件和库文件。如果没有默认安装到系统gcc、g默认的搜索路径下用户必须指明对应的选项告知编译器: a.头文件在哪里 b.库文件在哪里 c.库文件具体是谁。将我们下载下来的库和头文件拷贝到系统默认路径下在Linux下就是安装库! 那么卸载呢?对任何软件而言安装和卸载的本质就是拷贝到系统特定的路径下!如果我们安装的库是第三方的库我们要正常使用即便是已经全部安装到了系统中gcc g必须用 -l 指明具体库的名称!无论我们是从网络中直接下载的库还是源代码编译方法。都会提供一个 make install 安装的命令这个命令所做的就是安装到系统中的工作。我们安装大部分指令、库等等都是需要 sudo 提权的。 四制作一个动态库 动态库动态库不同于静态库动态库中的函数代码不需要加载到源文件中而是通过 与位置无关码 对指定函数进行链接使用。 动态库的打包也同样分为两步 编译源文件生成二进制可链接文件此时需要加上 -fPIC 与位置无关码(下文会详细解释)通过 gcc/g 直接目标程序此时不需要使用 ar 归档工具 将源文件编译为 .o 二进制文件此时需要带上 -fPIC 与位置无关码 gcc -c -fPIC *.c将所有的 .o 文件打包为动态库借助 gcc/g  gcc -o libmycalc.so *.o -shared当我们有了动态库以后我们是可以删除可重定向的二进制文件的但是动态库不能够删除动态库删除的话依赖此动态库的程序也将不能够运行 五动态库的使用 下面我们尝试用动态库去链接形成可执行程序 注意我们自己写的库是属于第三方库我们要编译时要指明头文件路径库文件路径库文件名真实名称。  发生了错误系统提示我们程序运行时没有办法找到动态库这是为什么呢 这就和动态库的特性有关了由于采用动态库的程序在运行的时候才去链接动态库的代码多个程序共享使用库的代码所以运行的程序必须要知道去哪里链接我们的库即对于动态库在编译期间我们要告诉编译器去哪里链接库进行编译在运行期间要告诉操作系统去哪里链接库进行运行。 静态库不需要链接是因为静态库在编译链接期间将用户使用的二进制代码直接拷贝到目标可执行程序中编译后的程序是一个完整的程序不需要再运行时再使用静态库了。 操作系统查找动态库的方法有三种 设置环境变量LD_LIBRARY_PATH。在系统指定路径下建立软链接指向对应的库。配置文件。 在我们Linux下有一个环境变量LD_LIBRARY_PATH操作系统会去这个环境变量下的路径去搜索动态库我们可以将我们的第三方库加入到这个环境变量中然后我们再运行我们的可执行程序就能成功了。 export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/home/yrj/Linux/file/FileSystem/mylib_static_dynamic/mylib注意 更改环境变量只是临时方案因为重新登录后会失效需重新添加才能成功执行 2. 建立软链接 我们知道Linux中C/C的默认库路径是/usr/lib64或/lib64这也是系统搜索库的默认路径我们可以将我们的第三方库在二者之中下面建立一个软连接不推荐直接将第三方库拷贝到默认库路径/usr/lib64或/lib64下面这样我们也能够正常使用了。 sudo ln -s /home/yrj/Linux/file/FileSystem/mylib_static_dynamic/mylib/libmymath.so /lib64/libmymath.so通过 ldd 查看程序链接情况  因为软链接是一个正常的文件永远保存在磁盘上所以我们退出后再次登录时程序依然可以正常运行。 3. 更改配置文件 在我们的Linux系统中有一个配置文件目录/etc/ld.so.conf.d在这个目录里面我们可以创建一个文件文件里面写上动态库的路径这样我们系统在搜索动态库时也会搜索到该路径。 现在我们自己在此目录下 touch 一个配置文件并在该配置文件内输入所需库的路径 更改完配置文件后需要让该配置文件生效。采用指令 ldconfig ​​​​​​​ 注意 后两种方法都可以做到永久生效因为存入了系统目录中但在使用完后最好删除避免污染系统环境  七、动静态库的加载 一静态库的加载 在形成可执行程序的链接期间静态库中的代码会被直接拷贝一份进入可执行程序内。所以在程序运行期间静态库可以理解为不会被加载或者说静态库和程序一起被加载。 但是由于是静态库当多个进程包含相同的静态库时这会导致内存中存在大量的重复代码导致内存资源的浪费。 二动态库的加载 1. 加载过程 当使用动态库编译好了一个可执行文件后该可执行文件存储在磁盘当中并在运行时加载到内存里。 我们知道程序被加载到内存后就变成了进程OS会在内存中创建对应的 task_struct 、 mm_struct 、 页表 。用户在执行程序中的代码时正常执行。当需要执行动态库内的代码时OS会先在内存中搜寻动态库是否存在如果存在就直接将动态库通过页表进行映射到进程的进程地址空间中的共享区中否则就会将磁盘中的动态库加载进入内存然后再通过页表进行映射映射到虚拟地址空间的共享区中。这些动作都是由OS自动完成的。 可执行文件在被编译完成时就已经具备了对应的虚拟地址。以上动作完成后再执行动态库内的代码OS会自动识别并跳转到虚拟地址的共享区部分通过页表的映射关系执行内存中对应的动态库代码动态库代码执行完毕后再回到虚拟地址的代码区部分继续执行下面的其他代码。 换句话说只要把库加载到内存映射到进程的地址空间后进程执行库中的方法就依旧还是在自己的地址空间内进行函数跳转即可。 2. 动态库地址的理解 在程序编译链接形成可执行程序的时候可执行程序内部就已经有地址了地址一共有两类分别是绝对编址与相对编址。我们知道被编译好的程序内部是有地址的动态库内部的地址并不是绝对地址而是偏移量(相对地址) 动态库必定面临一个问题不同的进程运行程度不同需要使用的第三方库是不同的这就注定了每一个进程的共享区中的空闲位置是不确定的。如果采用了绝对编址在一个进程使用了多个库时就有可能照成地址冲突因此动态库中函数的地址绝对不能使用绝对编址动态库中的所有地址都是偏移量默认从 0 开始。简单来说库中的函数只需要记录自己在该库中的偏移量即相对地址就可以了。 当一个库真正的被映射到进程地址空间时他的起始地址才能真正的确定并且被OS管理起来。OS本身管理库所以OS知道我们调用库中函数时使用的是哪一个库这个库的起始地址是什么。当需要执行库中的函数时只需要拿到库的起始地址加上对应函数在该库中的偏移量就能够调用对应函数了。 借助函数在库中的相对地址无论库被加载到了共享区的哪一个位置都不影响我们准确的找到对应函数也不会与其他库产生冲突了! 所以这种库被称为动态库动态库中地址偏移量被称为与位置无关码。 八、动态库知识补充 当同时拥有 静态库 和 动态库 时默认采用动态链接 如果想要使用静态链接则需要在编译时加上 -static 命令选项。  如果只有静态库但又不指定静态链接会发生什么 会默认使用动态链接。而对于其他的比如C库等等依然默认使用动态链接。  可以看看以上三种方式生成的可执行程序大小 静态链接生成的程序比动态链接大得多并且内含静态库的动态链接程序也比纯粹的动态链接程序大说明程序不是 非静即动可以同时使用动态库与静态库 。 总结 关于动静态库的优缺点可以看看下面这个表格 区别动态库静态库调用方式通过函数位置进行调用直接将需要的函数拷贝至程序中依赖性(运行时)需要依赖于动态库可以独立于静态库运行空间占用共享动态库中的代码空间占用少拷贝代码会占用大量空间加载速度调用函数加载速度慢直接运行加载速度快
http://www.yutouwan.com/news/289017/

相关文章:

  • 表格我做视频网站网站开发checklist
  • 自动发货网站怎么做网站设计开发
  • 腾讯大浙网 网站开发个人网站如果做
  • 建网站赚钱方法如何用wordpress做企业
  • 常德建设局官方网站济南网站建设方案
  • 简单网站开发工具莱芜雪野湖风景区门票
  • 高端网站建设价格商务网站规划与设计实训报告
  • 哪个网站上网好网站的跳出率
  • 网站建设 音频插件淘宝关键词查询工具哪个好
  • 免费发广告帖子的网站北京赛车网站建设
  • 网站升级维护要多久小程序制作
  • 百度站长推送自助建网站哪个便宜
  • 网上书城网站开发的结论和不足百度seo排名原理
  • 网站拒绝了您的访问网页价格表
  • 网站运营建设的培训班wordpress教程主题
  • asp.net 网站开发项目化教程微信建站网站
  • 爱站网关键词查询网上做任务网站有哪些
  • 做网站如何寻找客源彩票网站为啥链接做两次跳转
  • 网站服务器上的跳转选择怎么做做营养的网站
  • 网站推广怎么样临沂网站建设设计公司
  • 酒类营销网站广州高端网站建设定制
  • 手机网站开发方式广州全网推广
  • 珍爱网建设网站的目的芝罘区网
  • 网站建设研究背景wordpress百度移动落地页
  • joomla 网站建设教程wordpress系统和插件下载
  • 做展厅 参考什么网站汉字域名注册
  • 惠州网站建设培训网站关键词排名快速提升
  • 官网整站优化90设计网站免费素材
  • 网站网络投票建设步骤展会设计公司简介
  • 北京专业做网站设计公司淘宝网站建设方式