CPU眼里的: MMU | 空间独立性|虚拟内存

一,MMU与空间独立性

内存管理单元(memory management unit)
在这里插入图片描述
P1P2为两个进程,它们之间存在空间独立性,p1与p2的a虽然同一虚拟内存,但经过MMU会映射在物理内存的不同地址
在这里插入图片描述
真正的物理内存空间就是天空,每个进程就是一只青蛙,MMU就是束缚青蛙的井,不同井之间的青蛙具有空间独立性,它们之间不能相互通信,如果没有了井的束缚,青蛙就跳到井外变成线程。
在这里插入图片描述
进程空间中的多线程(一口井中的多只青蛙)可以互相通信,因此用线程实现多任务编程会很方便,但是一个线程崩溃(一只青蛙死亡)整个进程将崩溃(所有青蛙将死亡),因此网络服务器使用多进程来确保安全。

同一个进程内多个线程之间可以共享代码段、数据段、打开的文件等资源,但每个线程都有独立一套的寄存器和栈,这样可以确保线程的控制流是相对独立的。
在这里插入图片描述

二,虚拟内存与页表

虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。
CPU在运行时其程序计数器(用于存放下一条指令所在单元的地址的地方)每次偏移一个地址单元的长度,因此其需要访问一段连续的地址空间,这时候有着连续地址的虚拟内存就派上用场了。
页表的由来:
①:进程在运行时不是整个加载到内存中,而是CPU需要进程的哪一部分代码就从硬盘中加载到内存中运行,因此将进程拆分开来,在内存中也相应的拆分开来。
②:若将整个内存单元使用MMU进行一条条的映射,假如内存空间为8G,每个地址需要4字节表示,MMU中需要存储8G行,共32G存储空间,这是不可能实现的,因此使用页表进行一段一段的映射
在这里插入图片描述

内存中拆分的基本单位称为页(内存分页,一个页4K),拆分开的进程与拆分开的内存通过页表进行映射,页表由页表项组成,每个页表项指出当前进程的代码在内存中映射到哪一页,在该页中的偏移地址是多少。如上图0x00003005的0x00003让MMU查看页表第3行的值,也就是0x80003000,也就是虚拟内存页对应的物理内存页的起始地址,其低12位(12位刚好可以访问到4K的地址,即一个页表都能访问到)005指该虚拟地址在内存页中对应第5个。至此得到了虚拟地址在内存上物理地址的映射为0x80003005。
使用不同的页表的进程的进程空间被隔离:(若使用了同一页表则是在做进程间的通信)
在这里插入图片描述
同一进程中的线程使用同一页表,因此他们可以访问到内存上同一块空间,实现线程间的通信,存在共享变量:
在这里插入图片描述
当内存不够时,页表还能将虚拟地址映射到磁盘中
参考:https://www.bilibili.com/video/BV12r4y1e7uM/?spm_id_from=333.788

三、页表与MMU

上面两节中虚拟地址一会通过MMU转换成物理地址,一会通过页表转换成物理地址,那这二者的关系是什么呢
MMU:CPU里有一个内存管理单元(Memory Management Unit),简称MMU,虚拟内存不是直接送到内存总线,而是先给到MMU,由MMU来把虚拟地址映射到物理地址,程序只需要管理虚拟内存就好,映射的逻辑自然有其它模块自动处理。

在这里插入图片描述

页表:页表是存储在内存里的虚拟地址到物理地址映射的集合。
MMU相当于执行者,该怎么做由页表指出

补充下上图中的TLB:
参考:
https://blog.youkuaiyun.com/qq_34827674/article/details/124481706
我们从页表的性质来看,保存在内存中的页表承担的职责是将虚拟地址翻译成物理地址。假如虚拟地址在页表中找不到对应的页表项,计算机系统就不能工作了。所以页表一定要覆盖全部虚拟地址空间,不分级的页表就需要有 100 多万个页表项来映射,而二级分页则只需要 1024 个页表项(此时一级页表覆盖到了全部虚拟地址空间,二级页表在需要时创建)。我们把二级分页再推广到多级页表,就会发现页表占用的内存空间更少了,但是也带来了问题,即虚拟地址到物理地址的转换就多了几道转换的工序,这显然就降低了这俩地址转换的速度,也就是带来了时间上的开销,我们就可以利用这一特性,把最常访问的几个页表项存储到访问速度更快的硬件,于是计算机科学家们,就在 CPU 芯片中,加入了一个专门存放程序最常访问的页表项的 Cache,这个 Cache 就是 TLB(Translation Lookaside Buffer) ,通常称为页表缓存、转址旁路缓存、快表等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值