地址空间
- 代码区(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可以避免访问内存中的页表,从而加速地址转换过程。