linux内存管理

地址空间

请添加图片描述

  • 代码区(Text Segment):代码区包含了进程的可执行代码。这部分内存区域通常是只读的,以防止程序在运行时意外地修改自己的代码。代码区的大小在程序加载时确定,且在进程运行过程中保持不变。
  • 数据区(Data Segment):数据区包含了进程的全局变量和静态变量。这部分内存区域可读可写,且在程序加载时由操作系统分配。数据区可以分为两个子区域:
    a. 已初始化数据区:存储程序中已初始化的全局变量和静态变量。
    b. 未初始化数据区(BSS, Block Started by Symbol):存储未初始化的全局变量和静态变量。操作系统会在程序加载时将这部分内存区域清零。
  • 堆区(Heap Segment):堆区是用于存储动态分配的内存。程序在运行时可以通过内存管理函数(如C语言中的malloc和C++中的new)在堆区动态分配和释放内存。堆区内存由操作系统管理,堆区的大小在进程运行过程中可以动态增长或缩小。
  • 栈区(Stack Segment):栈区用于存储函数调用过程中的局部变量、函数参数和返回地址等信息。每个线程都有自己独立的栈空间。栈区采用先进后出(LIFO)的原则进行内存分配和释放,这使得栈区的内存管理效率很高。栈区的大小在进程运行过程中可能发生变化,但通常受到一定的限制。
  • 内核空间(Kernel Space):内核空间是操作系统内核代码和数据所占用的内存区域。虽然每个进程都有自己的内核空间,但它们通常映射到相同的物理内存区域,以便操作系统能够在不同进程间共享数据和代码。

内存分页

内存虚拟化

操作系统引⼊了虚拟内存,进程持有的虚拟地址会通过 CPU 芯⽚中的内存管理单元(MMU)的映射关
系,来转换变成物理地址,然后再通过物理地址访问内存

分页概念

分⻚是把整个虚拟和物理内存空间切成⼀段段固定尺⼨的⼤⼩。这样⼀个连续并且尺⼨固定的内存空间,
我们叫⻚(Page)。在 Linux 下,每⼀⻚的⼤⼩为 4KB

请添加图片描述

虚拟地址和物理地址如何映射

在分⻚机制下,虚拟地址分为两部分,⻚号⻚内偏移。⻚号作为⻚表的索引,⻚表包含物理⻚每⻚所在
物理内存的基地址,这个基地址与⻚内偏移的组合就形成了物理内存地址

请添加图片描述

  • 页表: 页表是一种数据结构,用于存储虚拟页到物理页的映射关系。每个进程都有自己的页表,由操作系统管理。页表中的每个条目包含一个虚拟页号和对应的物理页号。当CPU访问虚拟内存时,MMU会使用页表将虚拟地址转换为物理地址。

地址转换过程

  • CPU生成一个虚拟地址。
  • MMU从虚拟地址中提取虚拟页号(VPN)和页内偏移(offset)。
  • MMU使用VPN在页表中查找对应的物理页号(PPN)。
  • MMU将物理页号(PPN)与页内偏移(offset)组合成物理地址。
  • CPU使用物理地址访问物理内存。

页面置换和缺页中断
当虚拟页尚未加载到物理内存时,发生页面缺失(page fault)。在这种情况下,操作系统需要从磁盘或其他存储设备中加载所需的虚拟页,并将其映射到物理内存。为了腾出空间,操作系统可能需要选择一个已加载的页面,将其换出到磁盘。页面置换算法(如LRU、FIFO等)用于决定哪个页面应该被换出。

多级页表

为什么要有多级页表?

在 32 位的环境下,虚拟地址空间共有 4GB,假设⼀个⻚的⼤⼩是 4KB(2^12),那么就需要⼤约 100 万
(2^20) 个⻚,每个「⻚表项」需要 4 个字节⼤⼩来存储,那么整个 4GB 空间的映射就需要有 4MB
的内存来存储⻚表。
这 4MB ⼤⼩的⻚表,看起来也不是很⼤。但是要知道每个进程都是有⾃⼰的虚拟地址空间的,也就说都有
⾃⼰的⻚表。
那么, 100 个进程的话,就需要 400MB 的内存来存储⻚表,这是⾮常⼤的内存了,更别说 64 位的环
境了。

  • ⻚表(⼀级⻚表)分为 1024 个⻚表(⼆级⻚表),每个表(⼆级⻚表)中包含 1024 个「⻚表项」,形成⼆级分⻚
  • 如果某个⼀级⻚表的⻚表项没有被⽤到,也就不需要创建这个⻚表项对应的⼆级⻚表了,即可以在需要时才创建⼆级⻚表。
  • 假设只有 20% 的⼀级⻚表项被⽤到了,那么⻚表占⽤的内存空间就只有 4KB(⼀级⻚表) + 20% *
    4MB(⼆级⻚表)= 0.804MB。每个层次都有自己的页表,只有在需要时才会分配。这样可以大大减少内存开销。
快表(TLB)

概念

最常访问的⼏个⻚表项存储到访问速度更快的硬件,于是计算机科学家们, 就在 CPU 芯⽚中,加⼊了⼀个专⻔存放程序最常访问的⻚表项的Cache,这个 Cache 就是 TLB (Translation Lookaside Buffer) ,通常称为⻚表缓存、转址旁路缓存、快表

作用
请添加图片描述

  • 当MMU需要转换一个虚拟地址时,它首先检查TLB是否包含所需的映射。如果TLB中存在映射,MMU可以避免访问内存中的页表,从而加速地址转换过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值