目录
内存
内存:用于存放数据的硬件(程序执行前需要先放到内存中才能被CPU处理)
物理地址(绝对地址)与逻辑地址(相对地址)
虚拟内存地址(Virtual Memory Address):我们程序所使⽤的内存地址
物理内存地址(Physical Memory Address):实际存在硬件⾥⾯的空间地址
内存分段‘
分段基本概念
由于程序是由若⼲个逻辑分段组成的,如可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属 性的,所以就⽤分段(Segmentation)的形式把这些段分离出来
分段机制下的虚拟地址由段选择⼦和段内偏移量组成
(1)段选择子
①保存在段寄存器⾥
②段选择⼦⾥⾯最重要的是段号,⽤作段表的索引
③段表⾥⾯保存的是这个段的基地址、段的界限和特权等级等
(2)段内偏移量
虚拟地址中的段内偏移量应该位于 0 和段界限之间,如果段内偏移量是合法的,就将段基地址加上段内偏移量得到物理内存地址
虚拟地址是通过段表与物理地址进⾏映射的,分段机制会把程序的虚拟地址分成 4 个段, 每个段在段表中有⼀个项,在这⼀项找到段的基地址,再加上偏移量,于是就能找到物理内存中的地址 ,如下图:
如果要访问段 3 中偏移量 500 的虚拟地址,我们可以计算出物理地址为,段 3 基地址 7000 + 偏移量 500 = 7500
内存分段缺点:
①内存碎片问题
②内存交换率低
内存碎片问题
假设有 1G 的物理内存,⽤户执⾏了多个程序
游戏占⽤了 512MB 内存
浏览器占⽤了 128MB 内存
⾳乐占⽤了 256 MB 内存
这个时候,如果我们关闭了浏览器,则空闲内存还有 1024 - 512 - 256 = 256MB。
如果这个 256MB 不是连续的,被分成了两段 128 MB 内存,这就会导致没有空间再打开⼀个 200MB 的程序