Linux性能优化—内存实战篇

本文深入探讨Linux内存工作原理,包括内存映射、虚拟内存空间分布及内存分配与回收。讲解了如何通过多级页表和大页解决页表项过多的问题,以及malloc和mmap在内存分配中的作用。此外,还分析了Linux内核如何通过Buffer和Cache优化磁盘I/O,以及如何使用free和top命令查看内存使用情况。
摘要由CSDN通过智能技术生成

一、Linux内存工作原理

相关视频讲解:

深入讲解Linux内核内存管理(第一节)

深入讲解Linux内核内存管理( 第二节)

Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈

1,内存映射

  Linux内核给每个进程都提供了一个独立的虚拟空间,并且这个地址空间是连续的。这样,进程就可以很方便地访问内存,更确切地说是访问虚拟内存。

  虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同字长(也就是单个CPU指令可以处理数据的最大长度)的处理器,地址空间的范围也不同。比如常见的32位和64位系统

  • 32位系统的内核空间占用1G,位于最高处,剩下的3G是用户空间

  • 64位系统的内核空间和用户空间都是128T,分别占据整个内存空间的最高处和最低处,剩下的中间部分是未定义的。

  进程在用户态时,只能访问用户空间内存;只有进入内核态后,才可以访问内核空间内存。虽然每个进程的地址空间都包含了内核空间,但这些内核空间其实关联的都是相同的物理内存。这样,进程切换到内核态后,就可以很方便地访问内核空间内存。既然每个进程都有一个这么大的地址空间,那么所有的虚拟内存加起来,自然要比实际的物理内存大很多。所以,并不是所有的虚拟内存都会分配物理内存,只有那些实际使用的虚拟内存才分配物理内存,并且分配后的物理内存,是通过内存映射来管理的。

  内存映射,其实就是将虚拟内存地址映射到物理内存地址。为了完成内存映射,内核为每个进程都维护了一张页表,记录虚拟地址与物理地址的映射关系:

  页表实际上存储在CPU的内存管理单元MMU中,正常情况下,处理器就可以直接通过硬件找出访问的内存。而当进程访问的内存地址在页表中查不到时,系统会产生一个缺页异常,进入内核空间分配物理内存、更新进程页表,最后在返回用户空间,恢复进程的运行。

  TLB(Translation Lookaside Buffer,后备缓冲器)会影响CPU的内存访问性能:TLB其实就是MMU中页表的高速缓存。由于进程的虚拟地址空间是独立的,而TLB的访问速度又比MMU快很多,所以,通过减少上下文切换,减少TLB的刷新次数,就可以提高TLB缓存的使用率,进而提高CPU的内存访问性能。

  MMU规定了一个内存映射的最小单位,也就是页,通常是4KB。每次内存映射,都需要关联4KB或者4KB整数倍的内存空间。由于页的大小只有4KB,导致的整个页表会变的非常大。例如:32位系统就需要100多万个页表项(4GB/4KB),才可以实现整个地址空间的映射。为了解决页表项过多的问题,Linux提供了两种机制:多级页表 和 大页(HugePage)

多级页表:把整个内

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值