第 2 章 RHEL for Real Time 上的内存管理
实时系统使用虚拟内存系统,其中由用户空间应用引用的地址转换为物理地址。转换通过底层计算系统中的页表和地址转换硬件的组合进行。在程序与实际内存之间具有转换机制的优点是操作系统在需要时或 CPU 请求时可以交换页面。
在实时,若要从存储交换页面到主内存,之前使用的页表条目被标记为无效。因此,即使出现正常内存压力,操作系统也可以从一个应用程序检索页面,并将其提供给另一个应用程序。这可能导致无法预计的系统行为。
内存分配实现包括需求分页机制和内存锁定(mlock())系统调用。
在不同缓存和 NUMA 域中共享 CPU 的数据信息可能会导致流量问题和瓶颈。
在编写多线程应用程序时,在设计数据分类前考虑机器拓扑。Topology 是内存层次结构,包括 CPU 缓存和 Non-Uniform Memory Access (NUMA)节点。
2.1. 需求分页 复制链接链接已复制到粘贴板!
需求分页与带有页面交换的分页系统类似。系统在需要或 CPU 需求时加载存储在辅助内存中的页面。程序生成的所有内存地址都通过处理器中的地址转换机制。然后,地址从特定于进程的虚拟地址转换为物理内存地址。这称为虚拟内存。转换机制中的两个主要组件是页表,翻译的缓冲(TLB)
页面表
页面表是物理内存中的多级表,其中包含虚拟到物理内存的映射。这些映射可以被处理器中的虚拟内存转换硬件读取。
含有分配物理地址的页表条目称为常驻工作集。当操作系统需要为其他进程释放内存时,它可以从常驻工作集中交换页面。交换页面时,对该页面中的虚拟地址的任何引用都会创建页面错误,并导致页面重新分配。
当系统物理内存非常低时,交换过程将开始 thrash (持续从进程窃取页面),且永远不会允许某个进程完成。您可以通过在 /proc/vmstat 文件中查找 pgfault 值来监控虚拟内存统计信息。
翻译查找缓冲区
translation Lookaside Buffers (TLB)是虚拟内存转换的硬件缓存。任何带有 TLB 的处理器核心在启动页表条目的内存读取时并行检查 TLB。如果虚拟地址的 TLB 条目有效,则内存读取将中止,并且 TLB 中的值用于地址转换。
TLB 根据引用的本地原则进行操作。这意味着,如果代码在一段时间内处于一个内存中(如循环或调用相关的功能),则 TLB 引用避免了地址转换的主要内存。这可显著加快处理时间。
在编写确定性和快速代码时,请使用保持参考本地功能的功能。这可能意味着使用循环而不是递归。如果递归不可避免,请将递归调用放在函数的末尾。这称为 tail-recursion,这使得代码在相对较小的内存中工作,并避免从主内存调用表转换。