页表:从虚拟内存到物理内存的转换

目录

引言

虚拟内存

页表

单级页表

页表项

单级页表的不足

二级页表

四级页表

快表TLB

结语


引言

一个系统中,CPU和内存是被所有进程共享的,而且一个系统中往往运行着多个进程。如果一个进程不小心写了另一个进程的内存,那么被写入的进程可能会发生一些迷惑行为。

虚拟内存

一个进程,只有在它运行起来的时候才知道它实际占用哪块内存,程序员在写代码的时候是无法确定的。为了实现独立编址,既不考虑内存是否能容纳整个程序,也不考虑程序最终是在内存中的什么位置,大佬们突发奇想,能不能等到程序运行时,才为每一个程序分配一定的运行空间,由地址转换部件将编程时的地址转换成实际物理内存中的地址呢? 当然可以!于是,就引入了虚拟内存技术。

关于什么是虚拟内存,举个例子:假设你开了一家“超能快递公司”,但真实的仓库(物理内存)只有一块很小的场地(比如100㎡)。不过你打广告说:“我们有10个足球场大的货架空间!(虚拟内存)” —— 吸引无数顾客(程序)来寄送快递。

说白了虚拟内存本质上就是骗程序,让每个程序以为自己独占整个内存。它有以下几个优势:

1) 内存隔离与保护:每个程序拥有独立的虚拟地址空间,避免程序间直接访问彼此内存。

2) 简化编程模型:程序员无需关心物理内存的实际分配情况。

页表

页表是操作系统内存管理中的核心数据结构,用于实现虚拟地址到物理地址的转换。它由操作系统的内存管理单元MMU来维护。每个进程都有自己的页表,页表实际上还对内存起到了保护的作用,在虚拟地址到物理地址转换的页表项里,设置了权限位,如果权限不够,我们是拿不到对应的物理地址的,这对内核的数据起到了保护的作用。关于页表项的权限位后面再详细介绍。

可以先通过上面这张图在脑海里建立一个虚拟地址到物理地址转换的模型,后面我们在持续填充细节。 

单级页表

单级页表的地址转换过程:

首先介绍一下虚拟地址的格式:它由两部分组成,一部分是页号,另一部分是页内偏移。页号是用来找到页表中的页表项,页表就是一个连续的空间,页号就是要找页表项在页表中的偏移量,相当于数组下标。页内偏移,是指在物理内存页中的偏移,单个物理内存页也是连续的,也可以把它看做一个数组,页内偏移当做下标。

CR3:它是个寄存器,在进程创建的时候初始化,用来存放当前进程的顶级页表起始地址。

 CPU发出要访问的虚拟地址后,可以通过虚拟地址中的页号加上CR3中存放的页表起始地址定位到相应的页表项,一个页表项的大小是固定的,为4个字节。页表项里存放着对应物理内存页起始地址,然后在结合虚拟地址中的页内偏移,即可得到完整的物理地址,定位到相应位置上。

页表项

1)P:对应的物理内存页是否在内存中。1表示在内存中,0表示不在。如果不在,就会出发缺页中断,把对应的数据换入内存。

2)RW:表示该进程对该内存页具有的读写权限。1表示具有读写权限,0表示具有只读权限。

3)US:值为0表示该物理内存只有内核才能访问,值为1表示用户空间的进程也可以访问。

4)PWT:值为1表示CPU的cache中数据发生修改后,采用全写的方式进行同步,为0表示采用写回的方式进行同步。

5)PCD:表示对应的物理内存页是否可以缓存在CPU的cache中,1表示不可以,0表示可以。

6)A:表示对应的物理内存最近是否被访问过。1表示被访问过,0表示没有。CPU的内存管理单元MMU会经常检查该位置,来判断对应的物理内存页是否活跃,作为换入换出的依据。

后面几个就不介绍了~

单级页表的不足

有了上面的认识,我们知道:一个页表项大小为4B,它可以映射一张大小为4KB物理内存页,一张页表的大小也是4KB,包含1024个页表项。

这样一算,一张页表可以映射4MB的物理内存。那么32位系统下,内存大小为4GB,就需要1024张页表。一张页表4KB,那么一共就是需要4MB的物理内存来存放1024张页表。但是,随着系统的运行,很难找到这么一大片的连续空间。更要命的是,每个进程都需要有自己独立的页表,就更难找到这么多块连续的4MB内存空间了。进程一旦多起来,这也是一笔不小的开销呀~

但是,话又说回来,有必要进程一启动就给它分配4MB的内存空间去存放那么多张页表吗?

根据程序的局部性原理,程序不会在一上来就要访问所有内存,相反进程对于内存的访问表现出明显的倾向性,更倾向于访问最近访问过的地址周围的一些数据。最近访问过的地址以及它周围的数据很可能通过同一张页表就可以找到。

因为单级页表存在的一些不足,页表开始向多级页表演进。

二级页表

二级页表就是在单级页表的基础上,增加了一个目录结构。

 相较于单级页表来说,地址转换的时候要多一层,同时虚拟地址中也要多保存一级页号。

一张一级页表中,也同样有1024个页表项,一个页表项映射一张二级页表,一张二级页表映射4MB物理内存。那么一张一级页表就可以映射4GB的内存。原来单级页表需要4MB,现在优化到4KB。只有一级页表常驻在内存中,二级页表存在磁盘上,根据需要进行换入和换出。

四级页表

深刻理解了单级页表和二级页表以后,其实四级页表也一样,在虚拟地址上多了几级页号,然后进行地址转换的时候要多走几层。

PGD:全局页目录         PUD:上层页目录        PMD:中间页目录        PTE:页表项 

快表TLB

快表,本质上就是MMU的一个缓存,缓存常用页表项以加速地址转换。

CPU发出虚拟地址后,MMU首先去快表中查找是否存在对应的页表项,如果存在就直接返回对应的物理地址,然后通过该地址去缓存中找到对应的数据,然后将数据传入CPU。以上是快表缓存命中的情况,通过这一过程,也就了解了什么是快表以及它的作用何在了。

结语

页表的设计永远需要在「空间效率」、「查询速度」和「灵活性」之间找到动态平衡,没有完美的方案,只有适合场景的取舍。

推荐阅读:https://www.cnblogs.com/binlovetech/p/17571929.html


感谢支持~ 

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

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

相关文章

互联网大厂Java求职面试:短视频平台大规模实时互动系统架构设计

互联网大厂Java求职面试:短视频平台大规模实时互动系统架构设计 面试背景介绍 技术总监(严肃脸): 欢迎来到我们今天的模拟面试,我是技术部的李总监,负责平台后端架构和高可用系统设计。今天我们将围绕一个…

网络段、主机段、子网掩码

子网掩码把 IP 切割成了网络段和主机段两部分。同一网段下的不同主机之间可以互通网络。 掩码 IPV4 默认情况下 IP 地址 192.168.0.x 可以分配 256 个主机地址(不考虑首尾两个特殊的地址时)。 假设我们只需要用到 8 个主机,就可以借助子网掩…

从零搭建SpringBoot Web 单体项目2、SpringBoot 整合数据库

系列文章 从零搭建SpringBoot Web单体项目【基础篇】1、IDEA搭建SpringBoot项目 从零搭建 SpringBoot Web 单体项目【基础篇】2、SpringBoot 整合数据库 目录 一、项目基础环境说明 二、数据库整合流程 1. 添加 MyBatis-Plus 相关依赖(pom.xml) 2…

4款顶级磁力下载工具,速度提升器,可以变下变播

今天给大家带来一些超给力的磁力下载工具,速度飞快,最高可达20MB/s,而且还能边下边播! 下载链接:夸克网盘分享(点击蓝色字体自行保存下载) 一、柚子下载 柚子下载界面干净,没有广…

怎样判断服务器网络质量的状态?

服务器存储着企业的重要数据信息,服务器的网络质量会影响到用户访问数据信息的速度,也决定着网站页面是否会出现卡顿或页面崩溃的情况,那我们对于服务器中网络质量的状态该如何进行判断呢? 服务器的网络状态通常是指服务器与外部网…

零基础入门Selenium自动化测试:自动登录edu邮箱

🌟 Selenium简单概述一下 Selenium 是一个开源的自动化测试工具,主要用于 Web 应用程序的功能测试。它能够模拟用户操作浏览器的行为(如点击按钮、填写表单、导航页面等),应用于前端开发、测试和运维领域。 特点 跨…

day36 python神经网络训练

目录 一、数据准备与预处理 二、数据集划分与归一化 三、构建神经网络模型 四、定义损失函数和优化器 五、训练模型 六、评估模型 在机器学习和深度学习的实践中,信贷风险评估是一个非常重要的应用场景。通过构建神经网络模型,我们可以对客户的信用…

如何确定是不是一个bug?

在软件测试过程中,我们经常会遇到一些异常现象,但并非所有异常都是Bug。如何准确判断一个问题是否属于Bug?本文将从Bug的定义、判定标准、常见误区和实战技巧四个方面展开,帮助测试工程师提高Bug判定的准确性。 1. Bug的定义:什么情况下算Bug? 一个Bug(缺陷)通常指软件…

Lombok与Jackson实现高效JSON序列化与反序列化

引言 在Java开发中,处理JSON数据是常见需求,而Jackson作为广泛使用的JSON库,能够高效地将Java对象与JSON互相转换。然而,传统的POJO(Plain Old Java Object)需要手动编写大量样板代码(如getter…

论文阅读:PURPLE: Making a Large Language Model a Better SQL Writer

论文地址:PURPLE: Making a Large Language Model a Better SQL Writer 摘要 大语言模型(LLM)技术在自然语言到 SQL(NL2SQL)翻译中扮演着越来越重要的角色。通过大量语料训练的 LLM 具有强大的自然语言理解能力和基本…

【图像大模型】ControlNet:深度条件控制的生成模型架构解析

ControlNet:深度条件控制的生成模型架构解析 一、核心原理与技术突破1.1 基础架构设计1.2 零卷积初始化1.3 多条件控制机制 二、系统架构与实现细节2.1 完整处理流程2.2 性能指标对比 三、实战部署指南3.1 环境配置3.2 基础推理代码3.3 高级控制参数 四、典型问题解…

【从0到1搞懂大模型】chatGPT 中的对齐优化(RLHF)讲解与实战(9)

GPT系列模型的演进 chatgpt系列模型演进的重要节点包含下面几个模型(当然,这两年模型发展太快了,4o这些推理模型我就先不写了) (Transformer) → GPT-1 → GPT-2 → GPT-3 → InstructGPT/ChatGPT(GPT-3.5) → GPT-4 下面介绍一…

2025年AEI SCI1区TOP,改进麻雀搜索算法MSSA+建筑三维重建,深度解析+性能实测

目录 1.摘要2.麻雀搜索算法SSA原理3.整体框架4.改进SSA算法5.结果展示6.参考文献7.代码获取8.读者交流 1.摘要 对现有建筑进行高质量的三维重建对于其维护、修复和管理至关重要。图像采集中的有效视角规划会显著影响基于摄影测量的三维重建质量。复杂的建筑结构常常导致传统视…

鸿蒙开发:如何实现列表吸顶

前言 本文基于Api13 列表吸顶功能,在实际的开发中有着很大的作用,比如可以让列表层级之间更加分明,减少一定程度上的视觉混乱,由于吸顶的标题会随着滚动固定在顶部,可以让用户无需反复滑动回顶部确认分组位置&#xff…

使用Zotero的RSS订阅功能快速了解感兴趣领域最新文章

文章目录 写在前面中文期刊的RSS订阅英文期刊的RSS订阅回到Zotero有啥用? 写在前面 作为一名研究生或者科研工作者,肯定需要经常检索自己研究领域的最新文献,相比于不定期的去各大数据库检索文献,借助RSS订阅功能则更加便捷。 R…

Windows安装Docker Desktop开启 Kubenetes制作并部署本地镜像

1、安装Docker Desktop docker desktop官方下载链接,下载后一路点下来安装就好了。 2、制作本地镜像 跟着docker步骤制作镜像,需要先配置docker 镜像源,因为网络问题 {"builder": {"gc": {"defaultKeepStorage&…

嵌入式学习笔记 - freeRTOS 列表,链表,节点跟任务之间关系

一 下图说明了 freeRTOS 就绪列表,链表,节点跟任务之间关系 一个任务对应一个节点,一个链表对应一个优先级,一个任务根据优先级可以插入任何一个链表中。 插入函数为,这也是freeRTOS的核心函数,对每个任务…

scikit-learn pytorch transformers 区别与联系

以下是 scikit-learn、PyTorch 和 Transformers 的区别与联系的表格形式展示: 特性/库scikit-learnPyTorchTransformers主要用途传统机器学习算法深度学习框架预训练语言模型与自然语言处理任务核心功能分类、回归、聚类、降维、模型选择等张量计算、自动微分、神经网络构建与…

【C/C++】从零开始掌握Kafka

文章目录 从零开始掌握Kafka一、Kafka 基础知识理解(理论)1. 核心组件与架构2. 重点概念解析 二、Kafka 面试重点知识梳理三、C 使用 Kafka 的实践(librdkafka)1. librdkafka 简介2. 安装 librdkafka 四、实战:高吞吐生…

Spyglass:目标文件(.spq)的结构

相关阅读 Spyglasshttps://blog.csdn.net/weixin_45791458/category_12828934.html?spm1001.2014.3001.5482 预备知识 为了方便检查,Spyglass向用户提供Guideware作为检查参考;Guideware又包含各种方法(Methodology),应用于设计的不同阶段&…