内存

三种装入方式:(装入后形成物理地址)

①绝对装入:按照装入模块中的地址,将程序和数据装入。逻辑地址和物理地址完全相同。
②静态重定位装入:装入时确定地址。装入程序负责修改地址
③动态重定位:编译连接后装入模块的地址从0开始。装入内存后,不会立即把逻辑逻辑地址转换为物理地址。而是把地址转换推迟到指针运行时。允许程序在内存中发生移动;重定位寄存器;(装入时,不修改逻辑地址,运行时,逻辑地址 + 寄存器中存储的起始地址)

链接的三种方式(形成完整的逻辑地址):

①静态链接:在程序运行前,将目标模块及他们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。
②装入时动态链接:边装入边链接的链接方式。
③运行时动态链接:在程序执行时需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。

二、内存管理

image
1、操作系统负责内存空间的分配和回收
2、操作系统通过某种技术对内存进行扩充
3、操作系统需要提供地址转换功能,逻辑地址->物理地址,
4、操作系统负责内存保护功能,保证各进程在各自存储空间内运行,互不干扰
存储保护:①设置上下限寄存器 ②重位寄存器+界地址寄存器
image

1、内存控件的分配回收

2、内存空间的扩充

3、地址转换

4、存储保护

2.1 内存空间的分配管理

image
连续分配:为用户进程分配的必须是一个连续的内存空间

2.1.1 连续分配管理方式

2.1.1.1 单一连续分配

image
内部碎片:分配给某进程的内存区域中,如果有些部分没有用上,“内部碎片”。

2.1.1.2 固定分区分配

image
image

2.1.1.3 动态分区分配

不预先划分内存分区,而是在进程装入内存时,根据进程的大小动态建立分区,并使分取的大小正好适合进程的需要。因此系统的分区大小和数目是可变的的。

①用什么样的数据结构记录内存使用情况?

两种常用数据结构:1、空闲分区表;2、空闲分区链。

②多个空闲内存都满足条件时,选择那个分区?

动态分区算法

为了解决:当有很多个空闲该如何分配。
动态分区分配算法:

①首次适应算法:

每次从低地址开始查找满足大小的空闲分区。

②最佳适应算法

空闲分区按容量递增次序链接。每次分配内存时顺序查找空闲分区链(表),找到第一个大小满足的空闲分区。缺点:外部碎片

③最坏适应算法

空闲分区按容量递减次序链接。
解决了最佳适应算法留下的外部碎片问题。对之后大的进程不友好

④邻近适应算法

首次适应算法每次都从链头查找。导致低地址出现很多小的空闲分区,再次查找时,需要经过这些分区,增加查找开销。改为每次都从上次查找位置开始检索。
问题:高地址大分区有可能被用完。

③如何对分区分配和回收(更新表链)

合并、增加
内部碎片:分配给某进程的内存区域中,如果有些部分没有用上;
外部碎片:是指内存中的某些空闲分区由于太小而难以利用。

2.1.2 非连续分配管理方式

image
非连续分配:为用户进程分配的可以是一些分散的内存空间。

2.1.2.1 基本分页存储管理

思想:把内存分为一个个相等的小分区,再按照分区大小将进程拆分为一个个小部分
页框 = 页帧 = 内存块 = 物理块
页框号 = 页帧号 = 内存块号 = 物理块号(从0开始)
用户进程也分为与页框大小相等的一个个区域,称为:页==页面(页号,从0开始)
各个页面不必连续存放,也不必按先后顺序,可以放到不相邻的各个页框中。
难点:将进程地址空间分页后,操作系统如何实现逻辑地址-->物理地址的转换
image
物理地址 = 页面起始地址 + 页内偏移地址
页号 = 逻辑地址 / 页面长度(取整)
页内偏移量 = 逻辑地址 % 页面长度
操作系统通过某种数据结构存储 每一个页面在内存中的起始地址。
为了方便计算页号、页内偏移量,页面大小一般设置为2的整数幂。
image
image
页表:为了获取页号对应的页面起始地址
页号、页内偏移量都可以通过逻辑地址获取;页号的起始地址需要通过页表来记录
image

image

2.1.2.1.2 基本地址变换机构

基本地址变换机构:用于实现逻辑地址到物理地址转换的一组硬件。
image
PCB也是存放再系统区的。
image
地址转换过程文字描述:
image

2.1.2.1.3 具有快表的地址变换机构

image
局部性原理:
image
快表:
image
引入快表后,地址变换过程:
image
image

2.1.2.1.4 两级页表

所有页表项都连续存放在页框中,需要大量连续的存储页框。
进程在一段时间内只需要访问某几个页面就可以正常运行。没有必要让整个页表都常驻内存。
页目录表
每个页表项4B,可以整数个页表项占满一个页框。
image
image
页表项大小:4B,页框大小:4K,一个页框可以存:1024个页表项,共2^20个页表项,共需要:1024个(连续)页框。下图中的逻辑地址位32位,表示的数据单位是B
image
image
多级页表中,各级页表的大小不能超过一个页面。
个人思考:例如共2^20页,那么就至少需要20位来存储页号,也就是至少一个页表项3B大小。设置为4B。刚好页框单位也是B,单位一致,所以顶多需要12位来表示页号。
页表项大小是四个字节4B,仅仅是大小。(矛盾:页表要存如内存,页表中指向的内存块也要存入内存)

2.1.2.2 基本分段存储管理

image
image
用户编程更方便,程序可读性更高。编译程序将短命转换为段号。
逻辑地址结构 = 段号 + 段内地址
image
image
分段比分也更容易实现信息共享和保护。

2.1.2.3 段页式存储管理

image
image
image

2.2 内存空间的扩充:

2.2.1 覆盖技术:共享

2.2.2 交换技术:内存紧张时,系统将内存中某些进程暂时换出外存,把某些已具备运行条件等待进程换入内存。进程的PCB常驻内存。(中级调度)

image

2.2.3 虚拟存储技术

image
传统存储管理
image
高速缓冲技术原理:局部性原理
虚拟内存定义:
image
image

2.2.3.2 请求分页管理方式

image

2.2.3.2.1 页表机制

image

image
缺页中断是因为当前执行的指令想要访问的目标页面没有调入内存而产生的,属于内中断
image
image

2.2.3.2.2 页面置换算法

image
最佳置换算法:每次选择淘汰的页面将是以后永不使用,或者在最长时间内不再被访问的页面,这样可以保证最低缺页率。
实际应用中无法实现,因为操作系统无法提前判断页面访问序列。
先进先出置换算法:每次淘汰的页面时最早进入内存的页面。
当进程分配的物理块增多时,缺页次数不减反增--Belagy异常。
最近最久未使用置换算法
每次淘汰的页面时最近最久未使用的页面。
性能最好,需要专门硬件配合。
时钟置换算法
性能和开销比较均衡的算法。最近未用算法。
简单CLOCK算法
image
第一轮扫描后,所有的访问为都由1->0置为0,
image
进行第二轮扫描时候,一号页面为0,淘汰一号页面,6装入。
image
改进型时钟置换算法:
只有被淘汰的页面被修改过,才需要写回外存。
在其他条件相同时,优先淘汰没有修改过的页面。
(访问位,修改位)
image

image

页面分配策略

image

驻留集:指请求分页存储管理中给进程分配的物理块的集合。
操作系统决定给特定的进程分配几个页框。
若驻留集太小:导致频繁缺页,系统要花大量时间处理缺页。
太大:导致多道程序并发下降,资源利用率降低。
固定分配:
可变分配:驻留集大小可变。

局部置换:
全局置换:
image
上四种组合三种:
image
调入页面时机:
1、预调入策略:局部性原理。一次调入若干相邻的页面可能比依次调入一个页面更高效。但如果提前调入的页面中大多数都没有被访问过,则更低效。因此可以预测不久之后可能访问到的页面,将他们预先调入内存,。故这种策略主要用于进程的首次调入(运行前调入),由程序员指出应该调入哪部分。
2、请求调页策略:进程在运行期间发现缺页时才将所缺页面调入内存。由于每次只能调入一页,每次调页都要磁盘I/O,因此I/O开销很大。
从何调入页面:
image

抖动(颠簸)现象
image

image

posted @ 2021-05-15 19:55  点|滴  阅读(26)  评论(0)    收藏  举报