计算机组成原理3.7虚拟存储器

桃浪十七丶
• 阅读 1319

3.7.1虚拟存储器概念

3.7.2页式存储器

主存和Cache之间是分块映射存储,同样,利用局部性原理,也可以将主存和辅存之间进行分块映射存储。 举个粒子,假如现在使用微信文字聊天,该部分程序占用大小了4KB的空间,那么可以分为大小位1KB的四块,分别映射存储到主存中。如下图,计算机组成原理3.7虚拟存储器 分页式存储,在这个问题中就是把程序进程逻辑上大小相等的四块页面,每个页面大小与主存块大小相等,可以离散的存储到主存块中。 那么,4KB的程序被拆分成四块存储到主存后,要如何执行该程序呢?这个问题留到3.7.3.3部分来回答。

3.7.3页式虚拟存储器

3.7.3.1页表

虚拟存储,如上文提到的微信文字聊天,假设微信程序大小1GB,主存大小只有512MB,在文字聊天时候不需要把全部的微信程序相关数据调入到主存,只调入需要的4KB,剩余的空间可以继续调用其他程序进程,512MB大小的主存可以运行许多个1GB的程序,这就是虚拟存储。 关于分页式虚拟存储,依然借用学习讲义里的图片,计算机组成原理3.7虚拟存储器 逻辑页号:记录程序数据在逻辑地址的哪一块地址页中。 主存块号:记录程序数据在主存储器的哪一块主存中,与逻辑页号有映射关系。 外存块号:记录程序数据在辅存的哪一块。 有效位:初始化位0,记录某一块程序数据所在的逻辑页面是否被调用到主存中,若是为1,若否为0。 访问位:初始化为0,记录某块程序数据被访问的次数,用访问位帮助实现页面替换,需要替换时优先淘汰访问位记录数较小的。 脏位:初始化为0,发生数据修改时变为1。

举个粒子,假设要访问逻辑页号为1的数据,则从页表中找到对应的对应逻辑页号,有效位是1,则直接根据映射访问主存块号位2的主存块,并且访问位+1。假设访问逻辑页号为3的数据,根据页表找到逻辑页号,有效位是0,主存中没有数据,则需要到辅存中找到外存块号为d的存储块,将数据调入到主存中,有效位修改为1,访问位+1;若对该块数据进行修改,则脏位0变1,这一块数据被替换掉时,需要把数据写入辅存。 这一部分主存和辅存的关系,与Cache和主存的关系类似。

3.7.3.2快表(TLB)

与Cache和主存的关系类似,利用程序局部性原理,访问的某块数据,如上文的4KB程序进程,可能会在未来一段时间内继续访问。将刚访问过的页表复制一份,放入用SRAM制作的更高速存储器中,后续将逻辑地址转换成物理地址时直接访问快表。与Cache类似,快表也需要替换算法,这需要学习OS才能明白。

3.7.3.3关于页式虚拟存储器执行过程

先把关于页表的详细工作流程贴上来。 计算机组成原理3.7虚拟存储器 这里需要先了解一个定义,页表基址寄存器。CPU中,每一个进程都有一个页表基址寄存器,存储相应进程的页表首地址,页表首地址对于页表相当于数组首地址对于数组的关系。

举个粒子,假设一台小型计算机,Cache为8KB,主存为4MB,辅存为1GB。要调用4KB=2^12^B的聊天小程序,程序中有一个变量X的逻辑地址是001000000011。 现在需要其中的2KB=2^11^B文字聊天进程,CPU中页表基址寄存器寻找页表,根据页表将程序逻辑地址转换成物理地址,根据物理地址同时从Cache和主存中寻找,由于是第一次调用该程序,因此Cache未名中,因此CPU会继续到主存中寻找,从辅存中把所需数据调用到主存,再把2KB的数据从主存复制一个数据副本到Cache中,提供CPU调用程序。下图是整体流程, 计算机组成原理3.7虚拟存储器 题目中已知4KB数据,假设分成大小相同的四块逻辑页面,其中2KB被调用,4MB主存块号的块内地址和逻辑页面的页内地址,地址长度相同,因此逻辑页面和块内地址的详细分配分别是,计算机组成原理3.7虚拟存储器 计算机组成原理3.7虚拟存储器 题目中已知001000000011是程序变量X的逻辑地址,逻辑页面的页内地之长度为10位,因此逻辑地址后10位存入逻辑页面,前两位00作为页号。主存块的块内地址与逻辑页面的页内地之是一样的,因此根据主存块块号与页内地址拼接出最终需要的物理地址。

3.7.4段式虚拟存储器

段式虚拟存储的具体实现需要在OS中学习,这里不再赘述。 计算机组成原理3.7虚拟存储器

3.7.5关于Cache和虚拟存储器的比较

虚拟存储由主存和辅存完成,需要操作系统和硬件共同完成,Cache由硬件实现。 虚拟存储器解决存储容量不足的问题,Cache解决CPU和主存速度部匹配的问题。 两者的替换算法思想相同,且有依据了程序局部性原理,两者都有价格、容量、速度的梯度。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
桃浪十七丶 桃浪十七丶
3年前
计算机组成原理3.6高速缓冲存储器Cache
3.6.1Cache工作的基本原理利用程序访问的局部性原理,包括空间局部性和时间局部性。举个粒子,比如现在使用Chrome浏览器,后台还在运行网愈云音乐,之前使用了VSC和绘图,则Cache把主存中存放的Chrome和网愈云的相关数据暂存到Cache块中,VSC和绘图工具依然保留在主存中。当我需要使用VSC时,Cache又会把VSC的相关数据暂存到Cach
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Stella981 Stella981
2年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
IO 的底层实现问题
最近在看JAVANIO的相关知识,了解一下IO的底层实现原理。IO涉及到的底层的概念大致如下:1)缓冲区操作。2)内核空间与用户空间。3)虚拟内存。4)分页技术。一,虚拟存储器虚拟存储器是硬件异常(缺页异常)、硬件地址翻译、主存、磁盘文件和内核软件的完美交互,它为每个进程提供了一个大的、一致的和私有的地址空间。虚拟存储器的
Wesley13 Wesley13
2年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这