本文内容来自我自己的笔记软件,所有跳转链接都为无效链接 (懒得调)
笔记内容来源与考研书籍和自己写过的一些简单项目结合
如若有疑问或者想询问可以+Q1403145273
内存管理基本功能 :: 内存的分配与回收,地址转换,内存扩充,内存共享,存储保护
源代码变成可执行文件的过程 :: 编译(有编译程序将源代码编译成若干目标模块),链接(将模块以及所需的库函数链接在一起,形成一个完整的模块),装入(由装入程序(可执行程序)装入内存运行)
链接方式 :: 静态链接(在程序运行之前就所有模块链接,在运行时整个程序的最大逻辑地址是固定的),装入时动态链接(装入内存时才链接,在装入前模块没有逻辑地址,装入后就有了),运行时动态链接(运行时需要用到的模块才会生成逻辑地址,没用到的模块没有逻辑地址)
绝对装入
适合单道系统,链接时用到就是物理地址,不可改变模块位置
可重定位装入
链接使用逻辑地址,在装入后将逻辑地址更改位物理地址
内存分配必须连续 且 必须分配足够的内存
运行时,模块进入内存就不可移动,不能再申请空间
动态运行时装入
链接和装入后都不用物理地址,使用相对地址
在真正执行模块时通过重定位寄存器+逻辑地址 寻找 物理地址
运行时不需要连续的内存空间,可以动态申请所需内存
动态链接与程序的逻辑结构有关,所以分段存储管理更有利(不代表分页和连续分配不能用动态链接)于动态链接
进程映像(由程序段,相关数据段,PCB构成)
程序段 :: 代码段(存放指令和可执行机器码),数据段(存放全局初始化(静态)变量),BSS段(存放全局未初始化(静态)变量),只读数据段(存放常量,整数常量直接嵌入代码段)
相关数据段 :: 数据栈(存放局部变量),数据堆(存放动态动态分配数据)
可重入编码(一种允许多进程同时访问的代码.不允许进行修改)属于(共享)程序段
内存保护 :: 设置上下限寄存器,采用重定位寄存器和界地址寄存器(限长寄存器,包含逻辑地址的最大值)
内存共享 :: 可重入编码一种允许多进程同时访问的代码. 不允许进行修改属于(共享)程序段
内存扩充(新版已删覆盖和交换)
覆盖技术
将程序分为多个段(模块),常用的段常驻内存,不常用的段需要时才调入内存
内存分为 一个固定区 和 若干个覆盖区(互斥的模块共享一个覆盖区)
打破了必须全部装入内存才能运行的限制
必须有程序员来声明覆盖结构(类似union)对用户不透明(使用者能够使用,透明则为使用者不能使用)
交换技术
将进程移动到外存(挂起态) 内存调度
将磁盘空间分为文件区(追求存储空间利用率,主要用于存储,空间占比大,离散分配)和对换区(追求与内存的交换速度,主要用于数据,空间占比小,连续分配)
换出技术不会把PCB换出
虚拟存储技术
目的 :: 方便用户 和 提高内存利用率
单一连续分配
内存分为系统区(仅供操作系统,通常低地址)和用户区(只有一个用户程序独占,用于单道程序),使用覆盖技术
简单,无外部碎片,无需内存保护
单道,有内部碎片,存储利用率低
固定分区分配
通常建立分区使用表^(记录每个分区的 起始地址,大小,是否分配)^便于分配
实现简单,无外部碎片
有内部碎片,在分区不能满住进程需求时需要覆盖技术
动态分区分配
根据所需内存分配,不会预先划分内存分区,采用空闲分区表^(记录 分区号,空间大小,起始地址,分配状态)和空闲分区链(记录分区 起始地址,末尾地址,分区大小,分配状态)^
因为紧凑技术导致不能使用静态重定位
内部碎片(进程内部未被使用的内存空间)
外部碎片(进程之间未被使用的内存空间)
紧凑技术(对进程进行移动和整理)可以解决外部碎片,动态运行时装入
基本分页存储管理(将主存分为大小相等相对较小的块作为分配的基本单位)
页(内存分配单元(存储单元是字/字节))
页框(进程的最大页数)
注意页框号和页号的区别(页框号是作业在内存的实际物理地址,页号一般指逻辑地址.选择题往往考察给你个虚地址,先让你判断是否在内存,然后置换算法,等找到页框号后加页内偏移量组成实际物理地址)
页表 :: 是一种存储结构,数组结构导致页号可以用地址隐含表示不需要存储
注意区分Cache映射方式与页表的关系
页表负责将逻辑地址转换为主存地址,然后在拿主存地址再进行一次页表查询是否再Cache中
地址变换机构的任务是逻辑地址转内存物理地址
快表 :: 将页表放入高速缓冲存储器,遵循局部性原理
- 放入主存的页表称为慢表
- 通常采用全相联或组相联方式,是相联存储器,可以按内容寻址
- 命中率一般在 90% 以上
- 快表加速的是将逻辑地址转化成物理地址的速度,类似与ARP
多级页表
各级页表不能超过一个页面的最大页表项数目(页面大小/页表项大小)
n = log(虚地址位数 - 页内偏移量)/log(页面大小/页表项大小)
n级页表访存次数 = n + 1 次,才能获得物理地址
基本分段存储管理 :: 段式虚拟存储器 :: 按照功能模块拆分段
每个段从0开始编址,拥有段名被程序员使用
无内部碎片,有外部碎片
内存分配规则,每个段占连续的内存空间,段之间离散
- 优点 :: 具有逻辑独立性,易于修改,管理和保护
- 缺点 :: 分配空间不变,容易留下碎片造成浪费
逻辑地址 (段号(一个程序最多有多少个段),段内偏移量(段内地址,表示段的最大长度))
段表 (段号(可以被隐含,不占存储空间),段长(一个段的长度),段基址地址(段的起始地址)),段表项是相等大小
满足 方便编程,信息保护,信息共享,动态增长,动态链接 需求
段页式管理
逻辑地址(段号,页号,页内偏移量)
段表只有一个,页表有多个
分页 | 分段 | |
---|---|---|
单位 | 页是信息的物理单位,长度固定 | 段是信息的逻辑单位,长度不固定 |
目的 | 实现离散分配提高内存利用率 | 更好的满足用户需求 |
可见性 | 系统行为,用户不可见 | 用户使用,用户可见 |
地址维度 |
一维,用户只需给出逻辑地址 |
二维,给出段名和段内地址 |
更容易实现信息的共享和保护,可重入编码 在不使用TLB时访存两次才可以得到物理地址 也可以使用TLB |
||
物理地址空间 | 总空间-页表长度 长度不能确定,物理空间也不确定 |
总空间-段表长度 长度不能确定,提供的物理空间也不确定 |
三者的表起始地址都位于寄存器中(进程调度时,将起始地址从PCB写入寄存器中)
这三种方式对内存的单位(分块或分段)指的是内存分配,内存访问是单位(字或字节)
进程切换不会影响页表和段表驻留内存,切换时只会改变寄存器,进程的表是独立(不和其他进程共享,注意题目中所谓的进程共享表指的是同进程中不同线程共享表)的
局部性原理: 时间局部性,空间局部性
传统存储管理方式特征 :: 一次性(作业必须一次性装入内存才能开始运行) 和 驻留性(作业装入内存后就会一直驻留在内存中)
虚拟存储器特征 :: 多次性(允许作业分成多次调入内存),对换性,虚拟性
虚拟内存需要的硬件支持
一定容量的内存和外存
页表(段表)机制,离散分配管理方式
中断机构 :: 缺页(缺段)中断
发生缺页(段) 就需要进程调度,缺页的进程进入阻塞态
地址变换机构
虚拟内存技术的实现 :: 页式虚拟存储器,段式虚拟存储器,段页式虚拟存储器
页框分配
内存分配策略 :: 固定分配局部置换(进程拥有的物理块固定只允许置换),可变分配全局置换(没有置换,允许增减物理块.会降低系统并发能力,物理块的增减是临界资源加锁),可变分配局部置换(允许置换和增减物理块,发生缺页后进行置换.在缺页率高时增加物理块,缺页率低时减少物理块)
固定分配物理块调入算法 :: 平均分配,按比例分配,优先权分配
调入页面策略 :: 预调页策略(运行前需要由程序员预先指出,批量调入内存可减少IO开销),请求调页策略(申请一次调入一次)
对换策略 :: 对换空间充足(调入对换全部在交换区),对换空间不足(不会修改的文件从文件区调入,需要修改的从交换区调入),UNIX方式(未被调入的页面在文件区,调入过的页面在交换区)
页面置换算法 :: Cache替换算法
最佳置换算法(被淘汰的页面最久时间内不被访问的页面)
缺页率最低,无法实现,用于评价其他算法
先进先出算法(最先进入内存的页优先被置换)
会出现Belady异常(分配的物理块越多,缺页率反增)
最近最久未使用算法(选择过去最久没被访问的页进行置换)
性能较好(仅仅指置换算法用较少的置换次数)接近OPT,需要寄存器和栈的硬件支持,开销大(需要实现排序算法)
时钟置换算法
刚调入内存的页面访问位为1
在换出时轮询检查所有页的访问位是否为0,检查后将 访问位 改0(最多检查两次)
改进时钟置换算法用到了修改位(访问位,修改位)
抖动 :: 频繁的换入换出,刚配换出的块很快又被调入
主要原因 :: 置换算法不合理
根本原因 :: 物理块少,进程多
工作集(某段时间内,进程实际访问页面的集合)
置换算法没有更改页框,在置换时,只是将原先页框内的数据进行写入写出,页框本身还是这个进程
也就是置换算法不改变页框号(此时页框号表示的就是实际物理地址/内存地址) #存疑#