【Linux】inode软硬连接

news2024/10/7 8:20:38

文章目录

  • 📖 前言
  • 1. 文件系统
    • 1.1 磁盘的物理结构:
    • 1.2 CSH和LBA:
    • 1.3 IO的基本单位:
    • 1.4 文件系统结构:
    • 1.5 认识inode:
  • 2. 软硬连接
    • 2.1 目录和文件的硬连接数:
    • 2.2 软连接:
    • 2.3 硬连接:
    • 2.4 软硬连接的区别:

📖 前言

本章我们将学习学习认识一下磁盘的的物理结构,理解磁盘分区分块,如何对区块进行管理。学习认识inode和软硬连接。目标已经确定,接下来就要搬好小板凳,准备开讲了…🙆🙆🙆🙆


1. 文件系统

1.1 磁盘的物理结构:

前面我们学到的所有的东西,全部都是在内存中。但是并不是所有的文件都被打开了。
大量的文件,就在磁盘上,静静的躺着,这批文件非常多,杂,乱。
视角,从内存中移开,视角,迁移到磁盘上。
磁盘基本的文件管理,本质工作:就和快递站的老板做的工作是一样的!

磁盘是我们电脑上的唯一的一个机械设备目前,我们笔记本上,可能已经不用磁盘了而是SSD(固态硬盘)。磁盘更加的便宜,公司的服务器大部分都是磁盘式的服务器,SSD的耐用性不如磁盘。

在这里插入图片描述
存储数据原理:

磁盘存储数据的原理是基于磁性材料和磁场相互作用的物理过程。在硬盘和磁带等磁介质上,数据以磁场的形式进行存储和读取。

磁性,改变N/S极,就是改变了0/1

当我们改变磁盘上某一个位置的N/S极,就好比更改了此处保存的数据0/1

在这里插入图片描述

  • 一个面,一个磁头。
  • 机械式 + 外设 = 磁盘一定是很慢的(相比于CPU,内存)

在这里插入图片描述
磁盘存储结构由多个组件组成,每个组件都有不同的功能和作用。以下是磁盘存储结构中常见的组件及其解释:

  1. 盘片(Platters):盘片是磁盘存储结构的主要部分,通常由金属或玻璃材料制成。它们被堆叠在一起,并通过主轴旋转。数据存储在盘片的表面上,每个盘片的两个面都可以用于数据存储。

  2. 磁头(Heads):磁头是用于读取和写入数据的装置,通常由电磁部件组成。磁头位于盘片的表面上方或下方,能够浮动在非常接近盘片表面的位置,并通过微小的电流产生磁场,与盘片上的磁场相互作用。

  3. 臂(Arm):臂是磁头的支撑结构,也被称为寻道臂。臂一端连接着磁头,另一端连接到驱动器的位置控制系统。臂可以在盘片的边缘上移动,将磁头定位到指定的磁道上。

  4. 磁道(Track):磁道是盘片上的一个圆环形区域,被划分为多个同心圆。每个磁道上可以存储一定容量的数据,磁头通过臂将其定位到指定磁道上进行读写操作。

  5. 柱面(Cylinder): 柱面是指位于多个盘片上同一径向位置的磁道的集合。换句话说,柱面由多个盘片上相同编号的磁道组成,这些磁道在垂直方向上对齐形成一个柱状结构。每个盘片都有多个柱面,且每个柱面上的磁道数量相同。使用柱面编号的方式可以简化磁头的寻道操作。

  6. 扇区(Sector):扇区是磁道上的最小单位,用于存储数据。通常情况下,每个扇区的大小为512字节或4KB。数据的读取和写入以扇区为单位进行。

  7. 主轴(Spindle):主轴是盘片的旋转中心轴,通过电机驱动使盘片高速旋转。主轴的旋转速度通常以每分钟转数(RPM)来衡量,例如7,200 RPM或10,000 RPM。

  8. 驱动器控制器(Drive Controller):驱动器控制器是磁盘驱动器上的电路板,负责控制整个磁盘存储系统的操作。它连接到计算机系统,并根据计算机的指令控制磁头的移动、数据读取和写入等操作。

这些组件共同协作,实现了数据在磁盘上的存储和访问过程。通过磁头的移动和盘片的旋转,可以精确地读取和写入数据,从而实现高效的数据存储和检索。

读写磁盘的时候,磁头找的是某一个面的某一个磁道的某一个扇区:

  • 盘面(有两面)有自己对应的磁头
  • 磁道 是由距离圆心的半径决定的
  • 扇区是由盘面旋转决定的

操作系统的文件系统所作的工作,便是将文件和其对应的扇区联系起来。用上面提到的办法,便可以查找到每一个扇区!

  • 只要我们能找到磁盘上的盘面,柱面(磁道),扇区,就能找到一个存储单元!
  • 用同样的方法,我们可以找到所有的基本单元!!

这种查找数据位置的操作,被称为CHS寻址,CHS分别对应磁柱、磁面、扇区。


1.2 CSH和LBA:

CHS的寻址方式:

  • 如何确定数据被写到盘面对的哪些位置呢?
  • 先确定某一个柱面或者磁道,再确定是哪个面。
  • 接下来是确定在哪个扇区,然后某一个存储单元就能确定了。
  • 就能找到任意一个指定的扇区。

相信我们都见过磁带,卷起来是一盘,拉直了是一个长条。而我们的磁盘也可以看作将每个磁道拉直了,连起来就是个长条,我们可以看作是一个大数组。

在这里插入图片描述

  • 此时,对磁盘文件的修改,就可以抽象成对内核中一个数组的增删查改操作!
  • 将每一小块管好,整个也就管好了,对磁盘的管理就想象成了对数组的管理。

这种抽象之后的磁盘,被称为LBA逻辑块地址方式。

通过整除 + 取模等操作,就可以将LBA逻辑块地址转换成CHS地址来确定具体位置。

具体计算过程参考:学习传送门

修改了数组中的数据之后,操作系统将LBA对应的CHS地址算出来交给磁盘,让磁盘来修改指定扇区的数据,便实现了保存数据到磁盘中的操作。


1.3 IO的基本单位:

对于操作系统而言,一次IO的基本单位通常是块(block),通常情况下,一个块的大小等于一个扇区的大小。扇区是磁盘存储的最小单位,一般为512字节或者4KB。

磁盘访问的基本单位是扇区,不代表磁盘将来就必须以扇区为单位访问。我们可以以多个扇区为单位去访问。

为什么通常是4KB呢?

IO基本单位一般选择4KB的原因有几个方面的考虑:

  1. 存储介质特性:传统硬盘(磁盘)的扇区大小通常是512字节,而一个4KB的块恰好包含了8个扇区。以4KB作为IO基本单位可以更好地匹配硬盘的物理组织结构,减少读取和写入时的寻道开销,提高存储设备的读写效率。
  2. 缓存效果:较大的块大小有助于提高IO操作的缓存效果。当系统进行IO操作时,会将整个块加载到内存缓存中。较大的块大小可以最大程度地利用内存的缓存能力,减少频繁的磁盘访问,从而提高整体的读写性能。
  3. 文件系统的块大小:许多文件系统以4KB作为默认的块大小,选择与文件系统块大小一致的IO单位可以更好地与文件系统进行协作。这样可以避免额外的转换和管理开销,提高数据读写的效率。

其中我个人认为最重要的一点就是:

  • 不要让软件(OS)设计和硬件(磁盘)具有强相关性,换句话说,就是解耦合!
  • 内存也要以申请4KB的空间来接收。

需要注意的是,IO基本单位的选择也会受到具体应用场景、硬件限制以及性能需求的影响。对于某些特定应用,可能会使用其他大小的块来满足特定的需求。因此,选择IO基本单位的最佳大小需要综合考虑各种因素,并进行实际测试和评估。


1.4 文件系统结构:

上述我们讲到,将磁盘看作是一个大的数组,将大数组分块,只要将每一块管理好,那么整个磁盘也就管理到位了。

在这里插入图片描述

假设分区有100GB,我们分了20个小组,接下来再分组,分了五个组,所以最后要想把磁盘管好,就要把块组管好,也就是最后把1GB管好。

Boot Block与开机有关:

一般计算机在刚开始启动的时候,首先加电自检,然后找主板上的一个设备Base 10 System,它是硬件,里面大概有五百多字节的存储空间,里面就存储了磁盘设备,当它启动之后定要去找计算机里面,操作系统在什么地方,所以它启动之后一定要读取一个分区里面的Boot Block,这个当中就表明了一个机器的开机信息,包括分区表,同时还告诉我们操作系统中软件在什么地方。
所以硬件层面上,系统启动时,读取这一小块数据就可以直接找到操作系统,然后加载操作系统,俗称:开机。

Linux采用的是文件内容、文件属性分开存放的存储方式:

  • 文件的属性是稳定的
  • 文件的内容在不断增多

1.5 认识inode:

Linux中文件的属性信息(如权限、所有者、大小等)是通过inode来存储和管理的:

  • 每个文件都有一个唯一的inode号码,用于标识该文件。
  • inode是文件系统中的一个数据结构,它包含了文件的元数据信息。
  • 包括文件的权限、时间戳、大小等。
  • 当然也有一些文件没有inode。

文件名是用户给文件分配的可识别和易记的名称,而inode是文件系统内部用来唯一标识和管理文件的数据结构。

在这里插入图片描述

在这里插入图片描述

  • Data blocks: 以块为单位,进行文件内容的保存!
  • inode table:以128字节为单位,进行inode属性的保存!
  • 如何标定文件的唯一性?
    • inode属性里面有一个inode编号!
  • 一个分区内,一个inode是具有唯一性的。
    • 一般而言,一个文件,一个inode,一个文件,一个inode号 !
  • Block Bitmap: 标识每个块是否已经被使用了。用比特位的内容,来表示对应的块是否被占用。用比特位的位置,来表示哪个数据块。
  • inode Bitmap: 用比特位的位置来代表是第几个inode,用对应位置比特位是0还是1来表示,inode表里的inode是否被占用。
  • GDT(Group Descriptor Table): 管理分区内的一个组,有多少inode,起始的inode编号,有多少个inode被使用,有多少block被使用,还剩多少,总的group大小是多少…
  • SB(super block) : 就是我们文件系统的项层数据结构了!
    • 表示整个分区,一共有多少个块,一共有多少个Block group。
    • 每一个块组inode使用情况是什么,每一个块组Date Block使用情况是什么。
    • 整个分区是多大,整个分区在磁盘中是从几号到几号,整个分区是什么样的文件系统。
    • 文件系统种类是什么,全部属性都写在了Super Block,所以是一个顶层的数据结构。
  • 一个inode(文件,属性)如何和属子自己的内容关联起来呢?
    • data block,4KB,也叫以保存其他块的编号!
    • 直接在自己的块内找到其他的块,找到文件的inode就能找到文件的所有内容了。
  • 文件名,算文件的属性吗?算!
    • 但是,inode里面,并不保存文件名!!
    • Linux下,底层实际都是通过inode编号标识文件的,没有文件名的概念。

Linux下一切皆文件,那么目录是文件吗?

  • 答案是肯定的,目录也是文件!!
  • 文件 = 内容(blocks) + 属性(inode)
  • 文件名和inode的映射关系是存储在目录的数据块(block)中的。

为什么要读取目录下文件名时,查看文件名时必须要有读权限:

  • 读取文件名就是在读取目录的内容。
  • 读取目录的内容就必须要有读权限。
  • 这和读一个普通文件没区别。

当想在目录下创建一个文件时,创建文件时必须要有写权限:

  • 最后要将文件名和inode映射关系写到目录的data block当中。
  • 如果没有写权限,怎么写入呢?

Linux同一个目录下,可以创建多个同名文件吗??不会!

  • 文件名本身就是一个具有Key值的东西!
  • 通过文件名找inode一定是一对一的关系,不存在多个文件名重复的问题。
  • 目录里保存的是文件名和inode的映射关系。

补充:

  • 目录实际上是一种特殊的文件,它包含了一个或多个数据块,用于存储文件名和对应的inode号码的映射。
  • 每个目录数据块中都保存着一系列的目录项(directory entry),每个目录项由文件名和对应的inode号码组成。系统通过遍历这些目录项,就能够根据文件名找到相应的inode,进而操作文件。
  • 当文件系统需要创建、删除、重命名或移动文件时,它会更新目录数据块中的目录项,以反映文件名与inode之间的变化。
  • 因此,目录的数据块承载了文件名和inode之间的映射关系,它起到了连接文件名和inode的桥梁作用。通过查找目录数据块,系统可以快速定位并操作特定的文件。

通过ls -l -i来查看文件的inode:
在这里插入图片描述
当我们创建一个文件,操作系统做了什么?

  • 找到自己的目录,找到目录的inode,然后找到目录的Date Block。
  • 这里有文件名和inode的映射关系,文件名在该目录下的唯一性,根据文件名做查找,找到了inode编号。
  • 根据inode编号找到block group,然后只要把该文件对应的inode Bitmap由1置0。
  • 将这个文件对应的Block Bitmap数据块由1置0,此时就完成了文件删除。

请问删除一个文件,OS做了什么??

  • Linux并没有真正的清除数据:
  • 删除的时候,只是将标记该文件对应的属性和数据块的相关位图结构由1置0,就完成了删除。
  • 最后在文件所处的目录当中,把该文件对应的inode映射关系去掉,此时这个文件就被删除了。

ls的工作过程:

  • ls找到目录对应的inode编号,根据inode编号找到inode。
  • inode里面有属性,属性里面有数据块和inode的映射关系。
  • 找到数据块,只把数据块中文件名列出来就完了。

ls -l工作过程:

  • ls -l是找到目录对应的数据块,找到了对应的内容。
  • 内容里面文件名和inode映射关系就有了,拿着每个文件的inode,去查找每个文件它自己的inode,将属性全部读取。
  • 此时再拼接文件名,就构成了ls -l的信息。

2. 软硬连接

在我们Linux刚开始学习的时候,我们有一个连接数是没有讲的:
在这里插入图片描述
文件硬连接数:

文件硬连接个数指的是特定文件的硬链接数量。在Linux系统中,多个文件名可以指向相同的数据块,这些文件名被称为文件的硬链接。 硬链接是文件系统中的链接,它们具有相同的inode号,并且它们引用相同的文件内容。
每当创建一个硬链接时,文件的硬链接计数增加1。相反,当删除一个硬链接时,硬链接计数减少1。只有在硬链接计数为0时,文件才被真正删除,释放相关的存储空间。
因此,文件的硬链接个数表示有多少个文件名指向同一份数据。当硬链接计数为1时,说明该文件没有其他硬链接,即它是唯一指向该数据的文件。

在这里插入图片描述

2.1 目录和文件的硬连接数:

当我们创建目录或文件时,我们看到的是:目录默认的硬链接数是2,而文件默认的硬链接数是1。

  • 这是什么原因?
  • 在Linux系统中,目录是一种特殊类型的文件,它包含了文件名和对应文件索引节点的映射关系。
  • 目录的硬链接数指的是指向该目录的硬链接数量,也就是有多少个目录项指向该目录。
    • 一个目录至少有两个硬链接,一个是它自己的记录(“.”),另一个是指向该目录的父目录的记录(“. .”)。
    • 这样设计的目的是为了在文件系统中建立层次结构,并保证文件系统的完整性。
  • 文件的硬链接数指的是指向该文件的硬链接数量,也就是有多少个文件名指向该文件。
    • 默认情况下,文件在创建时只会有一个硬链接,即它的原始文件名。
    • 这是因为文件通常被认为是唯一的,没有必要有其他文件名指向同一个文件。
    • 如果需要创建文件的硬链接,可以使用特定的命令进行创建。

在这里插入图片描述

总之,目录的默认硬链接数是2,是为了维护文件系统的结构和完整性;而文件的默认硬链接数是1,因为文件通常被认为是唯一的。

2.2 软连接:

ln -s 源 目标 #创建软连接

软连接就相当于Linux下的快捷方式(ln: link的简称):

在这里插入图片描述
Linux中软连接(快捷方式)的用法:

在这里插入图片描述

现在是连接可执行程序,未来可能是连接头文件,连接库文件(动静态库)不用我们很冗余的去找这些库。

2.3 硬连接:

ln 源 目标 #创建硬链接

建立一个硬连接:

在这里插入图片描述
inode对比:

在这里插入图片描述
我们发现软连接的inode和原来的inode不同,而硬连接的inode则是与原来相同。

硬连接数:一旦建立好映射关系,就从1变成了2。

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

  • 在当前目录下重新建立了文件名和inode之间的映射关系
  • 这两个文件名经过该目录映射的是同一个inode。

软连接的连接数没有变化的原因是:这是个独立文件,因为它有独立inode。

在这里插入图片描述
引用计数没有变化,就证明了,软连接不是单纯的拿文件名和文件inode建立映射关系,要不然和硬
连接没区别了。

2.4 软硬连接的区别:

软连接:

  • 软连接是一个独立文件,有自己独立的inode和inode编号。
  • Linux下的快捷方式!
  • 既然是一个独立文件,inode是独立的,软连接的文件内容是什么呢??
    • 保存的是指向的文件的所在路径!!
    • 在系统级别保存的,我们开是看不到的。

硬连接:

  • 硬链接不是一个独立文件,他和目标文件使用的是同一个inode!
    • 硬链接不是一个独立的文件,它是与原始文件共享相同的inode和数据块。
    • 硬链接与原始文件在文件系统中指向同一个数据块,它们是同一个文件的多个文件名。
    • 当你创建一个硬链接时,实际上是将一个新的文件名关联到原始文件的inode上。
    • 因此,硬链接并不会占用额外的磁盘空间,也不会存在独立的文件实体。
    • 对于文件系统来说,无论是原始文件还是硬链接,都只有一个实际的数据块。
  • 由于硬链接与原始文件共享相同的inode,它们具有相同的权限、时间戳等元数据信息。
    • 如果修改了原始文件的内容或属性,所有与之相关联的硬链接文件都会反映这些更改。
  • 注意细节:
  • 需要注意的是,硬链接只能在同一个文件系统中创建,并且不能关联到目录。
  • 删除一个硬链接只会减少硬链接计数,当硬链接计数降为零时,文件才会被真正删除,释放相应的磁盘空间。
  • 什么是硬链接数?
  • inode编号,不就是一个 “指针” 的概念吗?
  • 本质就是改文件inode属性中的一个计数器,count,标识有几个文件名和我的inode建立了映射关系。
  • 简言之,就是有几个文件名指向我的inode(文件本身)。
  • 硬连接的作用:
  • 路径间切换。

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

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

相关文章

Clickhouse基础和基本优化

CK基础和基本优化 一、ClickHouse的特点列式存储高吞吐写入能力数据分区与线程级并行表引擎的使用MergeTreeReplacingMergeTreeSummingMergeTree 二、SQL操作1.Insert2.Update 和 Delete3.查询操作4.alter操作5.导出数据 三、基于表的分布式集群集群写入流程( 3分片…

react和vue2/3父子组件的双向绑定(sync、emit、v-model)

目录 Vue .sync(2.3.0) $emit (2.3后) 自定义组件的 v-model 2.2.0 v-modelemits(3.0取消了.sync) React 父组件回调函数 相关基础 框架 MVC (Model View Controller)/MVP(Model View…

VirtualBox 7.0.10 (macOS, Linux, Windows) - 开源跨平台虚拟化软件

VirtualBox 7.0.10 (macOS, Linux, Windows) - 开源跨平台虚拟化软件 Oracle VM VirtualBox 7 请访问原文链接:https://sysin.org/blog/virtualbox-7/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 2022 年 10 月…

CentOS7中安装Mysql8并配置远程连接和修改密码等

场景 使用Vmware等虚拟机软件搭建CentOS7系统,需要在其上安装Mysql8版本数据库。 注: 博客:霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主 实现 1、去mysql官网手动下载rpm包并上传到服务器,或者直接通过wget…

Python结合Selenium简单实现Web自动化测试

这篇文章是入门级别的应用Python Selenium进行自动化测试,包括环境搭建及简单的实例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 这篇文章是入门级别的应用Python Selenium进行自动化测试,包括环境搭建及简单的实例。基…

数据库及数据表的相关操作(一)

目录 一、管理逻辑库与数据表二、常用数据类型和约束2.1 数字数据类型2.2 字符串数据类型2.3 日期数据类型2.4 字段约束 三、索引运行机制和使用原则3.1 创建索引3.2 添加与删除索引3.3 索引的使用原则 一、管理逻辑库与数据表 sql语言的分类: ​ DML数据操作语言…

linux之Ubuntu系列(四)用户管理 用户和权限 chmod 超级用户root, R、W、X、T、S 软链接和硬链接 shell

r(Read,读取):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目 录的权限。 w(Write,写入):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移…

linux之Ubuntu系列(-)常见指令 重定向

Ubuntu 中文 版本 注意点 通过修改语言改成英文 在终端录入:export LANGen_US 在终端录入:xdg-user-dirs-gtk-update 单用户和多用户 命令格式 command [-选项] [参数] –查看命令的帮助 命令 --help man 命令 |操作键| 功能| |空格键|-显示手册的下…

Kafka 入门到起飞系列 - 生产者发送消息流程解析

生产者通过producerRecord 对象封装消息主题、消息的value(内容)、timestamp(时间戳)等 生产者通过send()方法发送消息,send()方法会经过如下几步 1. 首先将消息交给拦截器(Interceptor)处理, 拦截器对生产者而言&…

Java编程-IDEA中Java的main方法psvm、sout快捷键设置

目的 我打出psvm这四个字母时,可快速打出main方法 我打出syso,sout时,可快速打出System.out.println(); 步骤: 1、打开IDEA,点击文件,选择Editor中的 Live Templates选项,点击右侧边栏中的 号 2、选中…

教你用Python+selenium搭建自动化测试环境

今天给大家带来的是关于Python的相关知识,文章围绕着如何用Pythonselenium搭建自动化测试环境展开,文中有非常详细的介绍,需要的朋友可以参考下 一、环境搭建 1、安装pythonpycharm软件 。python安装网址官网:About Python™ | Python.org 根据自己的电脑系统选择…

设计模式 ~ 发布订阅模式

概念 用于实现对象之间的松耦合通信; 在该模式中,存在一个或多个发布者(Publishers)和一个或多个订阅者(Subscribers); 发布者负责发布消息,而订阅者负责订阅感兴趣的消息并在接收到…

Java中高级面试题,开发模拟练习

1.Redis为什么这么快? Redis是单线程的,避免了多线程的上下文切换和并发控制开销;Redis大部分操作时基于内存,读写数据不需要磁盘I/O,所以速度非常快;Redis采用了I/O多路复用机制,提高了网络I/O并发性;Redis提供高效的数据结构&…

数据科学团队的角色分工

描述数据科学团队中角色分工常用下列维度。进一步以数据可视化直观表达的能力雷达图: ML Ops - 机器学习运维 Data Pipelines - 数据流水线 Database - 数据库 Data Viz - 数据可视化 Storytelling - 数据讲故事 Business Insights - 业务洞察 Reporting - 报告 Experimentatio…

Apache和Nginx是什么?|Nginx和Reactor是什么?|网路IO的本质|阻塞队列|异步非阻塞IO

前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量干货博客汇总https://blog.csdn.net/yu_cblog/c…

pandas 笔记:melt函数

和pivot_index 相反,前者是长表转宽表,melt是宽表转长表 pandas 笔记:pivot_table 数据透视表_UQI-LIUWJ的博客-CSDN博客 1 基本使用方法 pandas.melt(frame, id_varsNone, value_varsNone, var_nameNone, value_namevalue, col_levelNone…

【Linux】Zookeeper集群 + Fafka集群

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 Zookeeper集群 Fafka集群 Zookeeper 概述Zookeeper 定义Zookeeper 工作机制Zookeeper 特点Zookeeper 数据结构Zookeeper 应用场景Zookeeper 选举机制 Kafka 概述为什么需要消…

⚡【C语言趣味教程】(3) 浮点类型:单精度浮点数 | 双精度浮点型 | IEEE754 标准 | 介绍雷神之锤 III 源码中的平方根倒数速算法 | 浮点数类型的表达方式

🔗 《C语言趣味教程》👈 猛戳订阅!!! ​—— 热门专栏《维生素C语言》的重制版 —— 💭 写在前面:这是一套 C 语言趣味教学专栏,目前正在火热连载中,欢迎猛戳订阅&#…

laravel 的SQL使用正则匹配

案例场景 精准正则匹配 查询结果 代码如下 $regexp ^ . $new_str . [^0-9];$info Test::query()->where(is_del, 0)->whereRaw("name REGEXP $regexp")->pluck(name, id)->toArray();字符 “^” 匹配以特定字符或者字符串开头的文本 name 字段值包含…

国产单片机(沁恒微WCH)CH32V307评估板初探

国产单片机(沁恒微WCH)CH32V307评估板初探 关于沁恒微:国产芯厂家、官网链接 公司简介 - 南京沁恒微电子股份有限公司 (wch.cn) 开发板资源: 评估板应用于 CH32V307 芯片的开发,IDE 使用 MounRiver 编译器,可选择使用板载或独…