文章目录
一.内存的基础知识
编译:由编译程序将用户源代码编译成若干目标模块(编译就是把高级语言翻译成机器语言).c->.o
链接:由链接程序将编译后形成的一组目标模块,以及所需要的函数链接在一起,形成一个完整的装入模块.o->.exe
装入(装载):由装入程序将装入模块装入内存运行。(由逻辑地址变成物理地址)
装入的三种方式
方式 | 逻辑地址到物理地址的转换 |
---|---|
绝对装入 | 编译时将逻辑地址转换成物理地址 |
静态重定位 | 装入时将逻辑地址转换成物理地址 |
动态重定位 | 运行时将逻辑地址转换为物理地址,需要设置一个重定位寄存器 |
装入程序属于操作系统
方式 | 负责 |
---|---|
绝对装入 | 编译器 |
静态重定位 | 操作系统 |
动态重定位 | 操作系统 |
绝对装入
所以在.o文件(机器语言)中的地址就已经是物理地址。
缺点
- 绝对装入只适用于单道程序环境
- 程序中使用的绝对地址可以在编译或者汇编的时候给出,也可以由程序员直接赋予。
静态重定位
缺点
- 一个作业装入内存时,必须分配其要求的全部内存空间。如果没有足够的内存,就不能装入作业。
- 作业一旦装入内存后,在运行期间就不能移动,也不能再申请内存。
动态重定位
在运行时,物理地址是重定位寄存器中的值加上逻辑地址
优点
- 可以将程序分配到不连续的存储区中
- 在运行前只需要装入部分代码就可以投入运行
- 在程序运行期间,根据需要,动态申请分配内存
- 允许程序在内存中发生移动
装入的三种方式
静态链接
装入时动态链接
运行时动态链接
二、内存管理的概念
三、覆盖与交换
覆盖 | 交换 |
---|---|
对于同一程序或者进程 | 不同进程(作业)之间 |
覆盖技术
思想:将程序分成多个段,常用的段常驻内存,不常用的段在需要时调入内存。
固定区 | 覆盖区 |
---|---|
常驻的内存放在固定区,调入后不再调出 | 需要用到时调入内存 |
交换技术
思想:内存空间紧张时,系统将内存中某些进程暂时换出外存,把外存中某些已经具备运行条件的进程换入内存(中级调度:进程在内存与磁盘间的动态调度)
PCB会常驻内存,不会被换出。
四、连续分配管理方式
连续分配:指为一个进程分配的必须是一个连续的内存空间
1.单一连续分配
2.固定分区分配
1)分区大小相等
2)分区大小不相等
3.动态分区分配
每次都分配第一个空前区(第一个最大,都无法满足的话,后面的都没有办法满足)
4.碎片
内碎片 | 外碎片 |
---|---|
分配给某进程的内存区域中,有些部分没有用上 | 内存中的某些空闲分区由于太小而难以利用 |
四、非连续分配管理方式
1.基本分页存储管理
1)如何实现地址转换
2)基本地址的变换
3)局部性原理
时间局部性 | 空间局部性 |
---|---|
如果执行了程序的某条指令,那么不久之后这条指令很可能会被再次执行;如果某个数据被访问过,不久之后该数据可能再次被访问。(程序中存在大量循环) | 一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很可能被访问。(很多数据在内存中连续存放) |
4)快表(TLB)
5)两级页表
1.基本分段存储管理
方便程序员
1)段表
页表 | 段表 |
---|---|
建立各个逻辑页面到实际的页框中的关系 | 记录各个逻辑段到实际物理内存中的存放位置 |
3.段页式