计算机系统-虚拟存储器

news2024/11/16 15:35:12

例行前言:

本篇不是学习课程时的笔记,是重看这本书时的简记。对于学习本课程的同学,未涉及的内容不代表考试不涉及(mmap,动态存储器分配,linux虚拟存储器)。本章的大部分内容已经在OS中学习过了,但本章内容介绍虚拟存储器的视角不同于OSTEP中的视角,在学习本节后,应该对虚拟存储器有更全面的了解,包括虚拟存储器的作用,映射机制,地址翻译过程等。地址翻译一节没有完整的包含TLB的翻译过程图,在P545的图中加上TLB就更加完整了,可以自行绘制。

计算机系统-虚拟存储器

虚拟存储器是系统提供的一种抽象,为每个进程提供了一致的地址空间,简化了存储器管理,保护了每个进程的地址空间不被其他进程破坏。虚拟存储器是计算机系统最重要的概念之一,本章主要描述虚拟存储器的工作机制,以及应用程序如何使用和管理虚拟存储。

请添加图片描述

1.地址空间与寻址

寻址

早期的计算机没有虚拟存储器抽象,采用物理寻址方式直接进行寻址。现代处理器都采用虚拟寻址。所有处理器直接处理的都是虚拟地址,访问存储器时,虚拟地址会通过硬件部件**MMU(存储器管理单元)**翻译为物理地址。翻译所需要的一些表和信息存放在主存中,由操作系统管理。

地址空间

虚拟存储器中的地址都在虚拟地址空间当中,与物理地址空间相对应。每个数据对象都在虚拟地址空间和物理地址空间各有一个地址。

2.虚拟存储器

本节主要通过三个角度来理解虚拟存储器的作用和工作机制,这些角度和OSTEP中看待虚拟存储器的方式有所不同,OSTEP中重点介绍的是虚拟存储器到物理存储器的映射方式。

  • 虚拟存储器作为缓存的工具
  • 虚拟存储器作为存储器管理的工具
  • 虚拟存储器作为存储器保护的工具

2.1虚拟存储器作为缓存

虚拟存储器是物理存储器的抽象,而物理存储器(主存)被视为低存储层次的硬盘的缓存在本节,视已分配的虚拟页在物理磁盘上存在(以下三种情况之一),缓存在物理存储器中。从这个角度来说,在本小节提到的虚拟页,都可以直接视为是磁盘上的数据,而本小节的内容,实际上是讲主存是如何作为磁盘的缓存的。

虚拟存储器被划分为固定大小的,作为磁盘和主存等层次之间的传输单元。与之对应,物理存储器也被划分为页。虚拟存储器中的页有三种情况:

  • 未分配的页:在虚拟存储器中不存在,没有分配的页
  • 缓存的:缓存在物理存储器中的已分配页
  • 未缓存的:没有还存在物理存储器中的,存在于虚拟存储器中的已分配的页

DRAM组织结构

用SRAM表示L1、L2等高速缓存,DRAM表示主存。

主存DRAM的不命中由磁盘来处理,而磁盘IO的开销非常大,因此虚拟页通常比较大,通常4KB-2MB。虚拟页以全相联的方式缓存在主存中。为了尽量避免不命中处罚,替换策略也设计得更加精密。且因为对磁盘的访问时间长,DRAM总是采取写回,而不是直写。

页表

虚拟存储器系统通过页表来判断虚拟页是否存在于主存上,如果存在,在哪个物理页上,如果不在,则要到磁盘中找到该页,放入主存。

这些工作是软硬件共同完成的,MMU负责地址的翻译,而OS维护页表等信息,从磁盘读入页等工作。当访存发生缺页和违反存储器保护等异常时,也是由OS的异常处理程序来进行处理。

页表是页表条目PTE构成的数组。虚拟地址空间的每个页有一个PTE(多级页表可以减少页表项的浪费,不为未分配的页分配页表项)。每个PTE都有多个位,存储了许多信息。在这里,重点关注有效位。有效位为有效则PTE中含有虚拟页的物理页号,否则要根据PTE中的地址部分判断页是否分配,如果地址为空,则该页未分配,地址不为空,则地址为页在磁盘上的地址,可以从磁盘中读入该页。
请添加图片描述

缺页

虚拟页不在主存中,即DRAM缓存不命中现象称为缺页。MMU进行地址翻译时,从PTE的有效位得出该页没有缓存到DRAM中,触发缺页异常。

OS的缺页异常处理程序会从磁盘中读入该页到DRAM,可能还需要替换掉其他页,然后修改PTE并返回。异常处理程序返回后将重新执行缺页指令,这次就可以页命中了。

在磁盘和主存之间传送页的活动叫做交换或者页面调度。现代处理器都采用按序调度的方式,只有当不命中发生时,才从磁盘换入页面到主存中。

2.2虚拟存储器作为存储器管理的工具

虚拟存储器的存在使对存储器管理更加便捷,主要有以下四点的体现:

  • 简化链接:独立的地址空间允许每个进程的存储器映像使用相同的基本格式,例如32位Linux系统上.text节总是从0x8048000处开始。这样的一致性简化了链接器的设计和实现,链接器只需要按照规定的映像格式为每个整合的节分配虚拟地址。
  • 简化加载:加载可执行文件和共享对象文件也因虚拟存储器而简化。所有的节被分配的地址,只需要将相应页的PTE标记为无效,并指向磁盘中文件的具体位置,当页被初次引用时,就会自动调入该页。
  • 简化共享:虚拟存储器使不同进程可以将虚拟页映射到相同的物理页面,从而实现进程之间的代码和数据的共享,例如共享库,父子进程的COW。
  • 简化存储器分配:OS可以为进程分配连续的且足够大的虚拟存储器页面,映射到物理存储器的任意页。

2.3虚拟存储器作为存储器保护的工具

虚拟存储器还在映射到物理页的过程中实现了存储器保护。通过PTE的一些额外的位来控制对虚拟页的访问权限,包括读写权限位,访问特权位(SUP)等。如果指令违反了访问权限,就会触发故障,这种异常常被报告为段错误(segmentation fault)。

3.地址翻译

本节说明地址翻译和访问存储的具体过程。

首先,我们要明确一下需要考虑的部件,在实际的计算系统中,关于存储器访问的部件有:Cache,MMU,DRAM(主存),磁盘,TLB。

现代处理器中,通常访问Cache是采用物理地址,这样高速缓存不用处理存储器保护问题,并且也可以实现虚拟页面映射到同一个物理页面。

因此,虚拟地址总是先通过MMU翻译为物理地址,然后到Cache/主存中读取数据。当翻译地址检查到缺页异常或者其他违反访问权限异常时,异常处理程序介入处理。地址翻译所需要的PTE也需要访问Cache和主存读取,为了加速地址翻译,计算机采用TLB来缓存PTE。TLB和Cache一样是一个缓存,因此也有Cache中的组织方式,查找等问题。

综上,地址翻译的过程如下:

  • 处理器产生一个对虚拟地址的访存指令,将虚拟地址VA交给MMU
  • MMU将VA传给TLB,读取PTE。如果TLB中没有VA相应的PTE,则要到Cache、主存中读取PTE,并存入TLB。
  • MMU根据PTE,将虚拟地址翻译成物理地址,将物理地址发送到Cache。如果发生缓存未命中,会访问主存。
  • 高速缓存/主存将数据返回给CPU。

上述翻译过程没有考虑缺页异常,如果MMU通过PTE判断发生了缺页,由OS处理,从磁盘调入页到主存中,重新执行该指令。

4.存储器映射

Linux会将虚拟存储器区域与磁盘上的对象关联起来,初始化这个虚拟存储器区域的内容。虚拟存储器可以映射到两种类型的对象:

  • Unix中的普通文件:区域可以映射到文件的连续部分,如果区域比文件大,用0来填充余下部分
  • 匿名文件:内核创建的全0文件。当第一次引用区域的一个虚拟页面时,会在主存中找到一个页用全0覆盖,更新PTE,不需要从磁盘读取页。映射到匿名文件的区域中的页也叫做请求二进制零的页面

共享对象

一个数据对象可以被映射到虚拟存储器的一个区域,既可以作为私有对象,也可以作为共享对象。映射到共享对象的虚拟存储器区域叫做共享区域,映射到私有对象的虚拟存储器区域为私有区域。

请添加图片描述

私有对象的生命周期的开始和共享对象是一样的。在存储器中只有一份该对象,多个进程共享这个对象,映射到相同的物理存储器。当进程需要写自己的私有区域的数据时,就会触发一个故障,处理程序会拷贝一份数据放在物理存储器其他的地方,作为该进程自己的一份数据。这个过程就是COW(COPY ON WRITE),写时拷贝机制。

fork函数

在理解上述过程后,就能明白fork函数创建新进程的机制了。fork会为新进程创建虚拟存储器,以及页表的拷贝,父进程和子进程的页面都标记为只读,并将区域标记为私有的写时拷贝,当两个进程中的任一个进行写操作时,就创建新的物理页面,复制一份数据,因此父进程和子进程实现了独立的私有地址空间。

execve函数

execve函数加载和执行一个新的程序,替代当前程序。这个过程需要以下几个步骤:

  • 删除已存在的区域:删除当前进程的已存在的区域
  • 映射私有区域:为新程序的代码、数据等创建新的私有区域结构,并建立映射。代码和数据映射到文件中,bss区域映射到匿名文件
  • 映射共享区域:如果程序与共享对象链接,则进行动态链接,将共享对象映射到虚拟地址空间中的共享区域
  • 设置PC,执行程序

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/503793.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SSM架构项目实战(CRM)

开始时间:7月17日 技术架构 (一)Web开发4层开发 视图层(view):展示数据,跟用户交互。《html,css,js,jquery,bootstrap(ext|easyUI&…

代码随想录算法训练营第三十五天 | 两维贪心、重叠区间

860.柠檬水找零 文档讲解:代码随想录 (programmercarl.com) 视频讲解:贪心算法,看上去复杂,其实逻辑都是固定的!LeetCode:860.柠檬水找零_哔哩哔哩_bilibili 状态:能直接做出来。 思路 只需要维…

【java-04】深入浅出多态、内部类、常用API

主要内容 多态 内部类 常用API 1 多态 1.1 面向对象三大特征 ? 封装 , 继承 , 多态 1.2 什么是多态 ? 一个对象在不同时刻体现出来的不同形态 举例 : 一只猫对象 我们可以说猫就是猫 : Cat cat new Cat();我们也可以说猫是动物 : Animal cat new Cat();这里对象在不…

知识推理——CNN模型总结

记录一下我看过的利用CNN实现知识推理的论文。 最后修改时间:2023.05.08 目录 1.ConvE 1.1.解决的问题 1.2.优势 1.3.贡献与创新点 1.4.方法 1.4.1 为什么用二维卷积,而不是一维卷积? 1.4.2.ConvE具体实现 1.ConvE 论文&#xff1a…

聊聊我在阿里第一年375晋升的心得

前言 思来想去,觉得这个事情除了领导赏识大佬抬爱之外,还是挺不容易的,主观认为有一定的参考价值,然后也是复盘一下,继续完善自己。 绩效 首先晋升的条件就是要有个好绩效,那么我们就先基于绩效这个维度…

基于`IRIS`列存储,我们能做什么

文章目录 基于IRIS列存储,我们能做什么简介使用场景如何使用列存储什么情况下使用列储存统计数据数量count计算字段平均值avg计算字段和sum 列存储与行存储区别总结 基于IRIS列存储,我们能做什么 简介 列存储是一种数据存储方式,与传统的行…

Win11-RTX4060安装Pytorch-GPU干货避坑指南

文章目录 1、版本要和pytorch官网对应,CUDA11.8及其对应版本的cudnn2、CUDA Toolkit安装出现自动重启3、Python版本4、配置永久国内镜像源5、要在激活的虚拟环境里安装pytorch6、进入python后检查是否gpu配置成功7、在虚拟环境中启动jupyter notebook8、conda中inst…

【Docker】5、Dockerfile 自定义镜像(镜像结构、Dockerfile 语法、把 Java 项目弄成镜像)

目录 零、学习内容一、镜像结构二、Dockerfile四、基于 java:8-alpine 构建自己的 Java 项目镜像 零、学习内容 镜像结构Dockerfile 语法构建 Java 项目 ① 之前使用的镜像都是 DockerHub 官方提供的 ② 开发者需要将自己的微服务制作为镜像 一、镜像结构 镜像是由应用程序及其…

【新星计划-2023】什么是ARP?详解它的“解析过程”与“ARP表”。

一、什么是ARP ARP(地址解析协议)英文全称“Address Resolution Protocol”,是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确…

ConcurrentHashMap实现原理

1. 哈希表 1.1 介绍 哈希表是一种key-value存储数据的结构,根据key即可查到对应的value。 如果所有的键是整数,我们可用简单的无序数组来表示,键作为数组索引,值即为对应的值 1.2 链式哈希表 链式哈希表本质由一组链表构成。每…

用MacBook实操:docker本地部署mysql+php+nginx坏境

大家好,我拿出我的macbook,带着大家实操用docker部署mysqlphpnginx环境。 之前的小白实操搭建Nginx1.2.0PHP7.0MySQL5.7Thinkphp5项目,看这篇就够了,欢迎阅读。 之前的是服务器上配置环境,现在在mac本地搭建全栈开发环境。 目录…

LiveData详解(实战+源码+粘性事件解决方案)

1. 简介 LiveData 是一种可观察的数据存储器类。与常规的可观察类不同,LiveData 具有生命周期感知能力,意指它遵循其他应用组件(如 activity、fragment 或 service)的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周…

mysql查询之子查询

0. 概念 SQL语句中嵌套SELECT语句,称为嵌套查询,又叫子查询。 查询可以基于一个表或多个表。子查询可以添加到SELECT、UPDATE和DELETE中,而且可以进行多层嵌套。子查询常用操作符有 ANY(SOME),ALL、IN、EXISTS。也可以使用比较运…

Codeforces Round 872 (Div. 2) A-C

Start&#xff1a;May/08/2023 20:05UTC8 Length&#xff1a;02:00 这次总该上分了吧 A LuoTianyi and the Palindrome String 1 s, 256 MB x8531 都一样是-1&#xff0c;普通回文是size()-1 #include<bits/stdc.h> using namespace std; #define int long long #def…

架构-软件工程模块-1

概述 这一模块选择题的分值比较多&#xff0c;案例题和论文也有能用上的地方。主要知识点会特殊标注或说明。 软件开发生命周期 软件工程三要素&#xff1a;方法、工具、过程。不会直接考&#xff0c;但可帮助记忆理解。 传统软件生命周期方法学分为&#xff1a;&#xff08;选…

使用sharding-scaling和sharding-proxy做分库分表数据迁移

背景&#xff1a; 现在有一个有一张表被分成了两张表&#xff0c;t_score1 ,t_score2&#xff0c;但后期数据量激增&#xff0c;两张表不能满足业务需求&#xff0c;扩张为2个库每个库2张表&#xff0c;即数据库 ds_0下有t_score1 ,t_score2 &#xff0c;数据库ds1下有t_score1…

浏览器插件的使用

善于使用浏览器插件&#xff0c;能起到高效上网的作用。 Microsoft Edge 是全球广受欢迎的浏览器&#xff0c;浏览器本身具有快速、简单和轻量级的特点。一流的性能系统和访问速度极大提升您的浏览体验。 对于浏览器的用户来说&#xff0c;安装一些实用的插件&#xff0c;能让…

Navicat设置Oracle数据库主键自增1的方法步骤

一、 创建如下表 Oracle数据库不同于Mysql、Sql Server数据库&#xff0c;Oracle数据库主键自增不能在建表时直接设置&#xff0c;而是需要通过序列和触发器进行设置&#xff01; 二、创建序列 1 2 3 4 5 6create sequence SEQ_DEVICEDATAINFO start with 1 …

iOS可视化动态绘制连通图

上篇博客《iOS可视化动态绘制八种排序过程》可视化了一下一些排序的过程&#xff0c;本篇博客就来聊聊图的东西。在之前的博客中详细的讲过图的相关内容&#xff0c;比如《图的物理存储结构与深搜、广搜》。当然之前写的程序是比较抽象的。上篇博客我们以可视化的方式看了一下各…

数据库(Sql server语言)(一)

例题&#xff1a;&#xff08;不介绍创建和插入&#xff09; star表 ●查询每个组合的名称及其成员个数 select g.name,count(*) 成员个数 from star s,stargroup g where s.gid g.gid group by g.name 如果不写where s.gidg,gid会出现成员个数重复 ●查询身高最高的团…