VxWorks 7系统RAM增量加载压力测试及malloc内存分配失效问题咨询
VxWorks 7内存压力测试问题解决与术语说明
为什么memShow看不到内存变化?
VxWorks 7默认启用虚拟内存管理(VMM),malloc()仅分配虚拟地址空间,不会立即映射物理内存。只有当你实际写入/读取该内存区域时,才会触发缺页中断,系统才会分配对应的物理页。你的代码里的循环赋值可能被编译器优化,或者部分页未被实际访问,导致物理内存没被分配,memShow(默认统计物理内存使用)自然看不到变化。
修正后的内存压力测试代码
要确保物理内存被实际分配,需保证每个虚拟内存页被访问,同时避免编译器优化。以下是优化后的代码:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/mman.h> void memoryIntensiveFunction() { const size_t BLOCK_SIZE = 100 * 1024 * 1024; char *largeMemoryBlock = malloc(BLOCK_SIZE); if (largeMemoryBlock == NULL) { perror("内存分配失败"); return; } // 用memset填充整个内存块,强制触发所有页的物理内存映射 memset(largeMemoryBlock, 0xAA, BLOCK_SIZE); // 可选:锁定内存,防止被换出(若系统配置交换区) if (mlock(largeMemoryBlock, BLOCK_SIZE) != 0) { perror("内存锁定失败"); } sleep(1800); // 测试结束后释放资源 munlock(largeMemoryBlock, BLOCK_SIZE); free(largeMemoryBlock); } int main() { memoryIntensiveFunction(); return 0; }
编译时需禁用编译器优化,避免内存操作被删除:
cc -O0 -o mem_stress mem_stress.c
关键内存术语解析
- 虚拟内存:VxWorks 7为进程提供的独立地址空间,
malloc分配的是虚拟地址,而非直接的物理RAM。虚拟地址需通过MMU映射到物理内存页后才能实际使用。 - 物理内存:系统的实际硬件RAM,memShow工具默认统计的是这部分内存的使用情况。
- 缺页中断:当进程访问未映射到物理内存的虚拟地址时触发的系统中断,此时系统会分配物理页并建立映射关系。
- 内存锁定(mlock):将虚拟内存页固定到物理内存中,防止被交换到磁盘,确保内存始终驻留物理RAM,适合压力测试场景。
- 编译器优化:若编译器检测到内存操作无实际业务用途,可能会删除相关代码,导致内存未被实际访问,进而无法触发物理内存分配。
内容的提问来源于stack exchange,提问作者Petra Miehr
相关产品推荐
相关产品推荐

