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