操作系统之内存
程序要执行那么必须得将程序装入到内存才能执行
程序装入的三种方式
- 绝对装入:在编译的时候,编译程序将产生绝对地址的目标代码,装入程序按照装入模块中的地址,将程序和数据装入内存。
- 可重定位装入:指令中的地址都是相对于装入内存位置起始地址的逻辑地址,可以根据内存的情况来确定基址,然后将逻辑地址变换为物理地址
- 动态重定位:将程序装入内存之后,并不会立即把逻辑地址转换为物理地址,把地址转换推迟到程序真正运行的时候才进行
交换技术
当程序的大小超过物理内存的时候,程序无法完全装入物理内存的情况下该怎么办?
为了解决这个问题引入了交换技术。
交换技术的思想就是,当内存空间紧张的时候,系统将内存中某些进程暂时换出内存(暂时换出外存等待的进程状态为挂起状态),把外存中某些已具备运行条件的进程换入内存(进程在内存与磁盘之间动态调度)。
那么又引入了三个问题:
-
应该什么位置保存被换出的进程?
-
什么时候应该交换?
-
应该换出哪些进程?
-
将磁盘空间分为文件区和对换区两个部分。对换区为了追求换入换出的速度,采用连续分配方式,文件区追求空间利用率,采用离散分配方式
-
交换通常在内存不足的时候进程
-
优先换出阻塞进程,然后可以换出优先级低的进程
-
注意:PCB会常驻内存,不会被换出到外存
内存管理
连续分配管理
单一连续分配
内存被分为系统区和用户区,内存中只有一道用户程序放到用户区域执行。
优点是没有外部碎片(值得是没有被分配给相应进程的内存空间)
缺点是有内部碎片(指的是分配给相应进程但是没有被利用到的空间)
固定分区分配
为了满足多道程序的需要:将内存空间分为多个区域来分别运行不同的程序。
- 分区大小相等
- 分区大小不等
优点:无外部碎片
缺点:会产生内部碎片
动态分区分配
不会预先划分内存分区,而是在进程装入内存时,根据进程大小动态地建立分区。
没有内部碎片,但是有外部碎片,可以通过紧凑技术来解决外部碎片。
动态分区分配算法:
- 首次适应算法:空闲分区以地址递增次序排列,每次从低地址查找,找到第一个能满足大小的空闲分区
- 最佳适应算法:按照容量递增次序连接,每次分配内存时顺序查找空闲分区链(或者空闲分区表),找到大小能满足要求的第一个空闲分区
- 最坏适应算法:和最佳相反
- 邻近适应算法:空闲分区以地址递增的顺序排列,每次分配内存时从上次查找结束的位置开始查找空闲分区链(或者空闲分区表)找到大小能满足要求的第一个空闲分区。
分页存储
将内存空间分为一个个大小相等的分区(通常4KB),每个分区就是一个页框,
操作系统以页框为单位为各个进程分配内存空间。进程每一个页面放到一个叶框当中。
为了知道进程中每个页面在内存中存放的位置,操作系统要为每个进程建立一张页表。问题:计算每个页表项占多少个字节:
由于页表项连续存放,因此页号可以使隐含的,不占存储空间。
如何确定一个逻辑地址对应的页号、页内偏移量?
快表
根据局部性原理,我们可以将页表中访问频繁的数据放到快表当中(TLB,又称为联想寄存器,是一种访问速度比内存快很多的高速缓存)。
单级页表存在的问题:页表必须连续存放,当页表很大的时候,需要占用很多个连续的页框。
没有必要让整个页表常驻内存,因为进程在一段时间内可能只需要访问几个特定的页面。
基本分段存储管理
进程的地址空间,按照程序自身的逻辑关系划分为若干个段,每个段都有一个段名(在低级别语言中,程序员使用段名来编程)参考资料:
王道考研