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

【操作系统】第三章 内存管理(一)

第三章 内存管理3.1 内存管理概念3.1.1 内存管理的基本原理和要求内存管理的主要功能内存空间的分配与回收。[连续分配管理方式](#3.1.2 连续分配管理方式)和非连续分配管理方式分页、分段地址转换实现逻辑地址到物理地址的转换内存空间的扩充采用虚拟存储技术从逻辑上扩充内存内存共享。允许多个进程访问内存的同一部分存储保护。保证各个进程在各自的存储空间内运行互不干扰逻辑地址和物理地址操作系统通过内存管理部件MMU将进程使用的逻辑地址转换成物理地址程序的链接与装入编译。由编译程序将用户源代码编译成若干目标模块链接。由链接程序将编译后形成的一组目标模块以及它们所需的库函数链接在一起形成一个完整的装入模块装入。由装入程序将装入模块装入内存运行三种装入方法绝对装入。若知道程序将放到内存的哪个位置则编译程序将产生绝对地址的目标代码。只适用于单道程序环境可重定位装入。也称静态重定位。装入模块的起始地址通常是0程序中使用的指令和数据的地址都是相对于始值而言的逻辑地址。可根据内存当前情况将装入模块装入内存适当位置。在装入时对目标程序中的相对地址的修改过程称为重定位。地址转换通常时在进程装入时一次完成的当一个作业装入内存时必须给它分配要求的全部内存空间作业一旦进入内存整个运行期间不能在内存中移动动态运行时装入。也称动态重定位。装入程序将装入模块装入内存后不会立即将装入模块中的相对地址转换为绝对地址而是在程序运行时才进行。这种方式需要一个重定位寄存器存放装入模块的起始地址作业不能在内存中移动优点可将程序分配到不连续的存储区在程序运行前只需要装入部分代码即可投入运行三种链接方法静态链接在程序运行前先将各目标模块及它们所需的库函数链接成一个完整的装入模块以后不再拆开需要修改相对地址编译后的所有目标模块都是从0开始的相对地址当链接成一个装入模块时要修改相对地址需要变换外部符号将每个模块中所用的外部调用符号也都变换为相对地址装入时动态链接将目标模块在装入内存时采用边装入边链接的方式便于修改和更新便于实现对目标模块的共享运行时动态链接在程序执行中需要某目标模块时才对它进行连接能加快程序的装入过程节省内存空间进程的内存映像代码段程序的二进制代码是只读的数据段即程序运行时加工处理的对象包括全局变量和静态变量进程控制块存放在系统区堆用来存放动态分配的变量。通过调用malloc函数动态地向高地址分配空间栈用来实现函数调用。从用户空间的最大地址往低地址方向增长内存保护内存保护可采取两种方法在CPU中设置一对上、下限寄存器存放用户进程在主存中的下限和上限地址每当CPU要访问一个地址时分别和两个寄存器的值相比判断有无越界采用重定位寄存器基址寄存器和界地址寄存器限长寄存器进行越界检查。重定位寄存器中存放的是进程的起始物理地址界地址寄存器中存放的是进程的最大逻辑地址内存管理部件将逻辑地址和界地址寄存器进行比较若未发生越界则加上重定位寄存器的值后映射成物理地址再送交内存单元3.1.2 连续分配管理方式1.单一连续分配内存被分为系统区和用户区系统区仅供操作系统使用通常在低地址部分用户区内存中仅有一道用户程序即用户程序独占整个用户区优点简单无外部碎片不需要进行内存保护因为内存中只有一道程序缺点只能用于单用户、单任务的操作系统有内部碎片内存利用率低2.固定分区分配将用户内存空间划分为若干固定大小的分区每个分区只装入一道作业分区大小相等。缺乏灵活性分区大小不等为了便于分配和回收建立一张分区使用表通常按分区大小排队各表项包括对应分区的始址、大小及状态这种方式存在两个问题程序太大而放不进任何一个分区当程序小于固定分区大小时也要占用一个完整的内存分区造成空间浪费存在内部碎片无外部碎片但不能实现多进程共享一个主存区内存利用率低3.动态分区分配也称可变分区分配指进程装入内存时根据进程的实际需要动态的为之分配内存并使分区的大小正好适合进程的需要系统中分区的大小和数量是可变的缺点随着时间的推移内存中会出现越来越多的小内存块外部碎片内存利用率随之下降外部碎片可通过紧凑技术克服即操作系统不时地对进程进行移动和整理需要动态重定位寄存器的支持内存回收方法设置一张空闲分区链表按始址排序回收内存时根据回收分区的始址从空闲分区链中找到相应的插入点此时可能出现四种情况回收区与插入点的前一空闲分区相邻此时将这两个分区合并并修改前一分区表项的大小为两者之和回收区与插入点的后一空闲分区相邻此时将这两个分区合并并修改后一分区表项的始址和大小回收区同时与插入点的前、后两个分区相邻此时将这三个分区合并修改前一分区表项的大小为三者之和回收区没有相邻的空闲分区此时应该为回收区新建一个表项填写始址和大小并插入空闲分区链​ 将作业装入主存时要按照一定的分配算法从空闲分区链表中选出一个分区以分配给该作业。按分区检索方式可以分为顺序分配法和索引分配法基于顺序搜索的分配算法顺序分配算法是指依次搜索空闲分区链上的空闲分区以寻找一个大小满足要求的分区。首次适应算法First Fit。空闲分区按地址递增的次序排列。每次分配内存时顺序查找到第一个能满足大小的空闲分区分配给作业。算法保留了内存高地址部分的大空闲分区有利于后续大作业的装入。但它会使内存低地址部分出现许多小碎片而每次分配查找时都要经过这些分区因此增加了开销邻近适应算法Next Fit。也称循环首次适应算法。分配内存时从上次查找结束的位置开始继续查找它让内存低、高地址部分的空闲分区以同等概率被分配划分为小分区导致内存高地址部分没有大空间可用一般比FF更差最佳适应算法Best Fit。空闲分区按容量递增的次序排列。每次分配时 顺序查找到第一个能满足大小的空闲分区即最小的空闲分区分配给作业。每次分配会留下越来越多很小的难以利用的内存块产生最多的外部碎片最坏适应算法Worst Fit。空闲分区按容量递减的次序的排列。每次分配时顺序找到第一个能满足要求的空闲分区即最大的空闲分区从中分割一部分空间给作业最不容易产生碎片但会导致没有大空间可用基于索引搜索的分配算法根据其大小对空闲分区分类对于每类大小相同空闲分区单独设立一个空闲分区链并设置一张索引表来管理这些空闲分区链。当为进程分配空间时在索引表中查找所需空间大小对应的表项并从中得到对应的空闲分区链的头指针从而获得一个空闲分区快速适应算法空闲分区的分类根据进程常用的空间大小进行划分。分配过程分为两步根据进程的长度在索引表中找到能容纳它的最小空闲分区链表从链表中取下第一块进行分配优点查找效率高不会产生内存碎片缺点回收分区时需要有效的合并分区算法比较复杂系统开销大伙伴系统规定所有的分区大小均为2的k次幂。当需要为进程分配大小为n的分区时2 i − 1 n ≤ 2 i 2^{i-1}n\le 2^i2i−1n≤2i在大小为2 i 2^i2i的空闲分区链中查找。若找到则将该空闲分区分配给进程否则表示大小为2i的空闲分区已耗尽需在大小为2 i 1 2^{i1}2i1的空闲分区链中进行查找。若存在大小为2i1的空闲分区则将其等分为两个分区这两个分区称为一对伙伴。其中一个用于分配另一个加入2i的空闲分区链。若不存在则继续查找直至找到为止。回收时需要将相邻的空闲伙伴分区合并为更大的分区哈希算法根据空闲分区链表的分布规律建立哈希函数构建一张以空闲分区大小为关键字的哈希表每个表项记录一个对应空闲分区链的头指针空闲分区大小-空闲分区链表的头指针分配时根据所需分区大小通过哈希函数计算得到哈希表中的位置从中得到相应的空闲分区链表3.1.3 基本分页存储管理为了尽量避免碎片的产生引入了分页的思想将内存空间分为若干固定大小的分区称为页框、页帧或物理块。进程的逻辑地址空间也分为与块大小相等的若干区域称为页或页面。操作系统以页框为单位为各个进程分配内存空间。分页管理不产生外部碎片1.分页存储的基本概念页面和页面大小进程的逻辑地址空间中的每一个页面有一个编号称为页号从0开始内存空间中的每个页框也有一个编号称为页框号从0开始。进程在执行时需要申请内存空间即要为每个页面分配内存中的可用页框这就产生了页号和页框号的一一对应页面大小应是2的整数次幂页面太大会时页内碎片增多降低内存的利用率页面太小会时进程的页面数过多页表过长占用大量内存增加硬件地址转换的开销降低页面换入/换出的效率页面大小内存块大小地址结构地址结构包含两部分前一部分为页号P后一部分为页内偏移量W地址长度为32位其中0~~~~~11位为页内地址即每页大小位212B12~13位为页号即最多允许220页页表为了便于找到进程的每个页面在内存中存放的位置系统为每个进程建立一张页面映射表简称页表进程的每个页面对应一个页表项每个页表项页号→内存块号由页号和块号组成记录了页面在内存中对应的物理块号。通过查找页表即可找到每页在内存中的物理块号实现从页号到物理块号的映射顺序存储的页表页表项隐含着页号页表项中存放的是内存块号需要乘以内存块大小得到地址每个进程拥有一个页表且驻留在内存中2. 基本地址变换机构地址变换机构的任务是将逻辑地址转换为内存中的物理地址。地址变换是借助于页表实现的在系统中设置一个页表寄存器PTR存放页表在内存的始址F和页表长度M进程未执行时页表的始址和页表长度存放在本进程的PCB中当程序被调度时才将其调入页表寄存器设页面大小L逻辑地址A到物理地址E的变换过程如下假设都是十进制数根据逻辑地址计算出页号PA/L、页内偏移量WA%L判断页号是否越界若页号P≥页表长度M则产生越界中断否则继续执行在页表中查询页号对应的页表项确定页面存放的物理块号。页号P对应的页表项地址页表始址F页号P×页表项长度取出该页表项内容b即为物理块号计算物理地址EbLW用物理地址E去放存。注意物理地址页面在内存中的始址页内偏移量页面在内存中的始址块号×块大小页面大小分页管理方式存在的问题每次访存操作都需要进行从逻辑地址到物理地址的转换地址转换过程必须足够快否则访存速度会降低每个进程引入页表用于存储映射机制页表不能太大否则内存利用率会降低3. 具有快表的地址变换机构若页表全部存放在内存中则存取一个数据或一条指令至少需要访问两次内存速度慢了一半访问页表确定所存取的数据或指令的物理地址根据地址存取数据或指令设置一个具有并行查找能力的高速缓冲存储器——快表TLB也称相联存储器用来存放当前访问的若干页表项以加速地址变换的过程。与此对应主存中的页表常被称为慢表具有快表的分页机制中地址的变换过程如下CPU给出逻辑地址后由硬件进行地址转换将页号与快表中的所有页号进行比较若找到匹配的页号说明要访问的页表项在快表中有副本则直接从中取出该页对应的块号再与页内偏移量拼接形成物理地址。这样存取数据仅一次访存即可若未找到匹配的页号则需要访问内存中的页表读出页表项后就能得到该页的物理块号再与页内偏移量拼接形成物理地址最后用该物理地址去访存。若快表未命中则需要两次访存找到页表项后应同时将其存入快表以便后面可能的再次访问。若快表已满则须按照特定算法淘汰一个旧页表项快表的有效性基于局部性原理4. 两级页表有时存储页表需要占用连续的存储空间过大为解决这个问题可使用两种方法对于页表所需的内存空间采用离散分配的方法用一张索引表来记录各个页表的存放位置只将当前需要的部分页表调入内存其余的页表项仍然驻留磁盘需要时再调入为离散分配的页表再建立一张页表称为外层页表或页目录在系统中增设一个外层页表寄存器也称页目录基址寄存器用于存放页目录始址。将逻辑地址中的页目录号作为页目录的索引从中找到对应页表的始址再用二级页号作为页表始址从中找到对应的页表项将页表项中的物理块号和页内偏移拼接成物理地址再用该物理地址访问内存单元。共进行了三次访存计算页表级数页号n位2n个页一个页表有m项则需要n/m级页表3.1.4 基本分段存储管理分段分段系统将用户进程的逻辑地址空间“按照逻辑关系”划分为大小不等的段如主程序段、子程序段、栈段等逻辑地址结构由段号S与段内偏移量W两部分组成分段方式对低级语言程序员和编译器来说是可见的段表每个进程都有一张逻辑空间与内存空间映射的段表进程的每个段对应一个段表项段表项记录了该段在内存中的始址和段的长度段表项是连续存放的各个段表项的长度相同因此段号可以是隐含的地址变换机构在系统中设置一个段表寄存器用于存放段表始址F和段表长度M地址变换过程如下从逻辑地址A中取出前几位为段号S后几位为段内偏移量W判断段号是否越界若段号S≥段表长度M则产生越界中断否则继续执行在段表中查询段号对应的段表项段号S对应的段表项地址段表始址F段号S×段表项长度。取出段表项中该段的段长C若W≥C则产生越界中断否则继续执行取出段表项中该段的始址b计算物理地址EbW用物理地址E去访存4.分页和分段的对比页是信息的物理单位分页的主要目的是提高内存利用率分页完全是系统的行为。段是信息的逻辑单位页的大小固定且由系统决定段的长度不固定分页管理的地址空间是一维的。段式管理不能通过一个整数便确定对应的物理地址因为段长是不固定的不能通过整除得到段号不能通过求余得到段内偏移需要显式的给出段号和段内偏移因此分段管理的地址空间是二维的5.段的共享和保护为实现段共享多个进程共享同一段代码或数据在系统中设置一张共享段表所有共享的段都在共享段表中占一个表项。表项中记录了共享段的段号、段长、内存始址、状态位、外存始址和共享进程计数count等信息共享进程计数count记录有多少进程正在共享该段仅当所有共享该段的进程都不再需要它时此时count0才回收该段所占的内存区对于一个共享段在不同的进程中可以具有不同的段号每个进程用自己进程的段号去访问该共享段分段管理的保护方法主要有两种一种是存取控制保护另一种是地址越界保护地址越界保护将段表寄存器中的段表长度与逻辑地址中的段号比较若段号大于段表长度则产生越界中断再将段表项中的段长和逻辑地址中的段内偏移进行比较若段内偏移大于段长也产生越界中断6.引入段式存储可以满足的用户要求方便编程、共享和保护、动态链接和增长。没有方便操作3.1.5 段页式存储管理进程的地址空间先被分成若干逻辑段然后将各段分成若干大小固定的页进程的逻辑地址分为三部分段号、页号、页内偏移量为了实现地址变换系统为每个进程建立一张段表每个段对应一个段表项每个段表项至少包括段号隐含、页表长度、页表始址系统中还设有一个段表寄存器指出进程的段表始址和段表长度。段表寄存器和页表寄存器的作用在段表和页表中寻址、判断是否越界每个段有一张页表每个页表至少包括页号隐含、块号进行地址变换时首先通过段表找到页表始址、然后通过页表找到物理块号最后形成物理地址3.1.6 总结地址变换机构地址转换过程完全由硬件实现静态重定位在程序执行之前通常是加载到内存时由专门的重定位加载器一次性完成程序中所有逻辑地址到物理地址的转换。转换完成后地址在程序整个运行期间不再改变。动态重定位在程序执行过程中在硬件MMU的支持下每次访问内存时实时将逻辑地址转换为物理地址。程序的装载地址和运行地址可以不同。整个系统中只有一个重定位寄存器特性静态重定位动态重定位发生时机程序加载入内存时一次性完成。程序每条指令执行时由硬件实时完成。执行主体操作系统中的重定位加载器软件。内存管理单元MMU硬件如基址寄存器BR。关键机制加载器根据程序放入内存的起始物理地址修改程序指令和数据中的地址编码。CPU将逻辑地址与基址寄存器BR中的值相加得到物理地址。 公式物理地址 逻辑地址 BR地址变化程序被加载后其内部的地址已经是最终的物理地址固定不变。程序代码中的逻辑地址始终不变物理地址通过硬件计算动态生成。进程移动性无法移动。一旦加载若想将整个进程移动到内存另一区域必须重新进行静态重定位成本极高。可以移动。只需由操作系统更新基址寄存器BR的值进程即可在内存中“整体搬迁”。能否使用紧凑技术不能能内存保护难以实现。程序直接操作物理地址无法检查其访问是否越界。容易实现。可增设界限寄存器LR硬件在地址转换前检查逻辑地址是否越界实现存储保护。硬件依赖无需特殊硬件支持。必须依赖MMU等硬件支持。优点实现简单早期系统使用运行时无地址转换开销。灵活高效支持内存紧缩、进程动态扩展、共享代码库是现代操作系统的基础。缺点不灵活内存利用率低无法实现虚拟内存不支持共享。需要硬件成本每次访存都有一次加法开销现代硬件已将其流水线化开销极小。内部碎片分区内部的空间浪费内存管理方式对比管理方式核心原理地址空间维度碎片问题地址变换访存次数单一连续分配内存分为系统区和用户区一次只装入一个用户程序。一维线性无外部碎片但有内部碎片用户程序小于用户区时。静态重定位或动态重定位1固定分区分配将用户区预先划分为若干个固定大小的分区每个分区装一道作业。一维线性内部碎片严重作业小于分区时。每个分区需建立分区使用表记录各个分区的相关信息。使用静态分区分配或动态分区分配1动态分区分配根据作业实际大小动态创建分区分区大小和数量可变。一维线性外部碎片严重需通过紧凑技术解决。动态重定位通过基址寄存器实现1页式存储将进程和物理内存均等分为固定大小的“页”和“页框”进程页面可离散存放于任何物理页框。一维线性无外部碎片但有内部碎片通过页表进行映射。逻辑地址 页号P 页内偏移W2一级页表N1N级页表分段存储按程序的逻辑模块段划分如主程序段、子程序段、数据段等每段连续存放但段间可离散。二维逻辑有外部碎片段尺寸变化大通过段表进行映射。逻辑地址 段号S 段内偏移W2段页式存储先分段段内再分页。结合两者优点对外呈现分段结构对内实现分页管理。二维逻辑无外部碎片有内部碎片需段表 页表两级映射。逻辑地址 段号S 页号P 页内偏移W3一级页表

相关文章:

【操作系统】第三章 内存管理(一)

第三章 内存管理 3.1 内存管理概念 3.1.1 内存管理的基本原理和要求 内存管理的主要功能: 内存空间的分配与回收。[连续分配管理方式](#3.1.2 连续分配管理方式)和非连续分配管理方式(分页、分段)地址转换:实现逻辑地址到物理…...

基于Spring AI的MCP服务开发实战指南

1. Spring AI与MCP服务初探 第一次接触Spring AI框架时,我就被它简洁优雅的API设计所吸引。作为Spring生态中专门为AI应用开发提供的工具集,它让Java开发者能够像开发普通Web应用一样轻松构建AI服务。而MCP(Model Calling Protocol&#xff0…...

UE4.62生成sln时失败:Missing .../DotNET/UnrealBuildTool/UnrealBuildTool/UnrealBuildTool.exe

问题1: vs编译报错,以为是热加载,把项目的几个文件删了,想右键点击Generate Visual Studio Project Files重构,报错。 解决方法:: 是看m0_62179790这个博主解决的。 只要把下面这行东西添加到你自己的UE…...

SAP EWM开发实战:手把手教你用ABAP OO类 /SCWM/CL_SP_PRD_INB 创建内向交货单

SAP EWM开发实战:基于ABAP OO类实现内向交货单自动化创建 1. 理解内向交货单创建的技术背景 在SAP扩展仓库管理(EWM)系统中,内向交货单(Inbound Delivery)是管理入库流程的核心凭证。与传统的SAP ERP系统不同,EWM模块在设计上采用了更加灵活的…...

OpenClaw自动化测试:Qwen3-32B批量执行LeetCode题目

OpenClaw自动化测试:Qwen3-32B批量执行LeetCode题目 1. 为什么需要自动化编程能力测试 作为一名长期关注AI编程辅助工具的技术博主,我一直在寻找能够客观评估大模型编程能力的方法。传统的单次对话测试往往带有偶然性,无法系统性地反映模型…...

二分查找/二分答案

0.前言二分算法(Binary Search),也叫折半查找,是一种在有序数据集合中高效查找目标值的算法。它通过不断将查找范围缩小一半,快速定位目标,时间复杂度为 O(logn),远优于线性查找的 O(n)。1.原理…...

基于springboot的志愿者招募管理系统

目录系统架构设计数据库设计核心功能实现报名与审核流程统计与报表部署方案项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作系统架构设计 采用SpringBoot作为后端框架,搭配MyBatis或JPA实现数据持久化。前端可选择T…...

Arduino轻量级哈希表UnorderedMap实战指南

1. 项目概述UnorderedMap是一款专为 Arduino 平台设计的轻量级哈希表(Hash Table)实现,其核心目标是在资源极度受限的微控制器环境中提供高效、可靠、内存可控的键值对(Key-Value Pair)存储能力。它并非 C STLstd::uno…...

java打卡学习3:ArrayList扩容机制

ArrayList扩容机制概述ArrayList是基于动态数组实现的集合类,当元素数量超过当前数组容量时,会自动触发扩容机制。其核心目的是平衡内存占用与性能开销。默认初始容量未指定初始容量时,默认创建一个空数组(JDK 1.8)&am…...

The Dark Art of Low-Light Enhancement: Why Retinex Models Don’t Need Handcrafted Priors Anymore

无先验约束的Retinex模型:PairLIE如何重塑低光增强技术范式 1. 低光增强的技术演进与当前挑战 在计算摄影领域,低光图像增强(Low-light Image Enhancement, LIE)一直是核心难题之一。传统方法主要依赖手工设计的先验知识&#xff…...

基于主从博弈的主动配电网阻塞管理探索

基于主从博弈的主动配电网阻塞管理 首先,在日前市场中,LA(负荷聚合商)根据历史数据预测次日向上级电网购电的电价信息和预测分布式电源(燃气轮机)出力、风电场出力信息,同时考虑事前与用户签订协议的可中断负荷&#x…...

debian 更新内核后,nvidia 驱动突然不见了,处理

nvidia 驱动通常由 dkms 来构建 安装新内核后, 对应 linux-headers-amd64 没有安装到,导致 dkms 不为新内核 构建驱动 解决办法: apt update apt install linux-headers-amd64 它会自动为已有的内核安装 linux 头文件 然后 用命令 dpkg-recon…...

树莓派C语言工程建立

从原来例子程序中拷贝一个例子例如blink目录到myPrj目录下,再拷贝其他几个文件,最终示意如下:修改CMakeLists.txt 文件,去除add_subdirectory(…)语句和add_subdirectory_exclude_platforms(…)语句,在最后增加 add_su…...

Qwerty Learner 数据持久化架构深度解析:IndexedDB 异步存储方案技术实现

Qwerty Learner 数据持久化架构深度解析:IndexedDB 异步存储方案技术实现 【免费下载链接】qwerty-learner 项目地址: https://gitcode.com/GitHub_Trending/qw/qwerty-learner 在英语单词记忆与打字训练应用中,数据持久化架构直接影响学习体验的…...

Python农业物联网部署突然中断?揭秘土壤传感器数据丢包率超37%的底层时钟漂移根源(附校准代码)

第一章:Python农业物联网部署在现代农业数字化转型中,Python凭借其丰富的物联网生态库(如paho-mqtt、Adafruit-IO、RPi.GPIO)和轻量级运行特性,成为边缘设备与云平台协同的核心语言。本章聚焦于基于树莓派的土壤温湿度…...

MCP服务器性能翻倍的秘密:基于asyncio+uvloop+Pydantic V2的轻量级模板(压测QPS达12,800+)

第一章:MCP服务器开发模板概述与核心价值MCP(Model-Controller-Protocol)服务器开发模板是一套面向协议驱动、可插拔架构的后端服务构建范式,专为高并发、多协议适配(如HTTP/2、gRPC、WebSocket、MQTT)场景…...

SYNBO AMA 回顾|当稳定币突破 3000 亿,一级的“钱”到底在往哪里流?

一、 聊了什么:背景与主题时间:2026 Mar 25 (Wed) 20:00 UTC8主题: Stablecoins Primary Market: The New Capital Stack Powering Global Payments in 2026在昨晚举行的一场围绕“稳定币、PayFi 与全球支付”的 AMA 中,SYNBO 与…...

LeagueAkari终极指南:智能游戏辅助工具快速上手与深度配置

LeagueAkari终极指南:智能游戏辅助工具快速上手与深度配置 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾在…...

做了十几年财务,我用RPA把最累的工作交给了“机器人”

在财务这行摸爬滚打了十几年,算是一路看着这个行业慢慢“进化”过来的:从最早拿计算器对数据,到后来用电脑做账,从手工账本过渡到ERP系统,再到这两年铺天盖地的“数智化转型”。中间也确实尝试过不少所谓的“黑科技”。…...

Boss-Key:职场隐私保护与效率提升的开源解决方案

Boss-Key:职场隐私保护与效率提升的开源解决方案 【免费下载链接】Boss-Key 老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 在数字化办公环境中&#xff…...

SEO_详解SEO核心关键词的研究与布局方法(455 )

<h2>SEO核心关键词的研究与布局方法详解</h2> <p>在当前的互联网时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为了各个企业和网站提升网络曝光率、吸引更多流量的重要手段。其中&#xff0c;核心关键词的研究与布局是SEO的重要组成部分。…...

Java 四种安全加载 P12 证书的方案

文章目录从文件绝对路径加载【最常用、最稳定】从 resources 目录加载从 byte [] 字节数组加载从 Base64 字符串加载如果文章对您有用&#xff0c;请关注点赞加收藏&#xff0c;博主会持续更新相关的专栏笔记&#x1fae1; 从文件绝对路径加载【最常用、最稳定】 适合&#xf…...

玩转AI!用FastAPI+RAG轻松构建智能文档问答系统,代码、文档全公开!

在企业数字化转型的浪潮中&#xff0c;我们常遇到这样一个痛点&#xff1a;海量的业务文档、研究报告、技术手册堆积如山&#xff0c;当需要从中寻找某个特定答案时&#xff0c;员工往往要花费数小时甚至数天进行翻阅。这不仅是效率的浪费&#xff0c;更是知识资产沉睡的体现**…...

I2CLCD驱动库:HD44780字符屏的I²C轻量级嵌入式适配方案

1. I2CLCD库概述&#xff1a;面向嵌入式系统的字符型LCD IC适配驱动I2CLCD是一个轻量级、可移植的C语言驱动库&#xff0c;专为将标准HD44780兼容的字符型LCD&#xff08;如1602、2004&#xff09;通过IC总线接入MCU而设计。其核心价值在于消除并行接口对GPIO资源的高占用&…...

嵌入式OLED UI组件库:轻量级C++组件化设计

1. 项目概述 OLED UI Components 是一个面向嵌入式平台的轻量级、组件化 OLED 用户界面开发库&#xff0c;专为基于 SSD1306 驱动芯片的单色 OLED 显示屏&#xff08;典型分辨率为 12864&#xff09;设计。该库不直接操作硬件寄存器&#xff0c;而是构建在 Adafruit_SSD1306 库…...

Nimbus:一个统一的具身合成数据生成框架

Zeyu He, Yuchang Zhang, Yuanzhen Zhou, Miao Tao, Hengjie Li,∗, Hui Wang, Yang Tian, Jia Zeng, Tai Wang, Wenzhe Cai, Yilun Chen, Ning Gao, Jiangmiao Pang摘要扩大数据规模和多样性对于泛化具身智能至关重要。虽然合成数据生成为昂贵的物理数据采集提供了可扩展的替代…...

02.Linux常用文件操作命令

1.mkdir 目录名:创建目录 mkdir 目录名 mkdir -p a/b/c 创建多级目录 2.touch 创建空文件 touch 文件名 touch 文件名 文件名 创建多个文件 3.文件写入内容 echo写入 覆盖写入 echo 文件内容 >文件名 追加写入&#xff08;日志必用&#xff09; echo 文件内容 >…...

STM32开发中的C语言高效编程技巧

STM32开发中的C语言高效编程技巧1. 位操作在寄存器控制中的应用1.1 位操作基础在STM32嵌入式开发中&#xff0c;C语言提供了六种基本位操作运算符&#xff1a;&按位与|按位或^按位异或~按位取反<<左移>>右移1.2 寄存器位操作技巧1.2.1 特定位置位/清零// 设置G…...

蒙纳什大学发现多模态推理模型的“不确定性陷阱“

这项由蒙纳什大学、佐治亚理工学院、康奈尔大学等多所知名学府联合完成的研究发表于2026年3月的《计算机视觉与模式识别》会议&#xff0c;论文编号为arXiv:2603.13366v1。有兴趣深入了解的读者可以通过该编号查询完整论文。当你问一个AI"这张图片里有什么"时&#x…...

SEO_避开这些常见误区让你的SEO效果事半功倍

<h2>SEO误区一&#xff1a;忽视关键词优化</h2> <p>在进行SEO优化时&#xff0c;关键词的选择和使用是至关重要的。很多人忽视了关键词优化&#xff0c;导致他们的网站在搜索引擎中的排名一直停滞不前。关键词不仅仅是为了让搜索引擎理解你的网站内容&#x…...