存储基石:深度解读Linux磁盘管理机制与文件系统实战
Linux系列
文章目录
- Linux系列
- 前言
- 一、磁盘
- 1.1 初识磁盘
- 1.2 磁盘的物理结构
- 1.3 磁盘的存储结构
- 1.4 磁盘的逻辑结构
- 二、文件系统
- 2.1 系统对磁盘的管理
- 2.2 文件在磁盘中的操作
前言
Linux 文件系统是操作系统中用于管理和组织存储设备(如硬盘、SSD、USB 等)上数据的一种核心机制。本篇我们将操作系统如何对未打开的文件进行管理的。
一、磁盘
磁盘是是计算机硬件中的唯一的机械设备,被广泛的运用于企业级存储,学习磁盘对数据的存储,对我们学习操作系统的文件系统有很大帮助。
1.1 初识磁盘
随着计算机行业的发展,磁盘由于存储效率较低,慢慢的在我们的私人电脑中被固态硬盘所替代,但是在企业中,磁盘依旧是存储的主流。这是因为:
1、相较于固态硬盘来说,磁盘的成本较低。
2、磁盘虽然效率低,但是容量较大,在企业中往往存在海量的不常访问数据需要保存,所以磁盘就成了比较适合的选择,
3、固态硬盘在存储和删除数据是对自身会有一定损耗,长时间的使用会有数据丢失的风险。
1.2 磁盘的物理结构
一个磁盘会包含好几个盘片,每个盘片具有两个盘面,这两个盘面都会进行数据存储,每个盘面都会配有对应的磁头,在工作时,磁盘会在主轴的带动下开始旋转,磁头则会在磁臂的带动下开始水平摆动,这个过程磁头并不会和磁盘接触。
1.3 磁盘的存储结构
下面我们来对一个磁面进行分析:
在一个磁面中,以主轴为圆心,向外会分成多个同心园,我们称这些同心圆为磁道,这些磁道又会被等分为多分弧段,这些弧段就叫做扇区,在磁盘进行数据的读写时就是以扇区为最小单位,每个扇区一般为512字节,从主轴向外扇区的长度是不同的,为了保证存储空间一致,设计规定离主轴越远数据的存储密度越小。
拓展: 磁盘在工作时,主轴带动磁盘旋转,磁头通过摆动来确定数据在哪个磁面、磁道,当确定磁道后,磁头停止摆动,此时磁盘继续旋转完成数据读写工作。
为了对方便管理,我们磁面、磁道、扇区进行编号,当我们要对磁盘数据进行访问时,就可以通过编号快速完成,具体怎么进行的我们下面介绍。
1.4 磁盘的逻辑结构
由于磁盘的大小相同,且磁臂是被固定的,这时再将磁盘划分磁道,我们就会得到一个由磁道组成的柱面结构,当我们对磁盘进行访问时,我们就可以先确定在哪一个柱面(cylinder),也就是磁盘,然后再确定再哪一个盘片(platter),由于每个盘片都配有一个磁头,所以我们是通过 磁头(head) 来确定的,再确定磁道(track),最后确定扇区(sector) 我们称这种定位方法为 CHS定位法。为了将它于操作系统建立联系,我们需要将它进一步抽象。
不知到大家有没有接触过磁带,来看下图:
左侧图片是磁带卷起的样子,会呈现出一个圆类似于盘面,当我们将它展开就会呈现出右侧有宽度的带子,我们可以依据这个特性将盘面中的磁道抽象为一个,条带子:
这里我们就可以将所有盘面全部抽象为一个线性结构(当成数组也可以,为了方便这里仅画出了一个盘),这时我们对磁盘的访问,就变为了对线性结构的访问,当操作系统要定位一个扇区时,我们只需要知道这个扇区的地址就可以完成对扇区的访问了,如要查找扇区编号为:355
由于是从0开始编号,所以计算时只需要向下取整即可。
这样我们就成功定位到了扇区,而我们将这种编号称为LBA
地址,定位过程就是LAB
地址转化为CHS
地址的过程。
二、文件系统
2.1 系统对磁盘的管理
我们可以确切的感受到,在我们的计算机中,磁盘是非常大的,如果操作系统直接对他进程管理,效率是非常低的,那么该如何让操作系统对它进行管理呢?对于这个问题,我们的工程师采用了分治思想,将整个磁盘划分为小块空间,通过对所以小块空间的管理,达到对整个磁盘的管理。
这样操作系统只需要完成对每个组的管理,就可以达到对整个磁盘的管理。
每个组又会被划分为以下几个区:
具体如何管理我们结合文件在磁盘中的存储,进行分析:
我们知道文件=内容+属性,而在Linux中文件的内容和属性是分开进行存储的,那么两者分开存储是如和建立联系的呢?或者说是如何管理的呢?
存储属性信息: 在Linux中每个文件都会对应一个inode
结构体,这个结构体(对象)的大小是固定的,通常为128
字节,文件的所有信息都存储在这个结构体对象中,其中并包含文件名,这是因为,Linux并不通过文件名进行查找文件,每个inode
都会有一个编号,操作系统通过编号进行查找。上图的inode Table
就是inode
表(inode集合,下面会再次解释)。
存储文件内容: 在Linux文件内容是存储在上图Data blocks
区域中的,而这个区域被划分为块(这些块也是会被分配编号的),操作系统在访问磁盘时是以块为单位进行访问的,块中包含多个扇区,通常块的大小为4KB
,此处可以理解为对读取性能的优化,因为当计算机要访问一段数据是,这段数据周围的数据也有很大可能被访问,所以直接读取4KB
,这是一种以空间换时间的方法。(这个块大小是可以修改的,感兴趣的可以去了解)
属性与内容建立联系: 在inode
对象中会存在,一个数组,数组中存储的是该文件内容存储块的编号。
这样我们就大概的知道了,存储逻辑了,下面我们解释一下,组中各个模块的含义。
Boot Block
:引导块,引导操作系统启动,我们不做研究。
Super Block
:超级块,存储文件系统的整个信息(整个分区信息),包含bolck
和inode
的总量,未使用的量,一个bolck
和inode
的大小,文件系统状态(是否干净卸载)等。
Group Descriptor Table
:块组描述符,描述块组的属性信息。
Block Bitmap
:块位图,记录Date bolck
中的块是否被使用,通过块编号映射,相信学过位图的都可以理解。
inode Bitmap
:inode
位图,标识inode
是否被使用。
复习的时候再看看超级块-----这句话给作者看的
2.2 文件在磁盘中的操作
我通过对文件的增、删、查、改,带领大家熟悉上面知识。
查看文件的inode
编号:
ls -li
还可以使用stat 文件名
查看更多信息,大家自己去了解一下。
创建文件:
创建文件时,将文件存储在哪个分区,路径会帮助我们,这里我们就不关心了,首先操作系统根据,超级块中的信息,剩余inode
和bolck
较多的组,遍历该组的inode Bitmap
,得到未被使用的inode
编号,找到该inode
将文件属性存储,并将对应位置位图置1
,再遍历Block Bitmap
得到未被使用的块编号,找到对应块,将文件内容存储,并将对应位置位图置1,再将对应的块编号,存入该文件inode
的数组中。
读取文件:
读取文件首先查找文件,拿到该文件的inode
编号,根据编号找到对应的分组(LBA->CHS),找到inode
中存储块编号的数组,那到块编号,读取块数据。
修改文件:
首先拿到该文件的inode
编号,根据编号找到对应的分组(LBA->CHS),找到inode
中存储块编号的数组,那到块编号,修改数据。
删除文件:
首先拿到该文件的inode
编号,根据编号找到对应的分组(LBA->CHS),找到inode
中存储块编号的数组,那到块编号,使用块编号,将块位图对应位置置0
(表示未被使用),通过inode
编号将inode
位图置0
。
通过上面的方法我们就可实现文件的增、删、查、改了,但是我们还面临一个问题,操作系统该如何来获取文件的inode
编号呢?
我们首先来看这样一个问题:
上面我们说,操作系统在磁盘访问文件不通过文件名,是通过inode
进行的,但现在为什么操作系统不认识它呢?
要回答这个问题我们就得思考一下,目录文件在磁盘中存储的内容是什么了,在磁盘中目录文件存储的其实是,该目录下的文件名与文件inode
编号的映射关系,当在用户访问文件时,操作系统就会根据当前目录的inode
编号,找到当前目录的内容,从而通过映射关系找到对应文件的inode
编号,这样就可以得到用户要访问文件的inode
,但是当前目录文件的inode
又从哪来呢,当然是通过它的上级目录了,就像这样一直索引,知道找到操作系统启动时固定的,目录inode
编号,然后逐级返回。这个过程为路径解析,但是由于太过复杂影响效率,所以操作系统会将常用路径解析后缓存在dentry缓存
。
这样我们就将这个问题完美解决了。
相关文章:
存储基石:深度解读Linux磁盘管理机制与文件系统实战
Linux系列 文章目录 Linux系列前言一、磁盘1.1 初识磁盘1.2 磁盘的物理结构1.3 磁盘的存储结构1.4 磁盘的逻辑结构 二、文件系统2.1 系统对磁盘的管理2.2 文件在磁盘中的操作 前言 Linux 文件系统是操作系统中用于管理和组织存储设备(如硬盘、SSD、USB 等ÿ…...
AI Agent设计模式六:ReAct
概念 :思考-执行循环系统 ✅ 优点:提升任务完成度,适合复杂问题拆解❌ 缺点:执行延迟较高,资源消耗大 from langchain_core.messages import SystemMessage, HumanMessage, ToolMessage, AIMessage from langgraph.pr…...
使用MySQL时出现 Ignoring query to other database 错误
Ignoring query to other database 错误 当在远程连接软件中输入MySQL命令出现该错误 导致错误原因是:登录mysql时账户名没有加上u 如果出现该错误,退出mysql,重新输入正确格式进入即可!...
(三)链式工作流构建——打造智能对话的强大引擎
上一篇:(二)输入输出处理——打造智能对话的灵魂 在前两个阶段,我们已经搭建了一个基础的智能对话,并深入探讨了输入输出处理的细节。今天,我们将进入智能对话的高级阶段——链式工作流构建。这一阶段的目…...
跳跃连接(Skip Connection)与残差连接(Residual Connection)
1. 跳跃连接(Skip Connection)的基本概念 跳跃连接是一种在深度神经网络中广泛应用的技术,它允许信息在网络中跨层直接传递。在传统的神经网络里,每一层的输出仅仅是前一层输出经过特定变换后的结果。而在具备跳跃连接的网络中&a…...
[特殊字符] 通过Postman和OAuth 2.0连接Dynamics 365 Online的详细步骤 [特殊字符]
🌟 引言 在企业应用开发中,Dynamics 365 Online作为微软的核心CRM平台,提供了强大的Web API接口。本文将教你如何通过Postman和OAuth 2.0认证实现与Dynamics 365的安全连接,轻松调用数据接口。 📝 准备工作 工具安装…...
什么是RPC通信
RPC(Remote Procedure Call,远程过程调用)通信是一种允许程序像调用本地函数一样调用远程服务器上函数的通信技术。它简化了分布式系统中的网络交互,隐藏了底层网络通信的复杂性,使开发者能够专注于业务逻辑。 一、RPC…...
HANA如何在存储过程里执行动态SQL
业务场景需求: 在HANA里如何实现动态的SQL控制,比如需要多个单据里,实现某个自定义字段不允许重复 一般的写法是需要在每个业务单据里加对应的存储过程控制,这样的话,需要在每个业务单据里进行控制,SQL维…...
NO.66十六届蓝桥杯备战|基础算法-贪心-区间问题|凌乱的yyy|Rader Installation|Sunscreen|牛栏预定(C++)
区间问题是另⼀种⽐较经典的贪⼼问题。题⽬⾯对的对象是⼀个⼀个的区间,让我们在每个区间上做出取舍。 这种题⽬的解决⽅式⼀般就是按照区间的左端点或者是右端点排序,然后在排序之后的区间上,根据题⽬要求,制定出相应的贪⼼策略&…...
0101安装matplotlib_numpy_pandas-报错-python
文章目录 1 前言2 报错报错1:ModuleNotFoundError: No module named distutils报错2:ERROR:root:code for hash blake2b was not found.报错3:**ModuleNotFoundError: No module named _tkinter**报错4:UserWarning: Glyph 39044 …...
SQL ServerAlways On 可用性组配置失败
问题现象: 配置 Always On 可用性组时,报错 “无法将数据库加入可用性组”(错误 41158),或提示 “WSFC 群集资源无法联机”(错误 19471)。 快速诊断 验证 WSFC 群集状态: # 检查群集…...
01 - UnLua访问蓝图
前文回顾:配置好了智能提示和调试 分别对私有的和公开函数,变量,组件,事件进行测试。 测试 在BeginPlay中,分别访问他们。这里引入了GetDisplayName函数打印相机组件名 打印结果: 结论 不管是私有的&…...
6.5.图的基本操作
一.图的基本操作: 1.判断图G是否存在弧<x,y>或边(x,y): a.使用邻接矩阵来实现判断无向图G中是否存在边(x,y): 以上述图片的无向图为例,用邻接矩阵存储无向图时想要判断两个顶点之间是否有边是很方便的, 比如判…...
2025全新开源双端系统源码:获取通讯录、相册、短信、定位及已装应用信息
分享一套全新上线的双端信息采集系统源码,支持提取通讯录、相册、短信、定位信息及已安装应用数据。源码完全开源,只做轻微测试需要的自取,简易教程放在压缩包里面了,欢迎有需要的朋友自取参考。 下载地址:下载地址.t…...
es基本概念
Elasticsearch 的架构与基本概念 Elasticsearch(简称 ES)是一个开源的分布式搜索和分析引擎,基于 Apache Lucene 构建。它被广泛用于全文搜索、日志分析、实时数据分析等场景。以下是其架构概述及其基本概念的详细解释。 Elasticsearch 的架…...
算法刷题记录——LeetCode篇(2.5) [第141~150题](持续更新)
更新时间:2025-04-04 算法题解目录汇总:算法刷题记录——题解目录汇总技术博客总目录:计算机技术系列博客——目录页 141. 环形链表 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通…...
【Rust学习】Rust数据类型,函数,条件语句,循环
本文专栏:Rust学习 目录 一,数据类型 1,标量类型 1.1,整型 1.2,整型溢出 1.3,浮点数型 1.4,布尔类型 1.5,字符型 2,复合类型 2.1,Tuple(元组) 2.2&am…...
PgVectore的使用
PgVectore的使用 一、PgVector的安装 参照博客:https://blog.csdn.net/u012953777/article/details/147013691?spm1001.2014.3001.5501 二、PgVector的使用 1、创建表与插入数据 定义向量字段: CREATE TABLE items (id SERIAL PRIMARY …...
智能工厂的数字孪生与信息物理系统架构研究
摘要 本文以工业 4.0 为背景,系统分析数字孪生(Digital Twin)与信息物理系统(CPS)在智能工厂中的协同架构。通过构建 "感知 - 映射 - 决策 - 执行" 的四层技术框架,结合三一重工、海尔等企业案例…...
基于YOLO11实例分割与奥比中光相机的快递包裹抓取点检测
本博客来源于CSDN机器鱼,未同意任何人转载。 更多内容,欢迎点击本专栏,查看更多内容。 0 引言 项目采用六轴机械臂搭配末端真空吸盘,从无序包裹中抓取想要的包裹。AI算法需要提供各包裹的抓取点的3D坐标与3D姿态。由于快递包裹含…...
简单程序语言理论与编译技术·22 实现一个从AST到RISCV的编译器
本文是记录专业课“程序语言理论与编译技术”的部分笔记。 LECTURE 22(实现一个从AST到RISCV的编译器) 一、问题分析 1、完整的编译器(如LLVM)需先完成AST到IR的转换,并进行代码优化,再到汇编࿰…...
无锡无人机驾驶证培训费用
无锡无人机驾驶证培训费用,随着科技的迅速发展,无人机在众多行业中发挥着举足轻重的作用。从影视制作到农业监测,再到物流运输与城市规划,无人机的应用场景不断扩展,因此越来越多的人开始意识到学习无人机驾驶技能的重…...
[ctfshow web入门] web5
前置知识 引用博客:phps的利用 当服务器配置了 .phps 文件类型时,访问 .phps 文件会以语法高亮的形式直接显示 PHP 源代码,而不是执行它。.phps被作为辅助开发者的一种功能,开发者可以通过网站上访问xxx.phps直接获取高亮源代码 …...
第五章:架构安全性_《凤凰架构:构建可靠的大型分布式系统》
第五章 架构安全性 一、认证机制 核心知识点: 认证标准: HTTP Basic认证:Base64编码传输凭证,需配合HTTPS使用OAuth 2.0:授权框架,重点掌握四种授权模式: 授权码模式(最安全&#…...
控件主题效果添加程序设计
以下是针对Qt Designer设计的控件添加阴影效果的完整解决方案,结合可视化设置与动态主题支持: 一、基础阴影效果实现方案 1. 通过QSS实现简易阴影(适用于简单需求) /* 使用多重边框模拟阴影效果 */ QFrame#customWidget {borde…...
用swift playground写个ios应用和大模型或者网站交互
import SwiftUIstruct ContentView: View {State private var textFieldText: String ""State private var outputText: String "输出将会显示在这里"private let tip:String "消息已发送,请等待"State private var history:[Stri…...
Mlivus Cloud SDK v2的革新:从痛点剖析到实战优化
目录 从V1到V2:开发者体验的范式转变 深度解析SDK v2的架构革新 1. 统一接口范式:终结API混乱时代 2. 原生异步支持:高并发场景的性能救星 3. Schema Cache机制:性能优化的隐形冠军 4. 全功能REST API:简化集成的关键 实战指南:从迁移到深度优化 平滑迁移策略 性…...
【图像处理基石】什么是AWB?
1. AWB(自动白平衡)的定义 AWB(Auto White Balance)是一种图像处理技术,通过算法校正不同色温光源下图像的色彩偏差,使白色在任何光照条件下都能准确呈现为白色,从而让图像颜色更接近人眼真实感…...
[蓝桥杯 2017 省 B] k 倍区间
P8649 [蓝桥杯 2017 省 B] k 倍区间 题目描述 给定一个长度为 N N N 的数列, A 1 , A 2 , ⋯ A N A_1,A_2, \cdots A_N A1,A2,⋯AN,如果其中一段连续的子序列 A i , A i 1 , ⋯ A j ( i ≤ j ) A_i,A_{i1}, \cdots A_j(i \le j) Ai,Ai1,⋯…...
基于SSM的高校宿舍水电管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
【LLM系列】1.大模型简介
1. 基础 1.1 如何权衡模型的复杂度和性能? ├── a. 模型架构选择 │ ├── 简化架构 │ │ └── 选择较小的网络层数和宽度,降低复杂度; │ │ 可使用高性能基础模型如 Transformers 作为起点,根据需求缩放模型。 │ └──…...
从概念和设计哲学的角度详细解析工厂模式
从概念和设计哲学的角度详细解析工厂模式。 1. 工厂模式的核心目标 解耦:将对象的创建过程与使用过程分离,使用者无需关心对象如何被创建。 统一入口:通过一个接口或方法控制对象的生成,隐藏底层实现细节。 类比现实中的工厂&am…...
AI小白:机器学习VS深度学习
1 特征工程的范式革命 传统机器学习:手工特征工程的艺术 在传统机器学习中,特征工程是一个关键步骤,它涉及将原始数据转化为能够被机器学习模型高效利用的特征。这通常需要领域专家的经验和知识,以手动设计和提取特征。 例如&a…...
对应列表数据的分割和分组
要基于指定的流派列表分割数据,可以使用 布尔索引 或 groupby 结合筛选。以下是具体方法: 场景假设 数据列 genres 中的值可能是多流派的字符串,例如 "drama,action" 或 ["drama", "action"]。目标࿱…...
信息物理系统(CPS):中国 AI(DEEPSEEK)的未来路径
一、引言 人工智能(AI)的发展正从通用模型向垂直领域渗透,而信息物理系统(CPS)作为连接数字世界与物理世界的桥梁,为 AI 提供了新的发展方向。中国 AI 企业如 DEEPSEEK 通过开源策略和本土化优势ÿ…...
SEO长尾词优化实战技巧
内容概要 长尾关键词作为SEO策略的重要组成部分,能够有效捕捉细分领域的精准流量,降低竞争成本的同时提升转化效率。本文系统梳理了从关键词挖掘到流量转化的全链路优化方法,重点解析工具使用、布局策略及搜索意图匹配三大核心模块。通过结合…...
爬虫自动化工具:DrissionPage
1. DrissionPage初始 官网地址:🛰️ 概述 | DrissionPage官网 在当今互联网高速发展的时代,网页数据的获取和处理变得愈发重要。传统的自动化工具如 Selenium 在某些方面逐渐显露出一些局限性,而 DrissionPage 正是在这样的背景下…...
扩展库Scrapy:Python网络爬虫的利器
目录 一、扩展机制的核心原理 二、六大实用扩展库详解 1. 动态渲染神器:scrapy-playwright 2. 分布式架构:scrapy-redis 3. 反反爬利器:scrapy-zyte-smartproxy 4. 智能调度:scrapy-thunder 5. 数据管道:scrapy…...
L3-21
exer01 Message # 1.定义Message消息类和cmd,content,sender,to四个属性,其中to默认为None class Message:def __init__(self, cmd, content, sender, toNone):self.cmd cmdself.content contentself.sender senderself.to to # 2. 创建登录消息对象msg1,聊天消…...
04.游戏开发-unity编辑器详细-工具栏、菜单栏、工作识图详解
04.游戏开发,unity编辑器详细-工具栏、菜单栏、工作识图详解 提示:帮帮志会陆续更新非常多的IT技术知识,希望分享的内容对您有用。本章分享的是Python基础语法。前后每一小节的内容是存在的有:学习and理解的关联性,希…...
GRBL运动控制算法(二)圆弧插补
前言 GRBL 是一款高性能、开源的嵌入式 CNC(计算机数控)控制器固件,专为 Arduino 平台优化,广泛应用于雕刻机、激光切割机、3D 打印机及其他精密运动控制场景。自 2009 年发布以来,GRBL 凭借其高效的运动规划算法、稳…...
《P1072 [NOIP 2009 提高组] Hankson 的趣味题》
题目描述 Hanks 博士是 BT(Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫 Hankson。现在,刚刚放学回家的 Hankson 正在思考一个有趣的问题。 今天在课堂上,老师讲解了如何求两个正整数 c1 和 c2 的最大公约数…...
矩阵分解中的梯度下降:详细实现方案(包含数学推导、代码实现和优化技巧)
矩阵分解中的梯度下降:详细实现方案(包含数学推导、代码实现和优化技巧) 矩阵分解是机器学习和数据科学中重要的技术,广泛应用于推荐系统、自然语言处理、图像处理等领域。梯度下降作为一种优化算法,在矩阵分解中常用于最小化目标函数以找到最佳的矩阵近似。本指南将详细…...
STM32F103C8T6实现 SG90 360 °电机转动
简介 基于上一篇 STM32F103C8T6实现 SG90 180 电机任意角度转动 本来想实现角度转动, 但靠舵机本身无法实现限位, 需要记录位置, 并且根据转速计算大概位置, 存在误差, 不实现角度转动了, 只实现正反转 代码 正向速度0.75为最大速度, 反向2.25, 接近1.5…...
RTDETR融合[CVPR2025]DnLUT中的MuLUTUnit模块
RT-DETR使用教程: RT-DETR使用教程 RT-DETR改进汇总贴:RT-DETR更新汇总贴 《DnLUT: Ultra-Efficient Color Image Denoising via Channel-Aware Lookup Tables》 一、 模块介绍 论文链接:https://arxiv.org/pdf/2503.15931 代码链接…...
大数据Spark(五十七):Spark运行架构与MapReduce区别
文章目录 Spark运行架构与MapReduce区别 一、Spark运行架构 二、Spark与MapReduce区别 Spark运行架构与MapReduce区别 一、Spark运行架构 Master:Spark集群中资源管理主节点,负责管理Worker节点。Worker:Spark集群中资源管理的从节点,负责任务的运行…...
二:python基础(黑马)
一:了解 1.1: python特点 python是完全面向对象的语言 函数,模块,数字,字符串都是对象,在python中一切皆对象 完全支持继承,重载,多重继承 支持重载运算符,也支持泛型设计 py…...
【马拉车 KMP 差分数组】P6216 回文匹配|省选-
本文涉及知识点 较难理解的字符串查找算法KMP C差分数组 马拉车算法 P6216 回文匹配 题目描述 对于一对字符串 ( s 1 , s 2 ) (s_1,s_2) (s1,s2),若 s 1 s_1 s1 的长度为奇数的子串 ( l , r ) (l,r) (l,r) 满足 ( l , r ) (l,r) (l,r) 是回文的&#…...
C/C++测试框架googletest使用示例
文章目录 文档编译安装示例参考文章 文档 https://github.com/google/googletest https://google.github.io/googletest/ 编译安装 googletest是cmake项目,可以用cmake指令编译 cmake -B build && cmake --build build将编译产物lib和include 两个文件夹…...
提高MCU的效率方法
要提高MCU(微控制器单元)的编程效率,需要从硬件特性、代码优化、算法选择、资源管理等多方面入手。以下是一些关键策略: 1. 硬件相关优化 时钟与频率: 根据需求选择合适的时钟源(内部/外部振荡器),避免过高的时钟频率导致功耗浪费。关闭未使用的外设时钟(如定时器、UA…...