本文已收录至 Github(MD-Notes),若博客中有图片打不开,可以来我的 Github 仓库:https://github.com/HanquanHq/MD-Notes,涵盖了互联网大厂面试必问的知识点,讲解透彻,长期更新中,欢迎一起学习探讨。
面试必会系列专栏:https://blog.csdn.net/sinat_42483341/category_10300357.html
操作系统系列专栏:https://blog.csdn.net/sinat_42483341/category_10519484.html
第三章 内存管理1 - 存储管理方式,段表、页表详解
第三章 内存管理
基础知识
1 Byte(字节) = 8 bit
1 字 = 16 / 32 / … bit,字由若干个字节构成,不同的机器有不同的字长。
2^10 = 1 K(千)
2^20 = 1 M(兆,百万)
2^30 = 1 G (十亿,百兆)
例如,4 GB = 4 * 2^30 bit = 2^32 bit
逻辑地址 / 物理地址
为了简化理解,本节中我们默认操作系统给进程分配的是一片连续的内存空间
装入的三种方式
1、绝对装入:编译时完成地址变换
- 编译时,如果知道程序将放到内存中的哪个位置,编译程序 将产生 绝对地址 的目标代码。
- 装入时,装入程序按照装入模块中的地址,将程序和数据装入内存。
特点:只适用于单道程序环境。
2、静态重定位:装入时完成地址变换
- 编译、链接后的装入模块的地址都是 从 0 开始 的 逻辑地址。
- 装入时,根据内存的当前情况,对地址进行 重定位,将 逻辑地址 变换为 物理地址。
特点:一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。作业一旦进入内存,在运行期间不能再移动,也不能再申请内存空间。
3、动态重定位:运行时才进行地址变换表(普遍使用)
- 编译、链接后的装入模块的地址都是 从 0 开始。
- 执行时,才将 逻辑地址 转换为 物理地址。这种方式需要 重定位寄存器 的支持。
特点:允许程序在内存中发生移动。
从写程序到程序运行
- 编译:由编译程序将用户源代码编译成若干个目标模块(编译就是把高级语言翻译为机器语言)
- 链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块
- 装入(装载):由装入程序将装入模块装入内存运行
链接的三种方式
- 静态链接:程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。
- 装入时动态链接:将各目标模块装入内存时,边装入边链接。
- 运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。便于修改、更新、共享模块。
内存管理
内存空间的分配与回收
覆盖技术(只用于早期的操作系统)
思想:将程序分为多个段(多个模块)。常用的段常驻内存,不常用的段在需要时调入内存。
内存中分为一个 固定区 和若干 覆盖区