不同进程对应相同的虚拟地址,在 TLB(快表) 是如何区分的?

2023-10-24 09:20

本文主要是介绍不同进程对应相同的虚拟地址,在 TLB(快表) 是如何区分的?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家访问。

一、前言

从虚拟地址到物理地址需要进行多级的页表转换,64位操作系统一般是3~5级,如果每次都要进行这个页表转换那会带来性能上的消耗。
如果我们将已知的虚拟地址和物理地址映射关系存到一个缓存表中,那么如果再次用到这个映射关系就能直接查表来找到虚拟地址对应的物理地址了,这就是TLB表,也叫快表。

但是会发生一个歧义,就是两个进程有相同的虚拟地址,但是映射到了不同的物理地址,到时候查表的时候就会发生歧义

二、页表查找简述

我们知道MMU是将虚拟地址转换为物理地址,然后其中的映射关系存储到页表中,而页表又是分级的。


64位操作系统一般有3~5级页表,这里我们以4级页表为例,分别是PGD、PUD、PMD、PTE四级页表。在硬件上有一个页表基地址寄存器,它存储PGD页表的首地址,MMU根据这个寄存器从PGB表开始查,最后查到PTE,然后生成最后的物理地址。


这个就是相当于找你家的具体位置一样,先找你的省份,然后是市级…。当下次再找你家的具体位置时,还要这么来一次,这非常的麻烦。但是如果第一次查完之后,把你的信息记录下来,比如说一个名字对应你家的具体位置,下次找的时候直接查表就行了。但是如果遇到同名的咋办,这就遇到了歧义,解决办法下面我再说。

三、TLB本质

TLB本质就是一个告诉缓存。TLB缓存虚拟地址和其映射的物理地址。


TLB根据虚拟地址查找cache,也只能根据虚拟地址查找。硬件存在TLB后,虚拟地址转到到物理地址的过程发生了变化。


虚拟地址首先传给TLB确认是否命中cache,如果cache hit就直接可以得到其对应的物理地址。否则,就是一级一级的查页表。
TLB1.webp
(操作系统虽然是64位,64位是非常大的一个数,我们目前一般用不多这么多,所以硬件厂商为了设计简单或节约成本,所以64位CPU寻址范围并不是64位,这里以48位的进行举例)

四、解决TLB中的歧义

在进程切换的时候我们可以将整个TLB失效,切换的进程肯定不会命中TLB,但是会导致性能损失,如果我们进程切换的非常频繁,可能TLB表就没咋用。


怎么尽可能避免flush TLB(这里的flush理解成使无效的意思)呢。如果我们能区分不同的进程TLB表就好了。


Linux操作系统为了区分不同的进程,会给每个进程一个独一无二的进程ID,我们也可以除了通过虚拟地址查表外,通过对比一个ID来区分不同进程的TLB表项。


所以,TLB添加一项ASID(Address Space ID)的匹配。ASID就类似进程ID一样,用来区分不同进程的TLB表项。这样在进程切换的时候就不需要flush TLB。但是仍然需要软件管理和分配ASID。
TLB2.webp

五、管理ASID

ASID和进程ID是不一样的。ASID一般是8或16 bit,所以只能区分256或65536个进程,但是进程ID的取值范围非常的大。我们不能将ASID和进程ID一一对应,我们必须给每个进程分配一个ASID。


Linux管理进程,每个进程会有个tast_struct结构,这里存储的进程的基本信息,我们可以把分配给这个进程的ASID存储到这里。页表基地址寄存器如果有空闲位也可以用来存储ASID。


当进程切换时候,可以将页表基地址和ASID(可以从task_struct获得)共同存储在页表基地址寄存器中。当查找TLB的时候,可以对比虚拟地址和ASID和TLB表中的是否一样来区分不同进程TLB表。 如果TLB miss就需要查页表了,然后再缓存到TLB中,同时缓存当前的ASID。

六、up

内核空间和用户空间是分开的,并且内核空间是所有进程共享的。


内核空间是共享的,那么进程A切换进程B的时候,如果进程B访问的地址位于内核空间,我们完全可以用进程A缓存的TLB表。但是现在因为ASID不一样,所以导致TLB miss。


我们针对内核空间这种全局共享的映射关系称为global映射。针对每个进程的映射成为non-global映射。 所以,我们在最后一级页表引入一个bit(non-global(nG)bit)代表是不是global映射。


当映射关系缓存到TLB的时候,将nG bit也缓存下来。这时候,我们的TLB表中有虚拟地址和物理地址的映射关系、ASID、nG bit。当判断是否命中TLB时,先比较虚拟地址,当找到表中的虚拟地址后,然后再看是不是global映射,如果是,就直接TLB hit,这时候就不用比较ASID了。如果不是global映射,最后还需要比较ASID。
TLB3.webp

参考文章:小林coding–面试官:不同进程对应相同的虚拟地址,在 TLB 是如何区分的?

这篇关于不同进程对应相同的虚拟地址,在 TLB(快表) 是如何区分的?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/274212

相关文章

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Java进程CPU使用率过高排查步骤详细讲解

《Java进程CPU使用率过高排查步骤详细讲解》:本文主要介绍Java进程CPU使用率过高排查的相关资料,针对Java进程CPU使用率高的问题,我们可以遵循以下步骤进行排查和优化,文中通过代码介绍... 目录前言一、初步定位问题1.1 确认进程状态1.2 确定Java进程ID1.3 快速生成线程堆栈二、分析

mybatis的mapper对应的xml写法及配置详解

《mybatis的mapper对应的xml写法及配置详解》这篇文章给大家介绍mybatis的mapper对应的xml写法及配置详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录前置mapper 对应 XML 基础配置mapper 对应 xml 复杂配置Mapper 中的相

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

C#通过进程调用外部应用的实现示例

《C#通过进程调用外部应用的实现示例》本文主要介绍了C#通过进程调用外部应用的实现示例,以WINFORM应用程序为例,在C#应用程序中调用PYTHON程序,具有一定的参考价值,感兴趣的可以了解一下... 目录窗口程序类进程信息类 系统设置类 以WINFORM应用程序为例,在C#应用程序中调用python程序

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定