linux 内存管理详解

linux 内存管理详解

内存管理概览

  • 物理页管理系统通过buddy算法提供(4kb...1024 * 4kb,,这里默认页大小为4kb)物理页申请,使用,释放功能。
  • MMU提供虚拟内存转化为物理内存的功能,LTB(这里的缓存是存在cpu中的一级,二级,三级缓存中)里存放的是多级页表的缓存,如果缓存没有命令,则需要重新从内存中加载。TLB表中有进程id的标识,这样就能保证不同进程可以独立使用完成的虚拟空间
  • 进程内存管理 用来控制当前进程的内存使用分布,可以通过brk,sbrk系统调用函数来调整进程堆空间的大小,可以使用mmap,ummap来申请指定大小的内存空间供应用程序使用。
  • 虚拟内存管理是基于mmap,ummap又加了一层内存管理模块,用来专门为应用层提供频繁进行内存申请与释放的高性能内存管理模块。因为每次调用mmap,ummap实际上都会触发进程内存管理,mmu,物理页管理系统运行,比较耗时,不利于频繁进程内存申请与释放。故先通过mmap提前申请一大块内存,然后在慢慢的使用。

1 linux 申请与访问过程

1.1 内存申请与访问过程

1.2 大页内存使用

使用大页内存可以明显提高内存访问的性能,主要是通过大幅度降低大页列表长度以及提高TLB缓存命令率方式。

shell 复制代码
# 查看CPU是否支持大页
$ grep -i huge /proc/cpuinfo
$ grep pdpe1gb /proc/cpuinfo  # 检查1GB大页支持

# 查看当前大页配置
$ cat /proc/meminfo | grep -i huge
HugePages_Total:       0      # 已配置大页总数
HugePages_Free:        0      # 空闲大页数
HugePages_Rsvd:        0      # 预留大页数
HugePages_Surp:        0      # 超额大页数
Hugepagesize:       2048 kB   # 大页大小

# 创建挂载点
$ sudo mkdir -p /mnt/huge
$ sudo mkdir -p /mnt/huge_1GB

# 挂载2MB大页文件系统
$ sudo mount -t hugetlbfs -o pagesize=2MB none /mnt/huge

# 挂载1GB大页文件系统
$ sudo mount -t hugetlbfs -o pagesize=1GB none /mnt/huge_1GB

# 永久挂载(/etc/fstab)
none    /mnt/huge    hugetlbfs   pagesize=2MB   0   0
none    /mnt/huge_1GB hugetlbfs   pagesize=1GB   0   0

# 验证挂载
$ mount | grep huge

匿名映射或文件映射使用大页内存
# 匿名映射
addr = mmap(NULL, SIZE,
                   PROT_READ | PROT_WRITE,
                   MAP_PRIVATE | MAP_ANONYMOUS,
                   -1, 0);
# 文件映射
addr = mmap(NULL, SIZE, PROT_READ | PROT_WRITE, 
                MAP_SHARED, fd, 0);

内存使用情况查看

查看当前系统页内存的使用情况

cat /proc/buddyinfo

后面11列分别表示页的个数(1,2,4, 8, 16,32,...1024)未使用的内存。

查看当前进程的堆空间使用情况

pmap {pid}

其中[anon]表示 堆空间的使用情况。

相关推荐
量子炒饭大师16 小时前
【Linux系统编程】——【从0构建第一个Linux系统-进度条】从0到1分阶段构建动态进度条
linux·运维·服务器·进度条
.千余17 小时前
【Linux】网络基础2---Socket编程预备
linux·网络·php
曦月合一17 小时前
在CentOS 6.5系统中OpenJDK 1.7升级更新 OpenJDK 1.8,并部署
linux·centos·jdk1.8
小小ken17 小时前
virtualbox中的ubuntu虚拟机登录到桌面后出现屏幕闪烁现象解决办法
linux·运维·ubuntu
UCloud_TShare17 小时前
告警至处置的自动化鸿沟:AI Agent 的破局思路探索
运维·人工智能·自动化
tianyuanwo17 小时前
Linux社区ISO制作底层探秘:从mkisofs到xorriso的全面解析
linux·mkisofs·xorriso
xiaoye-duck17 小时前
《Linux系统编程》Linux基础开发工具 (三):从零实现动态进度条(附回车、换行与缓冲区详解)
linux
cui_ruicheng17 小时前
Linux网络编程(四):UDP Socket基础编程
linux·服务器·网络·udp
用户23678298016817 小时前
Linux more 命令详解:从基础分页到高级文本查看技巧
linux
sunlifenger17 小时前
构筑绿色能源数字底座,风光一体化智慧电站整体解决方案
服务器·网络·能源