Linux内存管理基础实验
Linux内存管理是操作系统核心功能之一,直接影响系统性能与稳定性,通过实验深入理解内存分配、回收及监控机制,有助于优化系统资源使用,本实验从基础概念出发,结合实际操作,逐步探索Linux内存管理的奥秘。

实验环境准备
实验环境采用Ubuntu 20.04 LTS系统,内核版本为5.4.0-65-generic,通过虚拟机搭建实验平台,确保系统纯净无干扰,首先安装必要工具:sudo apt update && sudo apt install sysstat free htop valgrind。sysstat提供sar命令用于历史数据统计,valgrind用于内存泄漏检测,实验前需关闭swap分区(sudo swapoff -a),以简化内存分配逻辑。
内存分配与释放观察
使用malloc和free函数动态分配内存,并通过/proc/meminfo实时监控变化,编写C程序示例:
#include <stdlib.h>
#include <stdio.h>
int main() {
int *ptr = malloc(100 * 1024 * 1024); // 分配100MB内存
if (ptr == NULL) {
perror("malloc failed");
return 1;
}
printf("Memory allocated. Press Enter to free...");
getchar();
free(ptr);
printf("Memory freed.\n");
return 0;
}
编译运行后,通过watch -n 1 cat /proc/meminfo观察MemAvailable字段的变化,分配后可用内存减少100MB,释放后恢复,验证了动态内存管理的即时性。
内存泄漏检测
利用valgrind工具检测内存泄漏,修改上述程序,故意不释放内存:

// 省略头文件
int main() {
malloc(50 * 1024 * 1024); // 故意不释放
printf("Memory allocated without free. Press Enter to exit...");
getchar();
return 0;
}
运行valgrind --leak-check=full ./a.out,输出显示definitely lost: 50MB,明确指出泄漏位置,实验表明,未匹配的malloc会导致内存不可回收,长期运行可能引发系统性能下降。
内存映射文件探索
通过mmap系统调用实现文件与内存的映射,实验代码片段:
#include <sys/mman.h>
#include <fcntl.h>
int main() {
int fd = open("test.txt", O_RDWR);
ftruncate(fd, 4096); // 文件大小设为4KB
char *data = mmap(NULL, 4096, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
data[0] = 'A'; // 修改文件内容
munmap(data, 4096);
close(fd);
return 0;
}
使用strace跟踪系统调用,发现mmap返回的地址直接用于文件读写,避免了数据拷贝,提升了大文件处理效率。
OOM Killer机制验证
Linux在内存耗尽时会触发OOM Killer(Out of Memory Killer),通过以下步骤模拟:

- 创建脚本消耗内存:
while :; do :; done | cat > /dev/null & - 多次执行上述脚本,直至系统内存接近耗尽。
- 观察
dmesg | grep -i "killed process",显示被终止的进程及其内存占用情况,实验证实,OOM Killer会优先选择占用内存大且不重要的进程,确保系统核心服务运行。
内存优化实践
通过调整/etc/sysctl.conf参数优化内存使用:
vm.swappiness=10:减少swap使用频率,优先使用物理内存。vm.vfs_cache_pressure=50:平衡inode和dentry缓存回收速度。
执行sysctl -p使配置生效,结合free -m对比优化前后内存分配效率。
本次实验通过动态分配、泄漏检测、文件映射等场景,全面覆盖Linux内存管理的关键技术,结果表明,合理使用内存工具和参数调优,能有效提升系统稳定性,未来可进一步研究cgroups内存限制或NUMA架构下的内存分配策略,深化对操作系统底层机制的理解。



















