理解虚拟内存机制

计算机底层知识拾遗(一)理解虚拟内存机制 这个系列会总结计算机,网络相关的一些重要的底层原理。很多底层原理大家上学的时候都学过,但是在学校的时候大部分的同学都是为了应付考试而学习,过几天全忘了。随着工作的时间越久,越体会到这些基础知识的重要性。做技术和练武功一样,当你到了一定的阶段,也会遇到一个瓶颈,突破了你的眼界就会大不同,突破不了,只能困在原地无法成长。我自己深有体会,这些基础知识,底层原理是助你打破瓶颈的灵丹妙药。当理解了一些底层原 阅读详情

原文连接:http://blog.csdn.net/iter_zc/article/details/42644229


这个系列会总结计算机,网络相关的一些重要的底层原理。很多底层原理大家上学的时候都学过,但是在学校的时候大部分的同学都是为了应付考试而学习,过几天全忘了。随着工作的时间越久,越体会到这些基础知识的重要性。做技术和练武功一样,当你到了一定的阶段,也会遇到一个瓶颈,突破了你的眼界就会大不同,突破不了,只能困在原地无法成长。我自己深有体会,这些基础知识,底层原理是助你打破瓶颈的灵丹妙药。当理解了一些底层原理之后,会发现现在很多热门技术,原理,常见的设计都是在底层基础上发展而来的。

这篇总结一下单机系统的虚拟内存原理。在 聊聊高并发(三十四)Java内存模型那些事(二)理解CPU高速缓存的工作原理这篇中说了CPU高速缓存的一些原理,虚拟内存也是缓存原理的应用,它是单机系统管理内存的手段,很多设计非常经典,在分布式存储系统中可以看到这些原理和设计的应用。

虚拟内存是单机系统最重要的几个底层原理之一,它由底层硬件和操作系统两者软硬件结合来实现,是硬件异常,硬件地址翻译,主存,磁盘文件和内核的完美交互。它主要提供了3个能力:

  1. 给所有进程提供一致的地址空间,每个进程都认为自己是在独占使用单机系统的存储资源
  2. 保护每个进程的地址空间不被其他进程破坏,隔离了进程的地址访问
  3. 根据缓存原理,上层存储是下层存储的缓存,虚拟内存把主存作为磁盘的高速缓存,在主存和磁盘之间根据需要来回传送数据,高效地使用了主存

本文包括几块内容
  • 虚拟地址和物理地址
  • 页表
  • 地址翻译
  • 虚拟内存相关的数据结构
  • 内存映射

虚拟地址和物理地址


对于每个进程来说,它使用到的都是虚拟地址,每个进程都看到一样的虚拟地址空间,对于32位计算机系统来说,它的虚拟地址空间是 0 - 2^32,也就是0 - 4G。对于64位的计算机系统来说,理论的虚拟地址空间是 0 - 2^64,远高于目前常见的物理内存空间。虚拟地址空间不需要和物理地址空间一样大小。Linux内核把虚拟地址空间分为两部分: 用户进程空间和内核进程空间,两者的比例一般是3:1,比如4G的虚拟地址空间,3G用户用户进程,1G用于内核进程。


下图是一个典型的 Linux进程的虚拟地址空间分布


在说CPU高速缓存的时候说过CPU只直接和寄存器和高速缓存打交道,CPU在执行进程的指令时要取一个实际的物理地址的值的时候主要有几步:
  1. 把进程指令使用的虚拟地址通过MMU转换成物理地址
  2. 把物理地址映射到高速缓存的缓存行
  3. 如果高速缓存命中就返回
  4. 如果不命中,就产生一个缓存缺失中断,从主存相应的物理地址取值,并加载到高速缓存中。CPU从中断中恢复,继续执行中断前的指令
所以高速缓存是和 物理地址相映射的,进程指令中使用到的是 虚拟地址。

操作系统内存管理

在缓存原理中,数据都是按块来进行逻辑划分的,一次换入/换出的数据都是以块为最小单位,这样提高了数据处理的性能。同样的原理应用到具体的内存管理时,使用了 页(page)来表示块,虚拟地址空间划分为多个固定大小的虚拟页(Virtual Page, VP),物理地址空间划分为多个固定大小的物理页(Physical Page, PP), 通常虚拟页大小等于物理页大小,这样简化了虚拟页和物理页的映射。虚拟页的大小通常在4KB - 2MB之间。在JVM调优的时候有时候会使用2MB的大内存页来提高GC的性能。

要明白一个重要的概念:
  1. 对于CPU来说,它的目标存储器是物理内存,使用高速缓存做物理内存的缓存
  2. 同样,对于虚拟内存来说,它的目标存储器是磁盘空间,使用物理内存做磁盘的缓存
所以,从缓存原理的角度来理解,在任何时刻,虚拟页的集合都分为3个不相交的子集:
  1. 未分配的页,即没有任何数据和这些虚拟页关联,不占用任何磁盘空间
  2. 缓存的页,即已经分配了的虚拟页,并且已经缓存在具体的物理页中
  3. 未缓存的页,即已经为磁盘文件分配了虚拟页,但是还没有缓存到具体的物理页中

虚拟内存系统和高速缓存系统一样,需要判断一个虚拟页面是否缓存在DRAM(主存)中,如果命中,就直接找到对应的物理页。如果不命中,操作系统需要知道这个虚拟页对应磁盘的哪个位置,然后根据相应的替换策略从DRAM中选择一个牺牲的物理页,把虚拟页从磁盘中加载到DRAM物理主存中

虚拟内存的这种缓存管理机制是 通过操作系统内核,MMU(内存管理单元)中的地址翻译硬件和每个进程存放在主存中的页表(page table)数据结构来实现的。


页表


页表(page table)是存放在主存中的,每个进程维护一个单独的页表。 它是一种管理虚拟内存页和物理内存页映射和缓存状态的数据结构。它逻辑上是由页表条目(Page Table Entry, PTE)为基本元素构成的数组。
  1. 数组的索引号对应着虚拟页号
  2. 数组的值对应着物理页号
  3. 数组的值可以留出几位来表示有效位,权限控制位。有效位为1的时候表示虚拟页已经缓存。有效位为0,数组值为null时,表示未分配。有效位为0,数组值不为null,表示已经分配了虚拟页,但是还未缓存到具体的物理页中。权限控制位有可读,可写,是否需要root权限

聊聊高并发(三十四)Java内存模型那些事(二)理解CPU高速缓存的工作原理这篇中解释了缓存相联度的概念,DRAM缓存是全相联的,即只有一组,任意的缓存行可以缓存任意的内容,有一个比较判断的过程,即任意的虚拟页可以对应任意的物理页。

DARM缓存的命中称为页命中,不命中称为缺页。举个例子来说,
  1. CPU要访问的一个虚拟地址在虚拟页3上(VP3),通过地址翻译硬件从页表的3号页表条目中取出内容,发现有效位0,即没有缓存,就产生一个缺页异常
  2. 缺页异常调用内核的缺页异常处理程序,它会根据替换算法选择一个DRAM中的牺牲页,比如PP3。PP3中已经缓存了VP4对应的磁盘文件的内容,如果VP4的内容有改动,就刷新到磁盘中去。然后把VP3对应的磁盘文件内容加载到PP3中。然后更新页表条目,把PTE3指向PP3,并修改PTE4,不再指向PP3.
  3. 缺页异常处理程序返回后重新启动缺页异常前的指令,这时候虚拟地址对应的内容已经缓存在主存中了,页命中也可以让地址翻译硬件正常处理了
磁盘和主存之间传送页的活动叫做交换(swapping)或者页面调度(页面调入,页面调出)。现代操作系统都采用按需调度的策略,即不命中发生时才调入页面。操作系统都会在主存中分配一块交换区(swap)来作缓冲区,加速页面调度。

由于页的交换会引起磁盘流量,所以具有好的局部性的程序可以大大减少磁盘流量,提高性能。而如果局部性不好产生大量缺页,从而导致不断地在磁盘和主存交换页,这种现象叫 缓存颠簸。可以用Unix的函数getrusage来统计缺页的次数

现代操作系统都采用多级页表的方式来压缩页表的大小。举个例子,
  1. 对于32位的机器来说,支持4G的虚拟内存大小,如果每个页是4KB大小,那么采用一级页表的话,需要10^6个页表条目PTE。32位机器的页表条目是4个字节,那么页表需要4MB大小的空间。
  2. 假设使用4MB大小的页,那么只需要10^3个页表项。假设每个4MB大小的页又分为4KB大小的子页,那么每个4MB大小的页需要10^3个的页表项来指向子页。也就是说可以分为两级页表,第一级页表项只需要4KB大小的页表项,每个一级页表项又指向一个4KB大小的二级页表,二级页表项则指向实际的物理页。
页表项加载是按需加载的,没有分配的虚拟页不需要建立页表项, 所以可以一开始只建立一级页表项,而二级页表项按需创建,这样大大压缩了页表的空间。

使用k级页表项的地址翻译如下:


Core i7采用4级页表的结构:



地址翻译


地址翻译就是把N个元素的虚拟地址空间(VAS)映射到M个元素的物理地址空间(PAS)的过程。下表是地址翻译时用到的符号


下面看一下CPU如何把一个虚拟地址翻译到对应的物理地址。
  1. CPU有一个专门的页表基地址寄存器(page table base register, PTBR)指向当前页表的基地址,从而可以快速定位到该进程的页表
  2. n位的虚拟地址划分为p位的虚拟地址偏移量VPO和(n - p)位的虚拟页号VPN
  3. 物理地址同样划分为p位的物理地址偏移量PPO和(m - p)位的物理页号PPN
  4. 由于虚拟页大小和物理页大小相同,所以VPO = PPO

页面的命中完全由硬件完成,缺页则由硬件和内核共同完成,已经在上面举例说明了。

为了提高地址翻译的效率,地址翻译硬件还引入了一个硬件设备来缓存页表条目PTE,叫做翻译后备缓冲区TLB(translation lookaside buffer)。它是一个小的,虚拟寻址的缓存,每一行都保存一个由单个PTE组成的块。TLB也遵循缓存的设计原理,分为组,行,块的结构。一个虚拟地址映射到TLB的缓存结构如下:

而TLB的命中和不命中的流程如下:

Core i7处理器的地址翻译硬件结构如下:
总结一下地址翻译的过程:
  1. CPU拿到一个虚拟地址,分为两步,先通过页表机制确定该地址所在虚拟页的内容是否从磁盘加载到物理内存页中,然后通过高速缓存机制从该物理地址中取到数据
  2. 地址翻译硬件要把这个虚拟地址翻译成一个物理地址,从而可以再根据高速缓存的映射关系,把这个物理地址对应的值找到
  3. 地址翻译硬件利用页表数据结构,TLB硬件缓存等技术,目的只是把一个虚拟地址映射到一个物理地址。要记住DRAM缓存是全相联的,所以一个虚拟地址和一个物理地址是动态关联的,不能直接根据虚拟地址推导出物理地址,必须根据DRAM从磁盘把数据缓存到DRAM时存到页表时存的实际物理页才能得到实际的物理地址,用物理页PPN + VPO就能算出实际的物理地址 (VPO = PPO,所以直接用VPO即可)。 PPN的值是存在页表条目PTE中的。地址翻译做了一堆工作,就是为了找到物理页PPN,然后根据VPO页面偏移量,就能定位到实际的物理地址。
  4. 得到实际物理地址后,根据高速缓存的原理,把一个物理地址映射到高速缓存具体的组,行,块中,找到实际存储的数据。

Linux虚拟内存机制



Linux把虚拟内存划分成区域area的集合,每个存在的虚拟页面都属于一个area。一个area包含了连续的多个页。Linux通过area相关的数据结构来灵活地管理虚拟内存。
  1. 内核为每个进程维护了一个单独的任务结构 task_struct
  2. task_struct的mm指针指向了mm_struct,该结构描述了虚拟内存的运行状态
  3. mm_struct的pgd指针指向该进程的一级页表的基地址。mmap指针指向了vm_area_struct链表
  4. vm_area_struct是描述area结构的一个链表,链表节点的几个重要属性如下:vm_start表示area的开始位置,vm_end表示area的结束位置,vm_prot描述了area内的页的读写权限,vm_flags描述该area内的页面是与其他进程共享还是进程私有, vm_next指向下一个area节点
在Linux系统中,当MMU翻译一个虚拟地址发生缺页异常时,跳转到内核的缺页异常处理程序。
  1. Linux的缺页异常处理程序会先检查一个虚拟地址是哪个area内的地址。只需要比较所有area结构的vm_start和vm_end就可以知道。area都是一个连续的块。如果这个虚拟地址不属于任何一个area,将发生一个段错误,终止进程
  2. 要访问的目标地址是否有相应的读写权限,如果没有,将触发一个保护异常,终止进程
  3. 选择一个牺牲页,如果牺牲页被修改过,那么把它交换出去。从磁盘加载虚拟页内容到物理页,更新页表

内存映射机制


虚拟内存的目标存储器是磁盘,所以虚拟内存区域是和磁盘中的文件对应的。初始化虚拟内存区域的内容时,会把虚拟内存区域和一个磁盘文件对象对应起来,这个过程叫内存映射(memory mapping)。虚拟内存可以映射的磁盘文件对象包括两种:
  1. 一个普通的磁盘文件,文件中的内容被分成页大小的块。因为按需进行页面调度,只有真正需要读取这些虚拟页时,才会交换到主存
  2. 一个匿名文件,匿名文件是内核创建的,内容全是二进制0,它相当于一个占位符,不会产生实际的磁盘流量。映射到匿名文件中的页叫做请求二进制零的页(demand zero page)
一旦一个虚拟页面被初始化了,它就在一个由内核维护的专门的交换区(swap area)之间换来换去。

由于内存映射机制, 所以一个磁盘文件对象可以被多个进程共享访问,也可以被多个进程对象私有访问。如果是共享访问,那么一个进程对这个对象的修改会显示到其他进程。如果是私有访问,内核会采用写时拷贝copy on write的方式,如果一个进程要修改一个私有的写时拷贝的对象,会产生一个保护故障,内核会拷贝这个私有对象,写进程会在新的私有对象上修改,其他进程仍指向原来的私有对象。


理解了内存映射机制就可以理解几个重要的函数:

1. fork函数会创建带有独立虚拟地址空间的新进程,内核会为新进程创建各种数据结构,分配一个唯一的PID,把当前进程的mm_struct, area结构和页表都复制给新进程。两个进程的共享同样的区域,这些区域包括共享的内存映射和私有的内存映射。私有的内存映射区域都被标记为私有的写时拷贝。如果新建的进程对这些虚拟页做修改,那么会触发写时拷贝,为新的进程维护私有的虚拟地址空间。


2. mmap函数可以创建新的虚拟内存area,并把磁盘对象映射到新建的area。
mmap可以用作高效的操作文件的方式,直接把一个文件映射到内存,通过修改内存就相当于修改了磁盘文件,减少了普通文件操作的一次拷贝操作。普通文件操作时会先把文件内容从磁盘复制到内核空间管理的一块虚拟内存区域area,然后内核再把内容复制到用户空间管理的虚拟内存area。 mmap相当于创建了一个内核空间和用户空间共享的area,文件的内容只需要在这个area对应的物理内存和磁盘文件之间交换即可。
mmap也可以通过映射匿名文件的方式来分配内存空间。比如malloc当要求分配的内存大小超过了MMAP_THRESHOLD(默认128kb)时,会使用mmap私有的,匿名文件的方式来分配大块的内存空间。

后面会详细介绍mmap的机制



参考资料: 
《深入理解计算机系统》

26、深入理解虚拟内存管理机制与页面置换算法 本文深入探讨了虚拟内存管理机制及其核心组件,包括页面划分、换入换出操作、页面错误处理以及关键术语解析。详细介绍了多种页面置换算法如LRU、LFU、FIFO、时钟变体和随机算法的原理、优缺点及适用场景,并通过操作系统工作台的模拟实验直观展示了虚拟内存的工作流程。文章还结合图示与实际案例,帮助读者理解虚拟内存系统在资源受限环境下的行为特征,最后总结了优化内存管理的策略与进一步探索方向。 阅读详情

相关推荐

24、深入理解虚拟内存:原理、机制与优势

本文深入探讨了虚拟内存技术的原理、机制与优势,涵盖了内存管理单元(MMU)、分页机制、页表结构、多级页表、快表(TLB)、页面置换算法以及虚拟内存与缓存的交互。通过这些机制,虚拟内存实现了程序的位置独立性、内存隔离与保护、支持大型程序运行和高效利用存储,是现代计算机系统提升性能与效率的核心技术之一。

qsc90123456的博客 64

Linux 内核分析 二:虚拟内存

本文章主要对《深入理解计算机系统》第九章内容进行整理。 一、概述 虚拟内存:为了更加有效管理内存并且减少出错,现代操作系统提供一种对主存的抽象概念。 1、虚拟内存三个重要能力 1、将主存看成磁盘的高速缓存,主存中只保留活动区域,根据需求在磁盘和主存间传递数据。 2、为每个进程提供一致进程地址空间,从而简化内存管理。 3、保护每个进程的地址空间不被其他进程破坏。 2、理解虚拟内存的重要性 1、虚拟内存是核心的 虚拟内存遍及计算机系统的所有层面,理解虚拟内存有助于更好地理解系统是如何工作的。 2、虚拟内存是强大

OnlyLove_的博客 757

FDTD脚本教程——结构的创建

文章目录结构的搭建创建长方体创建柱体多边形柱体(椭)圆柱体圆环柱自定义形状创建surface波导球棱锥 在lumerical中,可以使用脚本进行操作,可在右侧脚本编辑器运行,或者直接在下方shell输入。 结构的搭建 创建长方体 um = 1e-6; nm = 1e-7; addrect; set("name","myRect"); set("material","SiO2 (Glass) - Palik"); set("render type","wireframe"); # 默认是细节渲染,也就是det

战斗果冻的训练中心 2万+

Linux内存管理1——虚拟内存空间

本文主要分析了进程虚拟空间存在的意义,以及进程虚拟空间相关数据结构,在用户态空间以及内核态空间中虚拟空间是如何分布的,最后分析了CPU是如何读取或者写数据。

weixin_42482191的博客 2958

图文并茂,深入了解RocketMQ的内存映射机制

大家好,我是Leo。 今天聊一下RocketMQ的内存映射机制 传统文件IO机制 假如没有使用mmap技术的时候,使用最传统和基本普通文件进行io操作会产生数据多拷贝问题。 比如从磁盘上把数据读取到内核IO缓冲区里面,然后再从内核IO缓冲区中读取到用户进程私有空间里去,然后我们才能拿到这个数据。 如上图显示,可以明显的看出数据被拷贝了两次,这样肯定对磁盘读性能是有影响的。同样的如果想给磁盘中写内容,也是得先从用户进程的私有空间把数据拷贝到内核IO缓冲区,然后从内核IO缓冲区再拷贝到磁盘文件。

欢少的成长之路的博客 785

西门子PLC新手必看:200SMART与1200/1500的MODBUS RTU通讯实战(附完整配置流程)

本文详细解析了西门子PLC中S7-200 SMART与S7-1200/1500之间实现MODBUS RTU通讯的完整实战流程。内容涵盖硬件接线、软件配置及程序编写,重点讲解了200SMART作为从站、1200/1500作为主站的典型架构,并提供了关键功能块的使用方法和常见问题排查技巧,帮助新手快速打通不同系列PLC间的数据交换。

weixin_29214559的博客 366

linux虚拟内存管理

虚拟内存区域 VMA 由许多的虚拟页 (page) 组成,每个虚拟页需要经过页表的转换才能找到对应的物理页面。页表中关于内存页的访问权限就是由 vm_page_prot 决定的。通过这一系列的介绍,我们可以看到 vm_flags 就是定义整个虚拟内存区域的访问权限以及行为规范,而内存区域中内存的最小单位为页(4K),虚拟内存区域中包含了很多这样的虚拟页,对于虚拟内存区域 VMA 设置的访问权限也会全部复制到区域中包含的内存页中。

myIddddd的博客 1161

OpenMontage:AI代理驱动的端到端视频生产系统实战指南

在当今内容创作领域,自动化视频生成技术正成为提升生产效率的关键。其核心原理在于通过智能体(Agent)架构,将复杂的视频制作流程拆解为可被AI理解和执行的标准化任务,从而实现从创意到成片的端到端自动化。这项技术的核心价值在于大幅降低了专业视频制作的门槛,使非专业用户也能快速产出具有一定专业度的内容。其典型应用场景包括社交媒体短片、产品演示、知识科普视频的批量生产。OpenMontage正是这一技术理念的杰出实践,它构建了一个完整的代理驱动视频生产系统,将AI编码助手转变为能自主规划并执行脚本撰写、素材检索、

weixin_35757191的博客 629

转载:计算机底层知识拾遗(一)理解虚拟内存机制

这个系列会总结计算机,网络相关的一些重要的底层原理。很多底层原理大家上学的时候都学过,但是在学校的时候大部分的同学都是为了应付考试而学习,过几天全忘了。随着工作的时间越久,越体会到这些基础知识的重要性。做技术和练武功一样,当你到了一定的阶段,也会遇到一个瓶颈,突破了你的眼界就会大不同,突破不了,只能困...

luoluo01的博客 283

深入理解虚拟内存机制

原文转载自:https://www.jianshu.com/p/13e337312651 概述 现代操作系统了提供了一种对主存的抽象概念,叫做虚拟内存。它为每个进程提供了一个非常大的,一致的和私有的地址空间。虚拟内存提供了以下的三个关键能力: 它将主存看成是一个存储在磁盘空间上的地址空间的高速缓存,主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据。 它为内阁进程提供了一致的地址...

wangping623的专栏 3万+

Ansys-结构动力学分析-圆柱斜齿轮模态分析学习心得

模态分析的步骤基本一直,不同点在于选择什么单元类型,模型,节点约束等 圆柱斜齿轮模态分析的难点在于圆柱斜齿轮的模型建立,和所要约束的节点的选择。 用命令流方法建立齿轮模型效率较高,当然,在ansys里建立复杂的模型实在不敢恭维,对于自下而上建模,需要知道每个关键点的坐标位置。下图是创建圆柱斜齿轮模型的命令流方式。 模型不同使用的数据也就不同了。 对于施加约束的问题这就必须要熟悉select e...

weixin_45385183的博客 1814

理解Linux虚拟内存机制

4)vm_area_struct描述area的结构,vm_start表示area的开始位置,vm_end表示area的结束位置,vm_prot表示area内的页的读写权限,vm_flags表示area内的页面是进程私有还是共享,vm_next指向下一个area节点。2)一级页表占用的空间是比较大的,根据按需调度的原则,一般使用的是多级页表,即一级页表指向二级页表,这样大大压缩了页表的大小。当私有访问时,修改时会产生保护故障,内核会拷贝这个私有对象,修改的是这个新对象,其他进程指向的是原来的对象。

m0_74282605的博客 141

安装openclaw时出现npm error code ENOENT npm error syscall spawn git报错的解决方案

本文主要介绍了安装openclaw时出现npm error code ENOENT npm error syscall spawn git报错的解决方案,希望能对使用openclaw的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

深入理解Linux进程管理与虚拟内存机制

task_struct中包含了进程ID、状态、优先级等关键信息,并通过双向链表组织起来。平台提供即开即用的Linux环境,无需复杂配置就能实践进程管理、内存分配等操作,特别适合学习系统编程原理。这种机制使得子进程初始共享父进程资源,仅在需要修改时才创建副本,既保证了效率又确保了进程独立性。这也是为什么fork能"返回两次"的奥秘所在。每个进程看到的都是独立的4GB虚拟地址空间(32位系统),包含代码段、数据段、堆、栈等区域。环境变量通过继承机制实现全局性,从bash进程开始,所有子进程都会继承环境变量表。

RubyWolf84的博客 445

对操作系统虚拟内存机制的理解

1.如果把二进制程序全部加载到内存中,会出现一种情况就是明明内存还有空间,但是不够二进制程序的大小,所以也加载不了,这样很浪费内存,而且会产生外部碎片。所以就改良成2中描述的方案。 2.采用页表的方式对内存进行管理。分页将物理内存和可执行程序划分成很小的区块,这个区块定义为页,每个页的大小为4k,二进制程序中不足4k的页默认为4k。操作系统会为每个进程维护一个页表。页表主要记录进程的页号与内存中的页号的对应关系。这样的话就没有要求二进制程序加载到物理内存中必须是连续的,不会产生外部碎片,但是因为二进制程序

qq_42461373的博客 327

基于四旋翼模型的火箭型无人机视线角保持控制仿真设计

本文针对火箭型无人机的视线角保持控制问题展开研究。基于四旋翼动力学模型,通过改造设计了一种摄像头朝上安装的特殊无人机系统,用于追踪空中目标。文章详细推导了坐标系定义、运动学和动力学方程,重点分析了摄像头安装与视线几何关系,建立了目标运动模型和视线向量计算方法。通过解算期望姿态角,实现了使机体Z轴始终对准目标的控制目标。仿真结果表明,该系统能有效完成视线角保持任务,为空对空监视等应用场景提供了可行方案。~~~~~

huanghm88的专栏 118

操作系统——深入理解虚拟内存机制

本文来自:https://www.jianshu.com/p/13e337312651 概述 现代操作系统了提供了一种对主存的抽象概念,叫做虚拟内存。它为每个进程提供了一个非常大的,一致的和私有的地址空间。虚拟内存提供了以下的三个关键能力: 它为所有进程提供了一致的地址空间,简化了内存管理。 保护每个进程的地址空间不被其他进程破坏,隔离了进程的地址访问 它将主存看成是一个存储在磁盘空间上的地...

zhaohong_bo的专栏 1847

Linkage Mapper 输出文件夹结构解析——LCPs(栅格廊道)、LinkagePaths(矢量廊道)、Nodes(节点)

Linkage Mapper输出文件解析摘要 Linkage Mapper是生态连通性分析的重要工具,通过最小累积阻力模型(MCR)识别物种迁移廊道。其输出包含三类核心文件: LCPs(栅格廊道):存储累积阻力值的栅格数据,直观展示低阻力路径,适用于空间分析和廊道质量评估。 LinkagePaths(矢量廊道):以矢量线状要素精确记录廊道位置和走向,便于地图可视化及连通性分析。 Nodes(节点):标记廊道关键点(起点/终点/交汇点),为保护策略制定提供依据。 典型应用场景包括: 山地物种(如大熊猫)栖息地

走向CTO的路上... 1312

深入理解Linux虚拟内存与物理内存的映射机制

在Linux系统中,虚拟内存是一个非常重要的概念,它让每个进程都认为自己拥有独立的4GB(32位系统)内存空间。只有当子进程尝试修改数据时,操作系统才会真正复制数据到新的物理内存,并更新子进程的页表。当访问尚未加载的虚拟地址时,会触发缺页中断,操作系统再加载相应的内存页。虚拟地址空间是进程视角的内存视图,每个进程都有自己的虚拟地址空间,这使得不同进程可以使用相同的虚拟地址而不会冲突。页表中记录了每个内存区域的访问权限,当程序尝试非法访问(如向只读区域写入数据)时,操作系统会阻止这种操作。

FrostfireStag78的博客 348

深入理解虚拟内存机制(转载)

现代操作系统了提供了一种对主存的抽象概念,叫做虚拟内存。它为每个进程提供了一个非常大的,一致的和私有的地址空间。

小小的手心 622

YOLOv11改进,YOLOv11添加DCNv4可变性卷积(windows系统成功编译),二次创新C3k2结构,全网最详细教程

引入了可变形卷积 v4 (DCNv4),这是一种为广泛视觉应用设计的高效且有效的操作算子。DCNv4通过两项关键增强解决了其前身DCNv3的局限性:1. 移除空间聚合中的softmax归一化,以增强其动态特性和表达能力;2. 优化内存访问以最小化冗余操作,从而加速计算。这些改进使得DCNv4相比DCNv3显著加快了收敛速度,并且处理速度大幅提升,前向传播速度超过三倍。DCNv4在多个任务中表现出色,包括图像分类、实例和语义分割,特别是在图像生成方面表现突出。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 2622

【Linux 基础知识系列:第二百零五篇】理解 Linux 虚拟内存机制

本文系统介绍了Linux虚拟内存的核心概念与实践应用。从开发运维视角阐述了虚拟内存的重要性,包括延迟分配机制、swap监控和实时程序优化等场景。通过5张图讲解了虚拟地址空间、物理页、页表、交换分区和缺页中断等核心概念,并提供了10分钟搭建实验环境的指南。重点展示了vmstat监控、内存压测、PSS/RSS/USS分析、swap调优和缺页中断统计等实用案例,最后给出监控建议、调优技巧和排错方法。掌握这些知识能准确评估内存使用情况,快速定位swap风暴,优化实时系统性能,解决生产环境中的内存问题。

望获实时Linux系统 1070

OpenAI的Whisper模型

OpenAI的Whisper自动语音识别(ASR)模型的高性能推理:无依赖关系的纯C/C++实现Apple Silicon一流公民-通过ARM NEON、Accelerate框架、Metal和Core ML进行优化对x86体系结构的AVX内部支持对POWER体系结构的VSX内部支持F16/F32混合精度支持4位和5位整数量化运行时内存分配为零支持仅CPU推理NVIDIA的高效GPU支持通过CLBlast部分支持OpenCL GPUOpenVINO支持C型API支持的平台:Mac操作系统(Intel和Arm)iOS安卓java语言Linux/FreeBSDWebAssemblyWindows(MSVC和MinGW]树莓派码头工人该模型的整个高级实现包含在whirsper.h和whirsper.cpp中。其余代码是ggml机器学习库的一部分。拥有这种轻量级的模型实现可以很容易地将其集成到不同的平台和应用程序中。举个例子,这里有一段在iPhone 13设备上运行该型号的视频——完全离线

【计算机组成原理回顾】理解虚拟内存机制

推荐阅读 计算机底层知识拾遗(一)理解虚拟内存机制 虚拟内存主要提供了3个能力: 给所有进程提供一致的地址空间,每个进程都认为自己是在独占使用单机系统的存储资源 保护每个进程的地址空间不被其他进程破坏,隔离了进程的地址访问 根据缓存原理,上层存储是下层存储的缓存,虚拟内存把主存作为磁盘的高速缓存,在主存和磁盘之间根据需要来回传送数据,高效地使用了主存 虚拟地址和物理地址 对于每个进...

Gin.TaMa的博客 1427
上一篇: 位运算之不使用任何比较判断比较两个数大小问题
下一篇: Linux虚拟地址空间布局以及进程栈和线程栈总结
FreeeLinux
博客等级 码龄10年 421粉丝 356原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值