网站建设信息发布平台,做少儿培训网站的公司,可以进行宣传的网络平台,电销数据购买平台cpu执行程序的基本过程
译码器 输入为n管脚#xff0c;输出为2^n根管脚#xff0c;编号为从0到2^(n-1)#xff0c;用少的输入端控制更多的输出端最常用的是三八译码器AD(Address bus)地址总线: 选中一行数据每一行 8bit 组成8吧B cpu输入端32根线#xff0c;输出端就可以控…cpu执行程序的基本过程
译码器 输入为n管脚输出为2^n根管脚编号为从0到2^(n-1)用少的输入端控制更多的输出端最常用的是三八译码器AD(Address bus)地址总线: 选中一行数据每一行 8bit 组成8吧B cpu输入端32根线输出端就可以控制 2^32 ,因此可以控制4G内存DB(Data bus)数据总线: 8根数据线组成数据总线确定了每一列通过行和列将1B数据数据通过数据总线传输到cpu内部的寄存器里面使用R表示寄存器程序最终是一条一条被读入寄存器内执行的有限 且按照功能进行分类有通用寄存器和特殊寄存器特殊寄存器只能被特殊的指令访问用户态(访问通用寄存器) 内核态(访问特殊寄存器和通用寄存器)内存条是一个临时的保存中介磁盘是一个永久的保存中介地址总线的选中原理 译码器原理了解四大类存储器的速度和所处的位置 容量大小寄存器 (cpu内部) cachecpu内部 内存卡 cpu外部 磁盘cpu外部寄存器只会保存数据cache也需要将数据拷贝到寄存器里面执行ALU 算数逻辑运算单元 负责运算举一个例子 计算机计算 32 计算器读取3 将3读到R1寄存器然后读ALU会读因为需要两个数因此通过地址总线形成地址将2读到R2寄存器计算通过R1和R2取数据然后将数据计算结果存到寄存器R3然后找地址将数据结果存储到内存的一个位置(写回内存)。CPU位数 OS位数 内存地址总线数 内存数据总线数 逻辑地址位数 物理地址位数
cpu位数 和 寄存器的位数相关如果寄存器的个数是32则cpu是32位如果寄存器个数是64则cpu是64位。32位的寄存器可以处理2^32大小的数据64位的寄存器可以处理2^64大小的数据os位数操作系统的位数硬件限制软件软件可以自定义(软件分成32位或者64位)os位数等价于逻辑地址的位数二者相等。也等价于虚拟内存的理论大小。32位cpu只可以安装32位操作系统64位cpu既可以安装32位也可以安装64位操作系统数据总线数 如果是8根 如果传输32位数据需要传输4次64位 传输数据 需要8次现实生活中有 8 、16 、32 和 64根数据总线数据总线一般考研常规使用的是8根数据总线 每次可以传输8位数据如果寄存器的大小是32需要传输4次将数据填满一个寄存器如果是64位寄存器需要传输8次将数据填满一个寄存器可访问内存的大小 磁盘大小 大于等于 虚拟内存的实际大小虚拟内存理论大小 大于等于 虚拟内存实际大小但是现实生活中有 16位 32位 64位数据总线物理地址总线数 (物理地址总线数)比如上面的例子中地址总线有32位每一个地址是由32位0或者1组成从硬件限制可访问内存的大小。这里属于1硬件限制限制了可访问内存的大小。比如电脑是32位的那么根据可以访问的物理地址总线有0-2^32-1,也就是4G的内存即使安装8G的内存条剩余的空间是无法访问的。或者2内存卡限制比如32位机器安装2G内存卡剩余的空间无法访问或者3软件限制比如译码器原理限制输入端输入的位数限制输出端可以访问的地址三个限制 取最小值作为可访问的内存大小逻辑地址 是将程序从磁盘拷贝到内存可以拷贝最大的行数这个和操作系统的位数有很大的关系内存管理逻辑图
程序经过编译和链接形成exe程序从磁盘将程序装入内存执行进行程序的运行装入1如何装入2装在哪里(1)记录 表格 (2) 查询 表格编译和链接
编译将C语言转化为汇编语言机器语言各个模块的逻辑地址逻辑地址也叫做相对地址链接 将多个有交集的汇编语言、机器语言合并到一起会改变先前的逻辑地址经过编译链接之后形成可执行文件LOAD 16 将第六行的变量加到寄存器1里面ADD 18 将第8行变量和寄存器1里面的数据相加STORE 110 将计算的结果(寄存器1中的数据)存储到第10行变量C汇编 每一行指令占据两行汇编使用逻辑地址指向变量装入
如果随意装入程序cpu可能无法找到每一条执行程序。因为编译的代码所使用的的指令是相对本程序而言的比如 LOAD 16是将第六行的变量放入到寄存器1里面而cpu会将整个内存条的起始位置作为程序的开始位置因此对这个命令使用的位置6和整个内存条的位置6是冲突的形成地址错位。地址错位 本质上是由于 逻辑地址和物理地址不匹配 造成的冲突物理地址是绝对的逻辑地址是相对的将程序从磁盘 拷贝到 内存 其逻辑地址会发生变化指令后面所使用的相对地址也要随之变化才可以运行。程序编译使用的是逻辑地址(相对地址)内存卡使用的是物理地址(绝对地址)。OS位数和逻辑地址的位数 是等价的。如果程序编译很长超出位数的代码无法识别不可以超过机器程序(2^操作系统的位数)的大小。C语言中 函数名字和变量名字本质上都是地址解决方案 1绝对装入2静态重定位装入3动态重定位装入解决虚拟地址和物理地址错位的三种方法
1绝对装入
装入前就确定好程序的装入位置使得程序逻辑地址和物理地址对齐不错位开发程序的时候就指定我要从 指定的位置上编译程序比如我的程序执行需要将程序拷贝到内存的第1000行以后这样内存地址和物理地址一一对齐不会错位那么这个程序每次运行永远拷贝到指定的位置
2静态重定位装入
装入时候动态指定将程序装入的位置由装入程序的逻辑地址进行一次性修改从而避免错位。每拷贝一行就改变一行中的地址从而避免错位边装入边修改如果不指定都是默认从0开始作为起始地址那么每次执行的程序的逻辑地址都是不同的这个地址是装入前动态设置的因此是 重定位 的概念静态是指这个程序一旦加载到内存地址就指定了就不可以改变了要想移动只可以关闭程序重新指定程序的起始位置
3动态重定位装入
程序运行的时候利用重定位寄存器来弥补作用让cpu认为逻辑地址和物理地址是对齐的不错位将程序原封不动拷贝到内存此时逻辑地址和物理地址是存在一个错位。程序拷贝到内存会创建一个pcb存储相关信息其中入口地址指定程序拷贝到内存的位置。利用CPU内部的重定位寄存器存储上述提到的内存位置。每次运行的时候会在指令的后面 异步加上内存的位置补齐逻辑地址和物理地址之间的错位。如果程序变化程序直接移动直接修改pcb和重定位寄存器里面数值就可以让逻辑地址和程序地址对齐
内存保护
也叫做越界保护内存保护 由 硬件和os操作系统共同保障实现方法1上下限寄存器比如木马程序拷贝到内存中的1000到2000行那么下限是1000上限是2000如果内部程序想访问3500和上下限对比不符合因此报错2基址寄存器(重定位) 限长寄存器(界地址)告诉首地址通过限长寄存器得到程序的占用空间因此得到程序的上限单一连续内存分配
内存卡分为系统区(os操作系统)和用户区(操作软件)用户区每次只可以装入一个程序特点1单用户 单任务2内存卡利用率极低 因为有内部碎片程序只用到了一部分3通常采用绝对装入的方式
固定分区分配
装入多道程序 克服单一连续分配只可以装入一个程序的缺点在用户区进行划分每个区块分配不同的程序划分可以都相等 或者 每个区块的大小不一样减少浪费特点1用户区分成很多小的分区每个分区只装入一道程序2分区的大小很有讲究太小装不进程序太大内存利用率低3有内部碎片(内部碎片内存分给你了你没有合理使用内存就叫内部碎片)*外部碎片内存空间除去分给程序的各个分区之后剩余的空间不足以放下任何程序这个剩余的空间不属于任何程序叫做外部碎片需要分区说明表 记录分区号 分区的大小 起始位置 状态提交程序的时候查看哪一块内存是空闲的一般使用静态重定位技术动态程序分配
解决固定固定分区提前设定分区大小的弊端进程程序要多少给你多少不多分配不少分配。如果用户区间只剩下2MB不足以分配程序那么需要等待先前程序释放资源比如qq退出释放了8MB的内存空间lol立刻占用这8MB中的6MB剩余2MB这2MB就是外部碎片由于程序的进进出出导致的碎片数量越来越多空间越来越小。进行碎片合并。将很多碎片合并在一起形成一个大的区间这个合并过程是一个随机的事件需要使用紧凑的技术较少外部碎片碎片的 移动 合并这个移动就涉及到了动态重定位动态分区 需要分区说明表每一块分区的大小不确定动态变化如果一个程序加入内存但是有很多区块都可以存放数据那么这个这个程序如何存放呢动态分区算法1首次适应从内存区间头部开始第一次可以存放的位置2最佳适应从内存区间头部开始找一个尽可能不浪费的区块但这个并不是最佳的反而会产生更多小的碎片不可用只能使用紧凑技术合并更多的碎片3最坏适应从内存区间头部开始找一个最大的区块产生的碎片不会很小反而可以给其他程序使用因此不一定是最坏适应4邻边适应每次找合适的区块不是从头开始而是从上一次的位置开始往下找覆盖技术
软件运行有128kb要在64kb的内存上运行覆盖技术要求程序员在设计程序的时候设计每个程序的启动的先后顺序将内部分区分为固定区存储主程序覆盖区用于代码之间的运行、覆盖。特色1用在同一个程序进程中2覆盖技术实现了小内存运行大程序但是这不是万能的3对程序员要求高 考虑性能
交换技术
交换技术发生在内存紧张的情况下交换技术主要用于不同进程(程序)之间覆盖技术已经过时交换技术仍然存在将处于阻塞状态下的程序拷贝到交换区域将需要运行的程序拷贝进入内存区交换是指内存和磁盘之间的交换分页
基本分页存储
先前使用的固定分区分配产生内部碎片动态分区分配会产生外部碎片。每个碎片可能很小但是积少成多总和是一个不小的浪费分散分配将大的程序进行拆分变成很多的小的碎片每个碎片分别拷贝到内部或者外部产生的碎片中。但是以什么作为标准进行切分呢大小不等切片很难。因此引入分页思想都切成一样大小的特色1程序可以被切块2内存也可以被切块3切块越小浪费越小因为碎片的大小是随机产生的因此对程序的切片不好处理思路很简单实现很难
如何分页
将内存卡(物理地址)和软件程序(逻辑地址)都等分成4kb然后将软件程序的拷贝到内存卡上面执行程序的大小和物理内存的分块大小都一致但是如果不可以整除会有部分浪费但是这种浪费很小。内存、磁盘、程序都会被切块内存卡的一块叫做 页框(页帧)程序的片段叫做页面页面可以被装入页框中磁盘的分块叫做 磁盘块磁盘 程序 和 内存 都按照4kb进行切割这样程序导入 磁盘和内存都很方便切片的大小需要符合2的指数2^0 1; 2^2 4; 2^4 16;为什么分块使用4kb这个不确定有1Kb、16kb和32kb4kb最常用都是2的n次方的整数倍设置mmu就可以实现对内存、程序和磁盘的kb大小的选择切换1kb、4kb和16kb
页表
内存卡的分块编号从0开始排序其编号也叫做物理块号、页框号、页帧号程序 切分也会进行编号从0开始其编号叫做页号、页面号将内存卡切分的编号和程序切分的编号对应起来叫做页表。这个页表存储在内存中每个进程都有自己的页表。创建进程的同时会创建pcbpcb会存储这个页表的信息从而让操作系统找到这个页表页表有俩列好多行第一列存储页号存储逻辑地址第二列存储物理块号也是物理地址页表项 是 页表的一行页表 通过pcb被查询到页表只能记录块和块之间的映射关系4kb 可以存储很多的代码因此不会得到每一行代码在哪一块中的哪一行等相关信息页表、物理地址、逻辑地址三者之间的关系
数学关系二进制向左移1位表示十进制除以2人类视角 十进制 整除取整为页号求余为业内偏移机器视角 二进制 高位为页号低位为业内偏移32位 以4k作为一个页4k 2^12 因此低12位作为页内偏移12到32位作为页号读高20位得到哪一页(页号)读低12位知道属于哪一行(业内偏移)通过逻辑地址 - 页表(页号) - 通过页表里面的逻辑地址和物理地址的对应关系找到物理块号将物理块号 和 业内偏移合并在一起就得到了物理地址逻辑地址和物理地址里面的业内偏移 是一一对应的因为把程序切片拷贝到内存代码里面的地址是相对的起始到终止的差距就是业内偏移。物理块号代表这个物理块开始的地址加上这个代码的业内偏移也就是物理块结束的地址。编号为何从0开始整除取整直接得到页号
基本分页 基本地址变换机构
对逻辑地址进行上面的操作就可以得到页号通过页号查询页表查询到某一页程序被装载到内存中哪一个物理块里面查询到物理块之后和业内偏移量拼接在一起构成一个物理地址上面这些需要使用到地址变换机构才可以得到业内偏移等信息逻辑地址 前20位表示页号后12位表示业内偏移量。 通过页号 和 匹配的物理块号对应页表存储在内存里边页表记录的是页号和物理块号(页框号)的对应信息页表寄存器存储在cpu里面前半段存储页表的起始地址后半段存储存储页表长度(程序放到内存里边执行的时候最大的长度)。这个是唯一的一级页表后面会有多级页表动态通过pcb进行更新页表寄存器 相当于给定指针 数据长度得到的这一块内存就是存储的页表信息页表长度 存储的是所有页号的信息页表长度 * 4KB 程序的大小页号 大于 页表长度说明这个程序不属于当前程序产生 越界中断。如果小于 则属于合法的就可以进行查表CPU先根据页表寄存器里边存储的页表起始地址找到 页表开始的地方根据页表存储的页号在页表里面查询。通过页号找到后面存储的页框号(物理块号)将页框号(物理块号) 和 业内偏移量拼接在一起就形成了物理地址pcb更新页表寄存器的数值
考点
执行一条指令一共会访问几次内存执行指令需要物理地址1寻找物理地址2读入cpu内部3执行指令1寻找物理地址利用页号到内存里边的页表查询物理块号拼接形成物理地址一次访问内存2读入cpu内部找到物理地址需要将指令拷贝到CPU的内部一次访问内存 然后执行命令一级页表的前提下需要访问两次内存如果是两条指令 则是4次具有快表的地址变换机构
快表也是页号和物理块号的拼接相对存储在内存中的页表快表存储在页表寄存器是比页表先一步被访问。主要的目的是记录先前曾经访问过的历史记录类似于电脑的快捷访问为了减少访问内存的次数但是存储的条数很少。因为存储在寄存器因此CPU先调用寄存器很快如果找不到才会访问内存。因为快表会保存最新的访问记录是一个动态更新的过程因此在访问内部指令的时候有可能会查到有可能查不到有一定的概率。这个叫做命中率局部性原理 时间 空间问题执行1条指令命中率是90%那么需要访问几次内存如果快表存在 1次如果快表不存在需要两次乘上对应的概率 总的访问内存次数 0.9 * 1 2 * 0.1 1.1因此执行10条指令命中率是90%那么需要访问几次内存 10 * 1.1 11次相较于没有快表2 * 10 20次快表 命中率很高 是因为程序的局部性原理也就是for等循环在这个地方执行很多次局部原理 体现在时间和空间局部性两级页表
引入两级页表的原因 一级页表 页号 物理块号 组成的页表项一共有n个页表项一个页表项有多大估计估计的逻辑1逻辑地址 (程序最大空间) - 2,页面大小 (视情况而定4kb、16kb) 3做多分几页4页号位数5估计页表大小项 补充页表项确定之后一个页表项有多大 因为一个页表很大如果多个页表进入内存会很卡考虑到分页的时候程序和内存都可以被分块页表是不是也可以分块发明一个页表记录页表的切块变成了两级页表的概念如何设计两级页表
条件32位操作系统 4kb页面大小 4B页表项大小设计1按照最大程序进行切割2页表切块块大小 页面大小3当一个页表可以装在一个页面之内时多级页表就设计结束4逻辑地址切块块位数 该级页表每块容纳的页表项如何设计多级页表
条件64位操作系统 4kb页面大小 4B页表项大小设计1按照最大程序进行切割2页表切块块大小 页面大小3当一个页表可以装在一个页面之内时多级页表就设计结束4逻辑地址切块块位数 该级页表每块容纳的页表项虚拟内存
引入请求分页的原因
将QQ程序拷贝到磁盘由于文件管理将qq程序在磁盘上进行存储。运行的时候将QQ程序从磁盘拷贝到内存QQ程序的登录界面只会执行一次体现了一次性如果他只执行一次却一直留在内存会导致内存的浪费驻留性。因此 需要优化一次性和驻留性优化的依据程序的局部性原理程序中有太多的循环太多的模块如何优化按照需要分批装入、调出 - 请求分页存储管理 虚拟内存请求分页管理的操作流程 - 运行程序之前为程序分配小于整体大小的内存空间比如先装入登录模块的程序登录完成之后将登录模块的程序调出将需要的程序按照需要逐个装入。请求分页的工作原理
在内存的一个地方存储一个QQ程序的页表查询页表实现逻辑地址和物理地址的转换从而得到程序的片段存储到物理磁盘的哪一个块里面以及存储在物理块里面的哪一行在cpu的内部存储一个快表快表是程序的页表历史记录的备份。因为基本分页页表是存储的QQ程序切割之后存储到内存中物理块的对应的逻辑信息请求分页的工作原理1大致的流程一致但是页表记录的信息不一样。因为按照需求需要将文件切片动态的植入换出这就需要记录哪些页面已经在内存中页面执行的次数等信息因此引出了置换算法动态将需要的页面放入内存中替代先前的使用过的不需要的页面基本分页页表 记录了每一块的逻辑地址和物理地址的对应关系但是 对请求分页页表而言有的时候找不到这个块还没有装载到内存中需要将这个块替换到内存中分配的驻留集里面来使用。相较于基本分页请求分页对逻辑地址和物理地址的对应关系虽然也需要通过页表但是并不简简单单期间多了mmu虚拟地址到物理地址翻译助留集 和 工作集是一个意思
二者是一个概念就是操作系统给单个进程分配的几个物理框所装的页面的集合每次程序运行的时候需要将程序从磁盘拷贝到内存根据生存时间的不同分为主程序页面 (常驻内存的页面) 和 子程序页面比如 主程序界面作为一个界面UI这个常驻内存除非程序退出或者异常退出而不同的功能就是子程序需要的时候调入内存执行使用完之后调出内存驻留集的大小不能过大如果过大退化为基本页表浪费内存如果过小置换页面发生频繁运行程序的时候会很卡要适中相对的概念
三种策略 分配助留集的大小的策略
固定分配局部置换计划经济策略非常死板计划赶不上变化程序是变化的局部是指按照需求所需的只可以替换自己事先分配好的页面可变分配全局替换低级的市场经济策略盲目扩大生产产业泡沫如果程序需要更大的内存空间会进一步动态增加驻留集的大小但是会导致装入程序的数量下降先前分配给程序的驻留集不会减少可变分配局部替换高级的市场经济策略抽肥补瘦动态调整十分灵活减少缺页率。每个程序所需要的驻留集的大小是动态调整的缺页率 当分配的物理块(驻留集)一定的时候调入和调出的频率是成正比可变分配局部替换在n1 n2之间动态变化协调缺页率和物理块数量之间的关系页表改进 和 缺页中断
基本分页是将程序所有的内容拷贝到内存中请求分页是按照需要将需要的装入内存动态装载调出请求分页页表 具体列字段如下页号 0 - n物理块号 状态位 有效位标志是否在内存中否则缺页中断并且进入阻塞状态如果物理块有数据但是状态为0表示并没有被装入状态位控制物理块是否有效有效的位数要小于驻留集的大小如果产生缺页中断利用调度算法从磁盘将需要的页拷贝到内存外存地址 磁盘块号如果需要的页不在内存需要从磁盘块导入页为置换算法提供参考使用的参数 访问字段统计使用区分程序是长期使用还是短期使用执行次数越少的越容易被调出、修改位对于变量的数值修改需要从内存改回磁盘、使用位clock算法使用等如果需要的页不在内存中 就会产生缺页中断然后从磁盘里面取页面到内存中替换
页面调度时机
程序开始运行的时候使用预调页策略局部性原理程序员指定的main函数操作系统底层将其作为程序的入口程序的运行过程中 修改请求页表相关信息程序运行中发生缺页时比如程序启用不同的功能调入一页页面请求调页策略页面置换算法使用硬件中断中断处理程序启用页面置换算法将新的页面替换旧的页面
置换算法
OPT页面置换算法 最佳 向未来看
算法思想淘汰以后永不访问 或者 将来最长时间不再访问的页面算法特点不可以预测未来因此这个算法不能实现推断出 缺页中断次数 / 页面置换次数 缺页次数 - 页面置换 工作集(驻留集)理想化很难实现因此其余算法是不可能超过他的发生缺页中断的时候 除了刚开始没有数据剩余的都会发生页面置换下面的例子 发生了9次缺页中断FIFO页面置换算法
算法思想淘汰先调入的页面队列实现 算法特点简单、性能差、且有belady异常推断出 缺页中断次数/页面置换次数15次中断 15-3 12次 页面置换LRU算法 最近未使用算法 向历史看
算法思想淘汰最近未使用的页面 使用过去来预测未来算法特点性能优异接近最佳置换算法需要硬件栈的支持开销极大推断出 缺页中断次数 / 页面置换次数CLOCK算法 又叫NRUNot recently used
算法思想通过钟表扫描法淘汰最近未使用的页面页表增加一个使用位首次装入置1再次访问置1扫描时将1变为0算法特点由于最近未使用和最久未使用的思想接近因此CLOCK 算法和LRU算法性能很接近推断出 缺页中断次数 / 页面置换次数但是CLOCK算法性能更高不需要硬件而LRU算法需要硬件栈的支持改进CLOCK算法
算法思想通过钟表扫描法淘汰最近未使用的页面中未修改页面(u,m) use modify(0,0) 未使用未修改(0,1) 未使用已修改(1,0) 已使用未修改(1,1) 已使用已修改算法特点相比CLOCK算法减少了页面回写磁盘的概率从而省却了回写的时间 (I/O时间)对变量的数值修改会导致内存和磁盘数据的不一致因此要根据修改的内容更改磁盘数据先淘汰未使用的就减少更新数据所带来的IO操作算法步骤1按照钟表扫描法寻找(0,0)用于替换找不到就进行第二步2重新执行钟表扫描算法寻找(0,1)用于替换在扫描中将(1,0)改为0011改为01找不到回到第1步注意事项第1步只查不修改第二步边查边修改改进CLOCK算法更加细腻
从何处调入页面调出的页面存放在哪里
临时存放程序的副本 - 磁盘必须要有一块对换区swap可修改程序 - 变量 已修改 / 未修改可修改程序如果已经修改回写磁盘写到对换区里面的程序副本里面不可修改程序 常量如果对换区很大的时候每次运行的时候将程序拷贝到对换区程序运行的时候是将对换区里面的程序拷贝到内存对换区大小问题运行程序将程序从文件夹拷贝一份到磁盘的对换区然后从兑换区拷贝程序到内存区对换区足够大从磁盘的对换区将数据文件拷贝到内存对换区不够大对换区只装入可修改程序不装入不修改程序不可修改程序从程序安装文件夹读取unix 方式读取文件都是从程序安装文件里面但是回调的时候无论是可修改程序还是不可修改程序都写到对换区里面然后第二次以后就会从对换区进行数据交互1从何处调入页面从磁盘的对换区将数据文件拷贝到内存2调出的页面存放在哪里将修改的内容回写到对换区不可修改程序不会回写到文件夹不对源文件进行操作防止不同用户之间的数据干扰程序安装目录是原件对换区拷贝的是程序的副本虚拟内存的大小
虚拟内存 小于等于 逻辑地址支持的最大空间(软件限制) 软件支持的容量很大不需要考虑一般硬件限制就是虚拟内存可以支持的最大内存磁盘装载大程序的一部分 内存装载大程序的一部分合起来使大程序在小内存内运行通过对换区实现数据的交互64位OS - 2^32 * 4GB32位OS - 4GB虚拟内存 小于等于 内存卡 磁盘硬件限制用小内存运行大程序考题形式在一台实现了虚拟内存技术的计算机里面最大支持运行多大的软件游戏由程序、数据、模型(人物)、过渡动画等组成
抖动现象
发生时间如果驻留集不够大的话置换页面时就可能会产生抖动现象(对换区 和 内存区 之间交换数据)又叫颠簸特点1频率高2来来回回
虚拟地址和物理地址之间的翻译
CPU执行一条指令的过程
通过地址翻译由虚拟地址得到物理地址先查快表再查页表通过物理地址将指令读到CPU内的寄存器ALU里面执行页表 页号、物理块号、有效位 三个最关键快表查询直接映射(Hash查找)、全相联映射、组相联映射全相联映射快表和页表一样查询的时候需要从头查到尾因为 全相联映射 内部存储的条目是无序的查询比较浪费时间因此改进为组相联映射2路组相联映射是指将先前的两个条目组合在一起形成一组相较于先前的全相联映射多了组索引、TLB索引他俩是通过 页号 进行分解得到的。虚拟地址逻辑地址结构将先前全相联映射中的页号p化为TLB标记和组索引、业内偏移w不变如果是8条目2路组相联分成四组将页号的后两位00011011表示组号作为组索引剩余的作为TLB在组索引唯一的条件下TLB是唯一的标识只有地位作为组索引高位仍然满足递增序列且唯一虚拟内存-虚拟地址到物理地址的翻译 例题
系统满足如下条件
有一个TLB与一个datacahe存储器以字节为单位进行编址 以字节为单位进行编址一行8bit作为一个地址一行作为0两个字节为单位进行编址将先前的两行编为0全字四个字节编址虚拟地址14位物理地址12位页面大小64BTLB四路组相联共16个条目data cache是物理地址直接映射行大小为4字节总共16组请翻译虚拟地址0x03d4 ;0x00f1 ;0x0229有快表先到快表里面查询将虚拟地址按照快表的格式进行切分基本分段管理
基本分页是将程序所有文件以4kb作为一个切块存储在磁盘的一段空间基本分段是按照功能或者模块将相关联的代码作为一个整体分散存储在磁盘中分段的好处程序多开时可以共享数据分段可以实现程序多开或者多个程序公用一个程序段比如qq程序开了两个登录不同的qq号但是有些功能是共享的比如网络因此将网络的代码进行复用
如何进行程序分段
按照程序(进程)自然段进行划分这个流程是由编译器决定的段长每段段长都可能不一样和程序本身的结构相关分页有页表记录程序转入到内存的位置那么分段也应该有段表功能一致记录页表记录程序的哪一页被记录到内存中的哪一块段表记录程序的哪一段被记录到内存中的哪一块段表
基本分段的段表每个进程都有自己的段表段号、段长、内存起始地址因为段长不一样不可以向页表一样使用物理块号等分因为每一块大小都是4kb因此可以通过 物理块号 * 4kb 计算得到物理地址通过段表 共享数据分页存储管理通过查询快表和页表将逻辑地址翻译为物理地址从而cpu可以到具体的位置执行指令
物理地址、逻辑地址和段表之间的关系
段号、段内偏移段内偏移w由于每一个程序段的大小不一样以最大的作为段内偏移到段表查询得到物理的起始地址b则物理地址等于b w低16位表示段内偏移 请翻译逻辑地址 0x000301F4分段地址变换机构
计算机步骤1根据逻辑地址的前几位得到段号如果段号大于段表存储的最大长度(段表长度)则产生越界中断否则合法2如果合法 通过起始位置 段号 * 段表项长度 段表项地址 得到段表项地址b3通过 Ebw 段表项地址 段内偏移 物理地址cpu执行一条指令 需要访问几次内存两次 1地址翻译需要查询段表得到物理地址2通过物理地址到内存读取cpu指令到cpu内部执行分页和分段的地址空间维度
分页的地址空间是一维的因为只要给定页面大小这一个参数就可以划分逻辑地址的结构比如每个大小都是4kb4kb 2^12B因此业内偏移是12位页号占了20位分段的地址空间是二维的不可以通过段长计算段号和段内偏移的位数因为每段的长度都不一样因此需要给出这两个参数
基本段页式管理综合段式 和 页式
引入段页式原因
页式存储管理通过程序与内存的切成小块分散和分配内存减少内存碎片提高内存利用率。机器的角度段式存储管理通过将程序先按照自然段模块进行分段达到通用段可以共享的目的。从人类的角度出发段页式存储管理先将程序按照自然段进行分段再将每个自然段切成等大的页。从而汇聚两者的优势
如何分段和如何分页
先分段 再分页分段由编译器完成将自然段进行分段分页将分号的段按照4kb进行切分每4kb作为一个页不足4kb的碎片会出现不足一页的情况 这样的内部碎片很小且很少因为分成段的数量就很少而且仅仅在最后的时候会产生碎片因此碎片很小且很少段表和页表
段表和页表配合使用之后先前的段表记录段号、段长和段起始地址变成了段号、段长页表长度和页表起始地址因为对每个段进行分页因此每个段都有自己的页表起始地址只有一个段表段表中的每个段表项都有自己对应的页表还实现不了逻辑地址和物理地址的转换需要更进一步操作物理地址、逻辑地址、段表、页表之间的关系
页号p 业内偏移w 分页的逻辑结构 - 查询页表 得到物理地址 物理块号b b|w段号s 段内偏移w 分段的逻辑结构 - 查询段表 得到物理地址 物理块号b bw段号s 页号p 业内偏移w 段页式逻辑结构 - 先查段表再查页表因为先分段再分页
段页式地址变换机构
将逻辑地址变换成物理地址1取出段号S和段号表存储的段号比较如果大于等于最大段表长度则报越界中断错误如果小于等于段表长度查询页表通过起始地址 段号 * 段表项长度 计算得到页表页表的计算方式一样得到物理块号物理块号b 和 段内偏移w 得到物理地址 b|wcpu执行一条指令需要执行几次内存一共需要三次1地址翻译需要查询段表查询页表得到物理地址两次2通过物理地址到内存读取cpu指令到cpu内部执行 一次