🐳前言
图源:文心一言
考研笔记整理,纯复习向,思维导图基本就是全部内容了,不会涉及较深的知识点~~🥝🥝
- 第1版:查资料、画思维导图~🧩🧩
编辑: 梅头脑🌸
参考用书:王道考研《2024年 计算机组成原理考研复习指导》《2024年 操作系统考研复习指导》
参考视频:3.1_存储系统基本概念_哔哩哔哩_bilibili
🦮思维导图
- 🌸思维导图为整理王道教材计组第3章 存储系统+操作系统第3章内存管理+操作系统第5.3章磁盘和固态硬盘,如果看不清的话,可以点赞博文🤘【哎,不点赞也行】,试试存到本地然后放大~
- 🌸博文后面会以大纲的形式复述一遍,面向复习,不会写得很详细,且可能有误;如果想仔细了解知识点,或许可以考虑以下两种方式~
- 王道咸鱼老师的视频:3.1_存储系统基本概念_哔哩哔哩_bilibili
- 较为重要的内容有从网络找相关配图并给出原文链接,点击配图的链接可以传送到各位大佬博文,也很适合快速复习~
- 🌸计算题目部分未标注来源的图是我自己画的,一张图1h+在琢磨,但很难保证正确性,欢迎小伙伴拍砖~
📇目录
🐳前言
🦮思维导图
📇目录
🐳存储器概述
🐋分类
🐋性能指标
🐋多级存储结构
🐳高速缓冲存储器
🐋技术原理:程序访问的局部性
🐋Cache
🐋快表【TLB】
🐋映射方式
🐋写策略
🐋替换算法
🐳主存储器
🐋硬件【计组】
🐚存储结构
🐚访问过程
🐚芯片引脚
🐚多模块存储器
🐚容量扩展
🐚计算小备注
🐋软件【系统】
🐚内存管理的功能
🐚进程运行的基本原理
🐚逻辑地址与物理地址
🐚进程的内存映像【32位】
🐚内存保护
🐚内存共享
🐚内存的分配与回收
🐳虚拟存储器
🐋基本概念
🐋工作流程
🐋请求分页存储管理
🐋页框分配
🐋页面置换算法
🐋抖动和工作集
🐋内存映射文件
🐳外部存储器
🐋磁盘存储器
🐋固态硬盘【SSD】
🐳计算题目
🐋cache
🐋主存
🐚地址码【16年】【20年】
🐚CPU平均每秒访存次数【12年】
🐚主存带宽【12年】
🐚访存时间【13年】
🐋辅存
🔚结语
-
🐳存储器概述
-
🐋分类
- 作用层次
- 高速缓冲存储器(Cache)
- 主存储器(内存)
- 辅助存储器(外存)
- 存取方式
- 随机存储器(RAM)
- 数据存取:支持随机存取
- 易失性存储器:断电后存储信息消失
- 信息读取后完整性
- 动态随机存储器(DRAM):存储元为栅极电容,信息读出时原存储信息被破坏,因此读出后需要以行为单位再生信息【例,主存】
- 静态随机存储器(SRAM):存储元为双稳态触发器,信息读出时原存储信息不被破坏【例,Cache】
- 只读存储器(ROM)
- 数据存取:随机读取;早期不支持随机写入,目前可采用电擦除方式【例,EPROM、Flash存储器、固态硬盘SSD】也可反复重写,但写入速度很慢
- 非易失性存储器:断电内容保留【例,BIOS的引导程序】
- 备注:操作系统的引导程序在硬盘【ROM】,防止掉电后丢失;计算机启动后被引导至主存【RAM】,使其可以与CPU交互
- 串行访问存储器
- 顺序存取存储器(SAM):仅按某种顺序存取,不支持随机读写【例,磁带】
- 直接存取存储器(DAM):介于顺序存取与随机存取,类似于索引存取【例,磁盘、光盘】
- 随机存储器(RAM)
- 作用层次
-
🐋性能指标
- 存储容量 = 存储字数 x 存储字长,存储字数表示存储器的地址空间大小,字长表示一次存取操作的数据量
- 单位成本:总成本 / 总容量
- 存储速度:数据的宽度 / 存储周期
-
🐋多级存储结构
- Cache-主存层:CPUCache【单位:字或字节】,CPU主存【单位:字或字节】,Cache主存【单位:块,可能为行、页、段等】
- 主存-辅存层:主存辅存【单位:块,可能为行、页、段等】
图源:计算机组成原理存储器的层次结构_存储器层级结构的原理-CSDN博客
-
-
🐳高速缓冲存储器
-
🐋技术原理:程序访问的局部性
- 时间局部性:一旦一条指令被执行了,则在不久的将来它可能再次被执行【例,循环指令】
- 空间局部性:一旦一个存储单元被访问,那么它附近的存储单元也很快被访问【例,顺序指令、数组】
- 数组行优先存储【a[0][0],a[0][1]...】具备空间局部性
- 数组列优先存储【a[0][0],a[1][0]...】不具备空间局部性
-
🐋Cache
- 映射方式:预测CPU在未来一段时间内欲访问的数据,按照映射关系,将存储器的数据块装入Cache的指定位置
- 写策略:若访存地址可命中Cache,则转为Cache地址,在Cache内读写数据;若需修改Cache块数据,则需要写策略更改对应的主存内容
- 替换算法:若访存地址未命中Cache,则访问主存,并将字块调入Cache,此时若主存已满,需要执行Cache块替换策略
图源:Cache与主存之间的全相联映射,直接映射和组相联映射的区别
-
🐋快表【TLB】
- 描述:根据局部性原理,将部分页表存放在高速缓存器组成的快表(TLB)中
- 映射方式:全相联映射或组相联映射,不支持直接映射
- 数据结构
- 有效位/装入位
- 标记
- 全相联映射时 标记=虚页号
- 组相联映射时 虚页号的高位部分为标记,虚页号的低位为TLB组的组索引
图源:内存管理 —— 快表TLB_快表和慢表-CSDN博客
-
🐋映射方式
- 全相联映射
- 简介:主存中的每一块只能装入Cache中的唯一位置
- 特点:非常灵活,实现复杂,标记速度慢,冲突率低,空间利用率高
- 地址:标记+块内地址
- 直接映射
- 简介:主存中的每一块只能装入Cache中的任意位置
- 特点:实现简单,不够灵活,冲突率高,空间利用率低
- 映射关系:Cache 行号 = 主存块数 mod Cache总行数
- 地址:标记+Cache块号+块内地址
- 标记
- 标记 = 主存块号 - Cache行号 = log(主存行数 / Cache行数) ,例如主存容量是Cache容量的4096倍,则标志位为log 4096 = 12bit
- 标记 = 地址码长度 - Cache行号 - 块内地址,地址码长度由存储字长【或机器字长】、或主存容量决定
- Cache行号:Cache行数决定,例如容量16KB、每行16B的Cache,其行数为16KB/16B = 1K,需要log 1K=10位行号
- 块内地址:每行Cache包含的数据字段数+字长决定
- 例1:Cache行为16B,按字节编址【寻址大小为1B】,需要log 16 = 4位块内地址号
- 例2:Cache行为8个字,每个字32位,则行为8 x (32/8)B = 32B,按字节编址,需要log 32 = 4位块内地址号
- 标记
- 组相联映射
- 简介:主存中的每一块只能装入Cache中的固定组的任意一行,即组间直接映射,组内全相联映射
- 特点:选定适当的每组Cache行数量,可以使成本接近直接映射,性能接近全相联映射
- 映射关系:Cache 组号 = 主存块数 mod Cache组数
- 地址:标记+Cache组号+块内地址
- 标记 = 地址码长度 - Cache组号 - 块内地址,地址码长度由存储字长【或机器字长】、或主存容量决定
- Cache组号:Cache组数决定,例如容量128KB、每行16B的Cache,采用8位组相联,其行数为128KB/16B = 8K,其组数为8K/8 = 1K,需要log 1K=10位组号
- 块内地址:每行Cache包含的数据字段数+字长决定
图源:计算机组成原理cache的三种映像_组相联cache_李昕羽的博客-CSDN博客
- 全相联映射
-
🐋写策略
- Cache写命中
- 全写法
- 同时把数据写入Cache和主存;可保证数据的准确性,但增加了访存次数
- 在Cache和主存之间增加写缓冲,CPU将数据写入Cache和写缓冲,写缓冲将内容写入主存,但频繁写时写缓冲会饱和溢出
- 回写法
- 只需要把数据写入Cache,只有Cache块被换出时才协会储存,Cache行需要增加脏位;减少了访存次数,但存在数据不一致的隐患
- 全写法
- Cache写不命中
- 写分配法
- 加载主存的块到Cache中,更新这个Cache块
- 非写分配法
- 只写入主存,不进行调块
- 写分配法
- 搭配
- 全写法+非写分配法【例,Cache块调换】
- 回写法+写分配法【例,Cache块调换、页面调换】
图源:计组之存储系统:8、Cache写策略-CSDN博客
- Cache写命中
-
🐋替换算法
- 随机算法【RAND】
- 算法:随便选一个Cache块替换
- 特点:实现简单,过于随意,命中率较低
- 先进先出算法【FIFO】
- 算法:优先淘汰最早进入内存的页面
- 特点:实现简单,具有抖动现象,具体表述为所分配的物理块数增大而页故障数不减反增的现象
- 最近最少使用算法【LRU】
- 算法:设置访问字段记录页面被上次被访问的时间,优先淘汰最长时间未访问过的页面
- 特点:性能较好,不具有抖动现象,但需要寄存器和栈的硬件支持
- 最不常使用算法【LFU】
- 算法:设置访问字段记录页面访问次数,优先淘汰访问次数最少的存储行
- 特点:性能接近LRU算法,但实际效果不如LRU,因为计数器可能会是一个很大的数
图源:计组之存储系统:Cache替换算法
- 随机算法【RAND】
-
-
🐳主存储器
-
🐋硬件【计组】
-
🐚存储结构
- 存储体(存储矩阵):存储单元的集合,通过行选择线、列选择线选择访问单元。存储体的相同行、列上的位同时被读出或写入
- 地址译码器:将地址转换为译码输出线上的高电平,以便驱动相应的读写线路
- I/O控制电路:控制被选中的单元【控制电路片选线CS】的读出或写入【控制电路读写线WE】,具有放大信息的作用以保证输出电信号稳定可靠【驱动器】
- 片选控制信号:在多个芯片中,“选中”该存储字所在的芯片
- 读/写控制信号:根据CPU给出的读命令或写命令,控制被选中的单元进行读写
图源:主储存器的基本组成 - weblog
-
🐚访问过程
- CPU→数据→MDR【数据寄存器】,数据线的宽度与MDR的宽度相同
- CPU→地址→MAR【地址寄存器】,地址线的宽度与MAR的宽度相同,决定了主存地址空间的最大可寻址范围
- CPU→读写信号→控制电路
-
🐚芯片引脚
- 引脚最小数目 = 数据线 + 地址线 + 控制线
- 数据线:根据芯片的存储单元位数决定
- 地址线:根据芯片的存储单元数量决定
- 若未采用地址复用技术,1024个存储单元(行32个 x 列32个),需要地址线:5(行地址线)+5(列地址线)= 10根
- 若已采用地址复用技术,1024个存储单元(行32个 x 列32个),需要地址线:10/2(行、列地址线复用)= 5根
- 控制线
- 若未采用地址复用技术,控制线 = 片选线1根 + 读写控制线1【读写复用】或2根【读写独立】
- 若已采用地址复用技术,控制线 = 行、列通选线2根 + 读写控制线1或2根,片选线的功能由通选线代替
- 备注:DRAM默认采用地址引脚复用技术,以减少引脚数量
-
🐚多模块存储器
- 单体多字存储器:只有一个存储体,一次并行读出m个字,地址必须顺序排列在同一存储单元
- 多体并行存储器
- 高位交叉编址方式:模块内的地址是连续的,存取方式为串行存取,读取时间 = 访存次数 x 存储周期
- 低位交叉编址方式:模块号=单元地址%模块数,模块流水线存取:读取时间 = 存储周期+(访存次数-1)x总线传输周期;充分流动时,读取时间=访存次数x总线传输周期
图源:计算机组成原理
-
🐚容量扩展
- 位扩展法
- 功能:数据线数与存储芯片位数不相等时,使用多个存储芯片扩充字长,使 CPU数据线数 = 存储芯片数据位数
- 地址:采用8片8Kx1位的RAM芯片组成8Kx8位的存储器,此时字长8 = 1【每片1位】x8【8个芯片】
- 连线:数据总线D0-D7【字长 8】、读写信号【读写,复用1根,独立2根】、地址总线A0-A12、片选信号【连接所有芯片】
- 字扩展法
- 功能:增加存储器中字的数量,而位数不变,增加片选信号,并联地址线、数据线、读写控制线
- 地址:采用4片16Kx8位的RAM芯片组成64Kx8位的存储器,此时总地址长度16=2【片选地址为log 4=2】+14【片内字选地址为log 16K=14】
- 连线:数据总线D0-D7【字长 8】、读写信号【读写,复用1根,独立2根】、地址总线A0-A13、片选信号A14-A15【log 4=2】、片选使能【控制选片开关】
- 字位扩展法
- 功能:既增加存储字的数量,又增加存储字长
- 举例:采用8片16Kx4位的RAM芯片组成64Kx8位的存储器,每组2片【字4位→8位】,需要4组【位16K→64K】,总地址长度16=2【片选】+14【字选】
- 连线:数据总线D0-D7【字长 8】、读写信号【读写,复用1根,独立2根】、地址总线A0-A13、片选信号A14-A15【log 4=2】、片选使能【控制选片开关】
图源:计算机的存储系统,全方面、最详细_sam dam dam-CSDN博客
- 位扩展法
-
🐚计算小备注
- 内存的芯片数量
- 内存位:内存区间000~400H【H是16进制】这种表示内存的位,16进制转2进制就是4x(16^2) = 2^10 =1K
- 内存字:按字编址-32bit【假设为32位系统】,按半字编址-16bit【假设为32位系统】,按字节编址-8bit
- 内存容量:内存字 x 内存位=1K【单元数量】x 32bit【单元长度,假设为按字编址】=4KB
- 内存的芯片地址
- 芯片地址=片选地址+片内地址,对于固定芯片,片选地址固定,片内地址从全0~全1浮动
- 例:4个 64x8bit的芯片组成 256x8bit的存储器,每个芯片的片内地址数量为log 64 = 4,第2个芯片的片选地址为01,则地址范围 01 0000 ~ 01 1111,或10H~1FH
- 内存的芯片数量
-
-
🐋软件【系统】
-
🐚内存管理的功能
- 内存空间的分配与回收:存储器空间的分配与管理
- 地址转换:多道程序环境下,程序中的逻辑地址与内存的物理地址不一致,需将逻辑地址转化为物理地址
- 内存空间的扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存
- 内存共享:允许多个进程访问内存的同一部分
- 存储保护:保证各道作业在各自的存储空间内运行,互不干扰
-
🐚进程运行的基本原理
- 程序的链接与装入
- 编译:由编译程序将用户源代码编译成若干目标模块
- 链接:将编译后的一组模块及他们所需的库函数链接在一起,形成装入模块【形成逻辑地址】
- 装入:由装入程序将装入模块装入内存运行【形成物理地址】
图源:文件在高级操作系统环境正确装载执行_baiiu的博客-CSDN博客
- 链接的三种方式
- 静态链接:将个目标模块及他们所需的库函数链接成一个完整的装配模块,以后不再拆开
- 装入时动态链接:源程序编译后形成的一组目标模块,在装入内存时,采用边装入边链接的方式
- 运行时动态链接:对于目标模块的链接,程序执行中需要该目标模块才进行
- 装入的三种方式
- 绝对装入
- 只适合单道程序环境,程序驻留在内存的某个固定位置
- 编译程序将产生绝对地址的目标代码
- 静态重定位
- 在多道程序环境下,作业一旦装入内存,必须给它分配要求的全部内存空间,整个运行期间不能在内存中移动
- 地址经过一次变换,将装入模块中的相对地址转换为绝对地址
- 动态重定位
- 在多道程序环境下,作业装入内存后,地址转换推迟到程序要执行时才进行
- 装入内存后的所有地址均为相对地址,需要重定位寄存器的支持
- 分页存储管理、段式存储管理装入时都使用动态重定位转换地址
- 绝对装入
- 程序的链接与装入
-
🐚逻辑地址与物理地址
- 逻辑地址
- 编译后,每个目标模块都从0号单元开始编址,这成为该目标模块的相对地址或逻辑地址
- 对于32位系统,逻辑地址空间的范围为
- 物理地址
- 内存中物理单元的集合,是地址转换的最终地址
- 操作系统通过内存管理部件(MMU)将进程使用的逻辑地址转换为物理地址
- 逻辑地址
-
🐚进程的内存映像【32位】
- 0x0000 0000 ~ 0x0804 7FFF
- 未使用区
- 0x0804 8000 ~ 0x3FFF FFFF
- 只读代码段:可存放程序指令等
- 读/写数据段:可存放全局变量、静态变量static等
- 堆【从低位到高位生长】:可存放 C#:malloc 或C++:new的变量
- 0x4000 0000 ~ 0xBFFF FFFF
- 共享库的存储映射区:可存放 #include<stdio.h>这样的函数库代码
- 用户栈【从高位到低位生长】:可存放局部变量
- 0xC000 0000 ~ 0xFFFF FFFF
- 操作系统内核区:操作系统可访问,用户不可访问【PSW区分用户/内核态】
图源:谈谈物理内存与虚拟内存之间的映射(超详细~) - 知乎
- 0x0000 0000 ~ 0x0804 7FFF
-
🐚内存保护
- 目的:确保每个进程都有一个单独的内存空间,且用户进程与操作系统不会相互影响
- 措施
- 在CPU设置一对上、下限寄存器,地址号与两个寄存器的值相比,判断有无越界
- 采用重定位寄存器【物理地址最小值】和界地址寄存器【逻辑地址最大值】,比较逻辑地址与界地址寄存器,若未越界,加上重定位寄存器的值形成物理地址
-
🐚内存共享
- 并不是所有的进程内存空间都适合共享,只有那些只读的区域才可以共享
- 可重入代码:允许多个进程同时访问但不允许被任何进程修改的代码
-
🐚内存的分配与回收
- 连续分配
- 单一连续分配
- 描述:在用户区内存中,仅有一道用户程序,即整个内存的用户空间由该程序独占
- 特点
- 简单,无外部碎片
- 只能用于单用户、单任务的操作系统中,存储器的利用率极低【内部碎片】
- 优化:当时计算机物理内存较小,存储空间有限,因此将进程活跃的部分放入固定区、可交替访问的部分放入覆盖区【覆盖技术】
- 固定分区分配
- 描述:最简单的多道程序存储管理方式,将用户内存空间划分为若干固定大小的区域,每个分区只装入一道作业
- 划分分区的方式
- 分区大小相等:缺乏灵活性,适合于一台计算机控制多个相同对象的场合
- 分区大小不等:划分为多个较小的分区、适量的中等分区和少量大分区
- 管理:分区使用表,按分区大小排队,各个表想包括每个分区的起始地址、大小及状态(是否已分配)
- 特点
- 简单,无外部碎片
- 可能因为程序太大而放不进任何一个空间,需要采用覆盖技术
- 可能因为程序太小浪费内存空间【内部碎片】
- 动态分区分配
- 描述:进程装入内存时,根据进程的需要,动态地为之分配内存
- 特点:随着时间推移,内存中会产生越来越多小的内存块【外部碎片】;可通过紧凑技术解决,但需动态重定位寄存器的支持,且费时
- 分区分配策略
- 首次适应算法:空闲分区以地址递增的次序链接【最简单,最优秀】
- 邻近适应算法:分配内存时从上次查找结束的位置开始查找
- 最佳适应算法:空闲分区按容量递增的次序形成空闲分区链,找到能满足的最小空间分配给作业,实际易产生外部碎片
- 最坏适应算法:空闲分区以容量递减的次序链接
- 单一连续分配
- 非连续分配
- 基本分页存储管理
- 描述:把内存划分为大小相等且固定的块,作为主存【页、页面】与进程【页框、页帧】的基本单位【分页在装作业时确定】
- 特性:固定分区技术,不会产生外部碎片,不完整的块申请一个主存块会浪费空间【内部碎片】
- 地址结构
- 单级页表逻辑地址=逻辑页号+页内偏移量
- 两级页表逻辑地址=一级页号+二级页号+页内偏移量
- 物理地址=物理页号+页内偏移量
- 地址转换机构
- 逻辑→物理地址:内存中的页表
- 页表数据结构:页号【隐含】+块号,备注:进程的第一级页表常驻内存
- 页表寄存器PTR:存放页表的起始地址F、页表长度M【来源于本进程PCB】
- 地址转换过程
- (1) 逻辑页号P=逻辑地址A/页面大小L,页内偏移量W=逻辑地址A%页面大小L
- (2) 将页号送入快表TLB,若命中快表则直接取出物理块号b,跳到(5);否则访问主存,进行(3)(4)(5)
- (3) 比较逻辑页号P和页表长度M,若P≥M,则产生越界中断,否则继续执行
- (4) 页表项地址=页表始址F + 页号Px页表项长度,取出物理块号b
- (5) 物理地址E=物理块号bx页表大小L+页内偏移量W
- 访存次数
- 单级页表:访问页表1次【未命中TLB】+访问目标单元1次【未命中Cache】,默认访问2次
- 两级页表:访问页表1次【未命中TLB】+访问二级页表1次【未命中TLB】+访存内存单元1次【未命中Cache】,默认访问3次
- 备注:若采用全写法,则可能在写回数据时 访存次数+1
图源:基本分页存储管理方式 - 快懂百科
- 基本分段请求管理
- 描述:按照用户进程中的自然段划分空间,例如主程序段、子程序段、栈段、数据段作为主存与进程的基本单位【段长在编程时确定】
- 特性
- 管理复杂,内存利用率低,段长不固定【外部碎片】
- 方便编程、信息保护和共享,动态增长及动态链接
- 地址结构
- 逻辑地址=逻辑段号+段内偏移量
- 物理地址=物理始址+段内偏移量
- 地址转换机构
- 段表数据结构:段号【隐含】+段长+本段在主存中的地址
- 控制寄存器:存放段表的起始地址F、段表长度M
- 地址转换过程
- 与页的地址转换过程类似
- 段的共享
- 段的共享:两个作业的段表中相应表项指向被共享段的同一个物理副本
- 共享要求
- 不能修改的代码称为纯代码或可重入代码,不属于临界资源,可以共享
- 可修改的代码和数据不能共享
- 段的保护
- 存取控制保护
- 地址越界保护
- 段号 > 段表长度,越界中断【猜测可能访问不到目标进程】
- 段内偏移 > 段长,越界中断【猜测可能访问不到目标段】
- 访存次数:访问段表1次【未命中TLB】+访问目标单元1次【未命中Cache】
图源:基本分段存储管理方式 - 快懂百科
- 段页式管理
- 描述:每个进程一张段表,每个段一张页表,页作为主存与进程的基本单位
- 特性
- 分段方法分配和管理用户地址空间
- 分页方法管理物理存储空间【内部碎片】
- 地址结构
- 逻辑地址=逻辑段号+逻辑页号+段内偏移量
- 物理地址=物理始址+段内偏移量
- 地址转换机构
- 段表数据结构:段号+页表长度+页表始址
- 页表数据结构:页块+页号
- 控制寄存器:段表始址、段表长度
- 访存次数:访问段表1次【未命中TLB】+访问页表1次【未命中TLB】+访问目标单元1次【未命中Cache】,默认访问3次
图源:一文读懂存储管理之页式、段式、段页式存储及优缺点 - 知乎
- 基本分页存储管理
- 连续分配
-
-
-
🐳虚拟存储器
-
🐋基本概念
- 特征
- 传统内存
- 一次性:作业必须一次性全部装入内存后,才能开始运行
- 驻留性:作业被装入内存后,就一直驻留在内存中,其任何部分都不会被换出
- 虚拟内存
- 多次性:无须在作业运行时一次性地全部装入内存,而允许被分成多次调入内存
- 对换性:无须在作业运行时一直常驻内存,进程运行期间可以从内存调至外存的对换区(换出)
- 虚拟性:逻辑上扩充内存的容量【虚拟地址的容量】,用户看到的内存容量远大于实际容量
图源:虚拟内存的原理是什么? - 知乎
- 传统内存
- 组成:主存与辅存共同构成了虚拟存储器,二者在硬件和系统软件的共同管理下工作
- 编址:虚拟存储器将主存或辅存的地址空间统一编址
- 虚地址:用户变成允许涉及的地址
- 实地址:主存地址空间
- 关系:实际通常 虚地址空间 >> 实地址空间,但理论上 小于或等于也是允许的
- 条件
- 硬件支持
- 一定容量的内存和外存
- 页表机制(或段表机制),作为主要的数据结构
- 中断机构,当用户要访问的部分尚未调入内存时,则产生中断
- 地址变换机构,实现逻辑地址到物理地址的变换
- 系统支持
- 请求调页
- 页面置换功能
- 硬件支持
- 实现
- 请求分页存储管理
- 请求分段存储管理
- 请求段页式存储管理
- 特征
-
🐋工作流程
- 辅助硬件找出虚地址与实地址之间的对应关系
- 判断虚地址对应的存储单元是否已装入主存
- 若已在主存,通过地址变换,CPU可直接访问快表或主存指示的实际单元
- 若不在主存,则把包含字的一页或一段调入主存后再有CPU访问
- 若主存已满,则采用替换算法置换主存中的交换块(即页面)
-
🐋请求分页存储管理
- 描述
- 请求分页系统建立在基本分页系统基础之上
- 增加了请求调页功能和页面置换功能
- 请求页表项
- 页表机制
- 与基本分页相同
- 页号【隐含】
- 物理页框号:虚拟页面存放的物理页框位置
- 比基本分页新增
- 有效位 | 状态位 | 合法位:指示该页是否已调入内存【程序访问参考】
- 引用位 | 访问字段:用于记录本页在一段时间内被访问的次数【置换算法参考】
- 脏位 | 修改位:标识该页调入内存后是否修改过【置换算法参考】
- 保护位 | 权限位:该页面的读、写权限【程序访问参考】
- 外存地址 :该页在外存的地址,通常是物理块号【调入页面参考】
- 与基本分页相同
- 缺页中断机构
- 与一般中断的相似
- 保护CPU环境
- 分析中断原理
- 转入缺页中断处理程序
- 恢复CPU环境
- 与一般中断的区别
- 在指令执行期间【而非指令执行完后】产生中断和处理信号,属于内部异常
- 一条指令在执行期间,可能产生多次缺页中断
- 与一般中断的相似
- 地址变换机构
- 与基本分页相同
- 优先检索快表,未命中时访问内存页表
- 访问内存页表,并将该页调入快表
- 形成物理地址
- 与基本分页不同
- 内存无目标页表,进行缺页中断处理,若内存已满则使用置换算法调换目标页
- 修改快表的访问位与修改位【写指令】
- 与基本分页相同
- 页表机制
-
🐋页框分配
- 驻留集
- 描述:操作系统给特定的进程分配的物理页框集合
- 考虑因素
- 程序本身的缺页率
- 内存驻留的进程数量
- 内存分配策略
- 固定分配局部置换
- 固定:进程运行期间的物理块数目不变,可采用以下算法
- 平均分配算法
- 按比例分配算法
- 优先权分配算法
- 局部:如果缺页,从分配给该进程在内存的页面中选一页换出
- 特点:难以确定为每个进程分配的物理块数目
- 固定:进程运行期间的物理块数目不变,可采用以下算法
- 可变分配全局置换
- 可变:进程运行期间的物理块数目根据情况适当地增加或减少
- 全局:如果缺页,系统从空闲物理队列中取出一块分配给该进程
- 特点:如果盲目给进程增加物理块,可能导致多道程序的并发性下降
- 可变分配局部置换
- 局部:如果缺页,从分配给该进程在内存的页面中选一页换出
- 可变:进程运行期间的物理块数目根据情况适当地增加或减少
- 特点:保证进程不会过多地调页的同时,也保持了系统的多道程序并发能力
- 固定分配局部置换
- 调入页面的时机
- 预调页策略:预测不久之后便会被访问的页面优先调入内存,但成功率仅50%
- 请求调页策略:进程在运行中需要访问的页面不再内存,便提出请求,由系统将所需的页面调入内存
- 从何处调入页面
- 外存划分
- 对换区:存放对换页面的,采用连续分配方式,磁盘I/O速度比文件区高
- 文件区:采用离散分配方式
- 缺页调入内存
- 系统拥有足够的对换区空间
- 进程运行前,将与进程有关的文件从文件区复制到对换区
- 进程运行时,全部从对换区调入所需页面
- 系统缺少足够的对换区空间
- 不会被修改的文件都直接从文件区调入
- 可能被修改的部分,在将它们换出时须调到对换区
- UNIX方式
- 与进程有关的文件都放在文件区,未运行的页面都从文件区调入
- 曾经运行过但又被换出的页面,放在对换区,下次从对换区调入
- 系统拥有足够的对换区空间
- 外存划分
- 如何调入页面:所访问的页面不再内存,便向CPU发出缺页中断,中断响应后转入缺页中断处理程序 🌸计组+系统01:中断_梅头脑_的博客-CSDN博客
- 驻留集
- 描述
-
🐋页面置换算法
- 最佳置换算法【OPT】
- 算法:已知访问队列,淘汰最长时间内不再访问的页面
- 特点:理想算法,然而实际访问列队不可知,因此不能实现,但是可以作为标杆评价其他算法
- 先进先出算法【FIFO】
- 算法:优先淘汰最早进入内存的页面
- 特点:实现简单,具有抖动现象,具体表述为所分配的物理块数增大而页故障数不减反增的现象
- 最近最少使用算法【LRU】
- 算法:设置访问字段记录页面被上次被访问的时间,优先淘汰最长时间未访问过的页面
- 特点:性能较好,不具有抖动现象,但需要寄存器和栈的硬件支持
- 时钟置换算法【CLOCK】
- 简单CLOCK算法
- 所有页面在逻辑上视为循环队列,被替换或被访问时访问位置为1,指针指向被替换页面的下一页
- (1)若需替换页面,指针循环扫描,若指向的页面访问位为0:将该页换出
- (2)指针此时指向的页面访问位为1:暂时置为0,本轮不替换,指针指向下一页
- (3)检查到最列最后1个页面,若其访问位还是为1,则指针回到队首循环检查
- 改进CLOCK算法
- 在简单CLOCK算法的基础上增加修改位
- (1)从指针当前位置开始扫描,寻找A=0【未访问】,M=0【未修改】的页面,此轮不改变访问位A
- (2)若前一步失败,进行第二轮扫描,寻找A=0【未访问】,M=1【已修改】的页面,此轮将扫描过的页面访问位A置0
- (3)若前一步失败,重复步骤(1),若有必要,重复步骤(2)
- 特点
- 操作系统试图使用此算法接近LRU算法的性能,并减少硬件开销
- 改进CLOCK算法相比简单CLOCK算法可减少磁盘的IO数,但会增加算法开销
- 简单CLOCK算法
图源:【操作系统】页面置换算法 | 小猿聊编程-技术编程
- 最佳置换算法【OPT】
-
🐋抖动和工作集
- 抖动:刚刚换出的页面马上又要换入主存,刚刚换入的页面马上又要换出主存
- 工作集:某段时间间隔内,进程要访问的页面集合;一般来说,分配给进程的物理块数要大于工作集大小
-
🐋内存映射文件
- 与虚拟内存类似
- 磁盘与内存虚拟地址具有映射关系,可以访问被映射的文件
- 与虚拟内存不同
- 不必执行文件I/O操作,也无须对文件内容进行缓存管理,适合用来管理大尺寸文件
- 所进行的实际交互是在内存中进行的,并且是以标准的内存地址形式来访问的
- 多个进程允许并发地映射同一文件,进程可以通过共享内存来通信
图源:你似乎来到了没有知识存在的荒原 - 知乎
- 与虚拟内存类似
- 性能影响因素
- 页面大小↑:单个进程的缺页率↓,内存空间利用率↓
- 分配给进程的物理块数↑:单个进程的缺页率↓,进程并发数↓
- 页面置换算法↑:缺页率↓
- 写回磁盘:全写法访存效率↓、回写法访存效率↑
- 编写程序的局部化程度↑:缺页率↓
-
-
🐳外部存储器
-
🐋磁盘存储器
- 原理:磁头和磁性记录介质相对运动时,通过电磁转换完成读/写操作
- 组成:磁盘控制器、磁盘驱动器、盘片
- 寻址
- 寻址过程:找到对应的硬盘【驱动器号】,移动磁头臂寻道【磁道号】,激活相应磁头【盘面号】,旋转盘面【扇区号】
- 磁盘地址码长度:驱动器号 + 磁道号【也称,柱面号】 + 盘面号 + 扇区号
图源:理论:磁盘管理与文件系统 - 系统运维 - 亿速云
- 性能
- 平均存取时间:寻道时间 + 旋转延迟 + 传输时间 (+ 控制时间)【公式详见:计算题目 - 外存 - 访存时间】
- 数据传输率:磁盘转速(r/s) x 每条磁道容量(B)
- 读写操作是串行的,磁头每次写1bit;注意,磁盘存储器是以块【物理块,即扇区】为单位读写的
- 性能提升
- 减少寻道时间 | 调度算法
- 先来先服务【FCFS】算法
- 描述:根据进程请求访问磁盘的先后顺序进行调度
- 优点:公平,不会导致磁臂黏着
- 缺点:平均寻道距离大,如果大量进程竞争使用磁盘,则这种算法在性能上往往接近于随机调度
- 最短寻找时间优先【SSTF】算法
- 描述:与当前磁头所在磁道距离最近的磁道,以便使每次的寻找时间最短
- 优点:虽然不能保证平均时间最小,但能提供比FCFS算法更好的性能
- 缺点:“饥饿”现象
- 扫描算法【SCAN】算法
- 描述:在最短寻找时间优先算法的基础上,规定了磁头运动的方向
- 优点:规避了SSTF在小区域来回移动导致饥饿现象
- 缺点:对最近扫描过的区域不公平,访问局部性不如FCFS算法和SSTF算法
- 循环扫描算法【C-SCAN算法】
- 描述:在扫描算法的基础上规定磁头单向移动来回服务,回返时直接移动至快速起始端而不服务任何程序
- 优点:改进了SCAN算法偏向于处理那些接近最里或最外的磁道访问请求的问题
- LOOK、C-LOOK算法
- 描述:相比SCAN算法,磁头只需要移动到最远端的请求即可返回,不需要达到磁盘端点
- 备注:若无特殊说明,默认SCAN算法为LOOK算法,C-SCAN算法为C-LOOK算法
- 先来先服务【FCFS】算法
- 减少延迟时间
- 原因:磁盘是连续自转设备,磁盘读/写物理块后,需要经过短暂的时间处理才能开始读/写下一块
- 影响:文件的分配方式【顺序、链式、索引】等,程序被分配到的磁盘不同区域也会影响磁盘的旋转时间
- 措施:盘面扇区交替编号,磁盘片的不同盘组错位命名
- 减少寻道时间 | 调度算法
- 管理
- 磁盘初始化 | 装机过程
- 初始化
- 物理格式化:划分扇区【物理块】,扇区的数据结构:头部+数据区域+尾部
- 头部和尾部包含了一些磁盘控制器的使用信息,例如扇区校验码、磁盘的链接指针等
- 扇区的大小通常为512B
- 坏块管理:划分一些备用块,检测损坏块区时使用备用块代替
- 物理格式化:划分扇区【物理块】,扇区的数据结构:头部+数据区域+尾部
- 分区
- MBR【主引导记录】:磁盘引导程序+分区表【起始扇区与分区大小】
- 分区:将磁盘分为一个或多个柱面组成的分区【例,C盘、D盘】
- 备注1:存放操作系统的分区称为主分区,具有引导程序
- 备注2:不同的分区可以是独立的文件系统,一般均含有根目录、空闲空间管理模块等,UNIX可能含有索引节点表
- 逻辑格式化
- 创建文件系统:操作系统将初始的文件系统数据结构存储到磁盘上,并为空间创建目录【空闲空间管理、根目录等】
- 逻辑块
- 为了提高效率,操作系统将多个相邻的扇区【物理块】组合在一起,形成一簇【逻辑块】,文件占用的空间只能是簇的整数倍
- 簇号到物理地址的映射由厂家提供的驱动程序完成
- 操作系统的安装
- 备注:操作系统安装之前,磁盘的逻辑格式化可能由引导加载程序或其它初始化程序暂时创建与维护;操作系统安装后,将接管文件管理的职责
- 初始化
- 系统初始化 | 开机过程
- 自举程序
- 功能:初始化CPU、寄存器、设备控制器和内存等,接着启动从操作系统
- 存储:ROM保留很小的自举装入程序,完整功能的引导程序保存在磁盘的启动块上,具有启动分区的磁盘成为启动磁盘或系统磁盘【例,C盘】:
- 简化步骤
- 激活CPU:CPU加电,CS:IP指向FFFF0H【主存ROM区】
- 加载BIOS【引导程序】:执行JUMP指令跳转到BIOS【引导程序,或自举程序】
- 硬件自检:检查硬件是否出现故障,并登记BIOS中断程序入口地址,识别已连接的外设
- 加载MBR【主引导记录】:CPU将磁盘的第一块MBR读入内存,执行MBR中的磁盘引导程序,磁盘引导程序根据分区表,读入启动盘的PBR【引导块】
- 加载PBR【活动引导记录】:CPU读入主分区的分区引导块PBR,执行根目录下用于引导操作系统的程序
- 加载操作系统:CPU从根目录下找到完整的操作系统,将内核部分加载到内存中,初始化并开机
图源:1.5_操作系统引导_哔哩哔哩_bilibili
- 自举程序
- 磁盘初始化 | 装机过程
- 可靠性
- 坏块 | 软件管理
- 简单磁盘,坏块会在FAT表上标明,因此程序不会使用它们
- 复杂磁盘,控制器维护磁盘内的坏块列表,低级格式化将一些块保留作为备用
- 阵列 | 硬件管理
- 描述:RAID(磁盘冗余阵列),将多个物理磁盘组成一个独立的逻辑磁盘,相互备份,在磁盘损坏时提升系统的可靠性
- 措施:镜像、海明码、奇偶校验码等
- 坏块 | 软件管理
-
🐋固态硬盘【SSD】
- 原理
- 基于闪存技术【Flash Memory】的存储器,使用固态电子存储芯片阵列制成
- 组成
- 闪存芯片:替代传统旋转盘中的机械驱动器
- 闪存翻译层:替代传统旋转盘的磁盘控制器,将来自CPU的逻辑块读写请求翻译成对底层物理设备的控制信号
- 访存
- 一个闪存由多个块组成,每个块由多个页组成
- 数据是以页为单位读写的,只有一页所属的块被擦除后,才能写这一页
图源:5.3_5_固态硬盘SSD_哔哩哔哩_bilibili
- 性能
- 平均存取时间:传输时间 (+ 控制时间)【没有移动的机械部件,不需要寻道、延迟】
- 随机访问较快,但是连续访问相比机械硬盘无优势
- 随机写很慢:擦除操作很慢,且写入时页中的所有块都必须被复制到一个新的块中
- 反复擦写后,闪存块会磨损
- 磨损均衡技术
- 动态磨损均衡:写入数据时,自动选择较新的闪存块
- 静态磨损均衡:SSD自动监测并进行数据分配,让老的闪存块承担无须写数据的存储任务,平常的读写操作在较新的闪存块中进行
- 原理
-
-
🐳计算题目
-
🐋cache
- Cache命中率【08年】
- 命中率 = Cache命中次数 /(Cache访问次数 + 主存访问次数)
- 例1,sum += a[i],假设按行优先访问数组数据,若每个Cache块内有8个数据,那么每个数据读1次,命中率为7/8 = 87.5%
- 例2,a[i] += a[i]+1,假设按行优先访问数组数据,若每个Cache块内有8个数据,那么每个数据读写各1次,命中率为15/16 = 93.75%
- 命中率 = Cache命中次数 /(Cache访问次数 + 主存访问次数)
- 平均访问时间【13年】
- CPU同时访问Cache和主存: 访问时间 = 命中率 x Cache访问时间 + (1-命中率)x 主存访问时间
- CPU未命中Cache再访问主存: 访问时间 = Cache访问时间 + (1-命中率)x 主存访问时间 【默认】
- Cache命中率【08年】
-
🐋主存
-
🐚地址码【16年】【20年】
- 逻辑地址
- 逻辑地址 = 页号+页内偏移量
- 页内地址 = 2^(页内偏移量位数),页面大小 = 2^(页内偏移量位数) x 编址单位【默认为字节编址,1B】
- 虚拟地址空间数量 = 2^(页号位数) = 2^(页目录号位数+页表索引位数)
- 虚拟地址空间大小= 2^(逻辑地址位数) x 编址单位【默认为字节编址,1B】
- 每页容纳页表项个数 = 页面大小(B) / 页表项大小(B)
- 虚拟地址转物理地址的过程【再次备注,图是自己一笔一笔画的,博主可能理解有误,请大佬拍砖~~】
CPU取指令过程
物理地址与虚拟地址的异同
快表与慢表的地址结构划分
物理地址与Cache数据结构
单级虚拟页表
二级虚拟页表(一)
二级虚拟页表(二)
- 逻辑地址 = 页号+页内偏移量
- 物理地址
- 物理地址 = 标记+(Cache 块号或组号)+块内地址
- 标记用于比较
- Cache行号、组号用于定位Cache块
- 块内地址用于确定CPU在本行所取的字
- 主存单元装入Cache的地址 = Cache行/组号 + 块内地址
- 比较器
- 用途:比较物理地址的标记位与Cache表项的标记位,标记位相等且有效则Cache命中
- 比较器的位数 = 标记位数
- 比较器的个数
- 组相联映射,比较器的个数 = 每组包含的Cache行数
- 全相联映射,比较器的个数 = Cache行数,表示所有行同时比较
- 直接映射,比较器的个数 = Cache行数,表示每次仅比较一行
- 物理地址 = 标记+(Cache 块号或组号)+块内地址
- Cache映射表
- 每行位数:有效位+ 标记 +(脏位)+(替换位)+ 数据
- 有效位:1bit,1表示有效,0表示无效
- 标记位:CPU访存,对比地址与Cache的标记位,若相等且有效位为1,则命中Cache,与地址码的标记长度相同
- 脏位 | 一致性维护位:1bit,用于回写法,1表示Cache块已修改,需要写回主存,0表示未修改【详见Cache-写策略】
- 替换位:
- log Cache块数 bit,用于LRU、LFU替换算法,统计上次最晚访问时间或已访问次数【详见Cache-替换算法】
- 其中Cache块数为一组Cache的个数,如果为组相连,则LRU替换算法位数 log 每组Cache块数
- 数据位:Cache块的尺寸,这个数值题目一般会直接给到,或是用2^(块内偏移量)计算
- 总容量(bit):每行位数 x Cache行数
- 每行位数:有效位+ 标记 +(脏位)+(替换位)+ 数据
- 逻辑地址
-
🐚CPU平均每秒访存次数【12年】
- 以下知识均与总线有关,可参考:🌸总线、I/O系统与中断-CSDN博客
- CPU平均每秒执行的指令数(IPS)= CPU每秒时钟频率(Hz)/ 每条指令时钟周期(CPI)
- CPU平均每秒访存次数(次) = CPU每条指令访存次数(次)x CPU平均每秒执行的指令数(IPS)
-
🐚主存带宽【12年】
- 满足CPU访存需求【最低】
- 主存带宽(B/s) = CPU平均每秒访存次数(次/s)x Cache缺失率(%)x 页块大小(B)
- 存储模式理想状态【最高】
- 低位交叉存储模式【流水线】,主存带宽(B/s)= 存储器的工作频率(Hz) x 存储总线宽度(B) = 存储体数量(个)/ 存储体的存储周期(s)x 存储总线宽度(B)
- 满足CPU访存需求【最低】
-
🐚访存时间【13年】
- 访存周期 = 发送地址和读命令周期 + 存储器准备周期 + 总线传输周期
- 不支持猝发,串行存取:访存次数 x 每次的访存周期 = 访存次数 x (发送地址和读命令周期 + 存储器准备周期 + 总线传输周期)
- 支持猝发,串行存取:发首地址和读命令周期 + 访存次数 x(存储器准备周期 + 总线传输周期)
- 支持猝发,流水线存取:发首地址和读命令周期 + 存储器准备周期 +(访存次数-1)x 单个存储体准备周期 + 总线传输周期 = 发首地址和读命令周期 + 存储器准备周期 + 访存次数 x 总线传输周期【一般情况,单个存储体准备周期 = 总线传输周期】
-
-
🐋辅存
- 簇号物理地址【19年】
- 柱面与磁道:磁盘有300个柱面,每个柱面有10个磁道,表示该磁头并行连接10个磁盘【即在同一个柱面上磁道的数量】,每个磁盘的磁道号容量为300
- 文件簇的顺序编号:先以扇区递增,再以盘面递增【减少寻道】,再以磁道号递增;呃【0,0,0】→【0,0,1】→【0,1,0】→【0,1,1】→【1,0,0】...
- 柱面号、盘面号、扇区号
- 柱面号 = 簇号 / 单个柱面簇容量 = 簇号/【柱面磁道数 x 扇区数 x 扇区容量 / 簇容量】,结果向下取整
- 盘面号 = 【簇号 - 柱面号 x 单个柱面簇容量】 / 单个盘面簇容量 = 簇号% 单个柱面簇容量 / 单个盘面簇容量,结果向下取整
- 扇区号 = 【簇号 - 柱面号 x 单个柱面数据容量 - 盘面号 x 单个盘面的容量】 / 单个扇区簇容量 = 簇号 % 单个扇区簇容量
- 地址码长度【22年】
- 磁盘地址码长度 = 驱动器号 + 磁道号 + 盘面号 + 扇区号
- 访存时间【22年】
- 访存时间 = 寻道时间 + 旋转延迟 + 传输时间 (+ 控制时间),一般情况 寻道时间 > 延迟时间 >> 传输时间 > 控制时间
- 寻道时间:若为平均寻道时间,通常题目已知;若求具体寻道时间,则等于 磁头移动速度 x 移动距离;
- 旋转延迟:平均每次访存磁盘旋转一半,延迟时间(s) = 1/2 * 单位时间(s) / 转速(r/s)
- 传输时间:磁盘旋转一周时,磁头划过每个扇区的平均时间,传输时间(s)= 磁盘旋转一周的时间(s)/ 扇区数 = 1 / 转速(r/s)/ 扇区数
- 控制时间:磁盘控制器的信号传输延迟时间,通常题目已知
- 簇号物理地址【19年】
-
🔚结语
😶🌫️博文到此结束,写得模糊或者有误之处,欢迎小伙伴留言讨论与批评,督促博主优化内容~
🌟博文若有帮助,欢迎小伙伴动动可爱的小手默默给个赞支持一下,博主肝文的动力++~
🌸博主可能会佛系更新思维导图,在这里:
计算机组成原理_梅头脑_的博客-CSDN博客https://blog.csdn.net/weixin_42789937/category_12434026.html?spm=1001.2014.3001.5482操作系统_梅头脑_的博客-CSDN博客https://blog.csdn.net/weixin_42789937/category_12434025.html🌸博主也有整理数据结构学习笔记,在这里:
数据结构_梅头脑_的博客-CSDN博客https://blog.csdn.net/weixin_42789937/category_12262100.html?spm=1001.2014.3001.5482https://blog.csdn.net/weixin_42789937/category_12262100.html?spm=1001.2014.3001.5482