007真人007真人

007真人007真人

linux 内存是后台开发人员,需求深化了解的核算机资源。合理的运用内存,有助于提高机器的功能和稳定性。本文首要介绍 linux 内存安排结构和页面布局,内存碎片发生原因和优化算法,linux 内核几种内存办理的办法,内存运用场景以及内存运用的那些坑。从内存的原理和结构,到内存的算法优化,再到运用场景,去探寻内存办理的机制和奥妙。

一、走进 linux 内存

1、内存是什么?

1)内存又称主存,是 CPU 能直接寻址的存储空间,由半导体器材制成

2)内存的特点是存取速率快

2、内存的效果

1)暂时寄存 cpu 的运算数据

2)硬盘等外部存储器交流的数据

3)保证 cpu 核算的稳定性和高功能

二、 linux 内存地址空间

1、linux 内存地址空间 Linux 内存办理全貌

2、内存地址——用户态&内核态

  • 用户态:Ring3 运转于用户态的代码则要遭到处理器的许多
  • 内核态:Ring0 在处理器的存储维护中,核心态
  • 用户态切换到内核态的 3 种方法:体系调用、反常、外设中止
  • 差异:每个进程都有彻底归于自己的,独立的,不被搅扰的内存空间;用户态的程序就不能随意操作内核地址空间,具有必定的安全维护效果;内核态线程同享内核地址空间;

3、内存地址——MMU 地址转化

  • MMU 是一种硬件电路,它包括两个部件,一个是分段部件,一个是分页部件
  • 分段机制把一个逻辑地址转化为线性地址
  • 分页机制把一个线性地址转化为物理地址

4、内存地址——分段机制

1) 段选择符

  • 为了便利快速检索段选择符,处理器供给了 6 个分段寄存器来缓存段选择符,它们是: cs,ss,ds,es,fs 和 gs
  • 段的基地址(Base Address):在线性地址空间中段的开端地址
  • 段的边界(Limit):在虚拟地址空间中,段内能够运用的最大偏移量

2) 分段完成

  • 逻辑地址的段寄存器中的值供给段描述符,然后从段描述符中得到段基址和段边界,然后加上逻辑地址的偏移量,就得到了线性地址


5、内存地址——分页机制(32 位)

  • 分页机制是在分段机制之后进行的,它进一步将线性地址转化为物理地址
  • 10 位页目录,10 位页表项, 12 位页偏移地址
  • 单页的巨细为 4KB

6、用户态地址空间

  • TEXT:代码段可执行代码、字符串字面值、只读变量
  • DATA:数据段,映射程序中现已初始化的全局变量
  • BSS 段:寄存程序中未初始化的全局变量
  • HEAP:运转时的堆,在程序运转中运用 malloc 请求的内存区域
  • MMAP:同享库及匿名文件的映射区域
  • STACK:用户进程栈

7、内核态地址空间

  • 直接映射区:线性空间中从 3G 开端最大 896M 的区间,为直接内存映射区
  • 动态内存映射区:该区域由内核函数 vmalloc 来分配
  • 永久内存映射区:该区域可拜访高端内存
  • 固定映射区:该区域和 4G 的顶端只要 4k 的隔离带,其每个地址项都服务于特定的用处,如: ACPI_BASE 等

8、进程内存空间

  • 用户进程一般状况只能拜访用户空间的虚拟地址,不能拜访内核空间虚拟地址
  • 内核空间是由内核担任映射,不会跟着进程改变;内核空间地址有自己对应的页表,用户进程各自有不同额页表