历程
发展历程 | 优点 | 缺点/改进 |
---|---|---|
1.CPU直接读取物理内存 | 进程B可能会操作进程A的内存空间——进程间内存地址无隔离 | |
2.引入虚拟内存 | 保护模式(隔离、底层非透明) 内存隔离——相同虚拟地址操作不同物理地址 内存共享——不同虚拟地址操作相同物理地址 |
需要地址映射机制 |
3.引入内存分段 | 1. 按逻辑分段(读写属性):代码段、数据段、栈段、堆段等固定个数 1. 段内地址连续、段外地址不连续 |
1. 内存碎片 问题产生原因 1. 内存交换效率低 问题产生原因 |
4.引入内存交换 | 解决内存碎片问题—将不用内存保存磁盘 swap | |
5.引入分页机制 | 解决内存分段的弊端(内存碎片、内存交换) | 页表太大 |
6.引入多页机制 | ||
7.段页式内存管理 |
内存分段
分段机制
图示
- TODO 自己动手画
虚拟地址 = 段选择因子 + 段内偏移量 = 段号(0-3)+ 标志位 + 段内偏移量
段表: 段基地址 + 段界限 + 特权级DPL
MMU
问题 段表存储在哪里?
问题 为什么要引入分段机制?
问题 物理内存是连续的吗?与磁盘有什么区别和联系?
问题 为什么会产生内存碎片?
问题 为什么分段机制中的内存交换效率低?
每次交换的内存较大
分页机制
把虚拟和物理内存都分成一个固定大小的块(4kb)——即页,相当于以页为单位来操作
图示
- TODO 自己动手画
页表
页号+偏移地址
页表项 = 页号 + 物理地址
MTU
多页机制
页表项太多,存储占内存太大
单级页表:4G/4K = 2^20个页表项
多级页表:
4G/4K/1024 = 1024个页表项
缓存机制MTU中TLB
问题 哪些是常用页表项?
将常用表项直接存储,加快访问速度
问题 进程地址空间4G(32位)还是8G(64位)与linux 8G/16G内存有关系吗?
Linux内存管理
发展历程
x286是段氏管理
x386由于硬件原因,段式内存管理无法消除,故意仅分一段(即不分段)进行页式管理
图示
思考🤔 如何去用演示整个过程,如进程运行时各个分区的起始地址及存放数据地址
32位
图示
用户空间 0x0-0xbfffffff(0xc0000000-1) 3G=122^28
代码区
数据区
BSS
堆区
共享内存区
栈区
内核空间 0xc0000000-0xffffffff(0x100000000 - 1 )4G = 162^28
64位
内核空间 128T
用户空间 128T
查看file命令
为什么要区分内核空间和用户空间?
为了保证操作系统的稳定性。内核空间运行操作系统程序和驱动程序,用户空间运行应用程序。Linux以这种方式隔离了操作系统程序和应用程序,避免了应用程序影响到操作系统自身的稳定性。
所有的系统资源操作都在内核空间进行,比如读写磁盘文件,内存分配和回收,网络接口调用等。
所有进程的内核空间虚拟地址相同,指向的物理地址也相同,即所有进程的内核空间都是同一个。