00:00
诶,大家好,今天我们来聊个好玩儿的,就是你每天都在用的电脑和手机,他们里面到底藏了什么秘密,特别是他的大脑,也就是CPU跟他的记性,也就是内存,他俩到底是怎么聊天的?这背后可是一场为了追求极致性能的伟大探索。好,咱们今天这个探索之旅啊,分5步走,咱们先从一个特别头疼的问题开始,就是这个速度差,然后呢,看看工程师们想出了什么聪明的办法,比如给CPU搞了个小金库,再往后咱们会进入一个更神奇的世界,叫虚拟内存,看看这个魔法到底是怎么变的,以及为啥他对我们现在能这么爽的用电脑简直是太重要了。行,废话不多说,咱们这就开始吧。咱们故事的起点呢,其实是一个特别大的矛盾,你想想我们现在手里的CPU,那速度快的跟闪电一样,对吧?但问题是他经常得停下来干等着一个慢吞吞的队友,就是咱们的住内存。诶,说到这儿,你是不是也遇到过这种情况,明明刚买的顶配电脑跑的飞快,那有时候就是会莫名其妙卡一下对不对?没错,这就是咱们今天要解开的谜题,问题的跟哪儿,就出在CPU和内存的沟通方式上。
01:03
咱们来看个图,这个对比就非常吓人了,你看啊,CPU从他手边上那个叫Lee缓存的地方拿个数据只需要4个时钟周期,就一眨眼的功夫,但是万一这儿没有得去主内存,也就是第一RAM里头拿,你猜要多久?107个周期,我的天呐,这速度差了25倍还多,这是什么概念?这就好比你让博尔特去跑100米,结果呢,他每跑一步都得停下来等上半天,等别人把跑鞋给他送过来,这效率能高得了吗?肯定不行啊。那为什么会差这么多呢?其实啊,是背后用的两种完全不同的技术,CPU缓存用的那个叫SRAM静态RAM,特点就是快,非常快,但缺点就是贵,而且占地方。而咱平时说的内存条呢,用的是DRAM动态RAM,它的好处是便宜,容量大,但缺点就是慢,而且还得不停的给它刷新一下,不然数据就丢了。所以你看,工程师们碰到的第一个大难题就是怎么才能把这个巨大的速度鸿沟给填上呢?于是乎,一个特别聪明的办法就诞生了,CPU缓存。你可以把它想象成工程师给CPU搞了一个私人的、有好几层的小金库,专门存那些最常用、最急着要的数据。
02:11
为了让大家更好的理解啊,咱们来打个比方,你就把CPU想象成一个顶级大厨,正在厨房里忙的团团转,而内存呢,又是那个在走廊尽头又大又远的储藏室,这个比喻就特别形象了,你看,L1环式就是大厨操台,手边那些切好的葱姜蒜,伸手就能拿到,超级快,L2环式儿呢,就是旁边那个小冰箱,拿东西也很快,L3环式就是厨房里的食品柜,稍微走两步也到了。但主内存呢?那就是走廊尽头那个大仓库了,要去拿趟东西可费劲了。那你想想,作为大厨,肯定希望所有要用的东西都在手边,对吧?这样效率才高嘛。CPU也是这么想的,这就是CPU环射设计的核心思想,他利用了一个叫局部性原理的东西,简单说就是把最可能马上要用到的数据放在离自己最近的地方。问题又来了,现在的CPU啊,可不止一个核心了,就像一个大厨房里,有好几个大厨在同时开工,那你想想,要是这几个大厨都在看同一本菜谱,而且每个人还从自己的小箱里拿食材,甚至还自己往菜谱上写写画画,这不就乱操了吗?怎么保证大家看到的信息都是最新的,别把菜给做砸了呢?
03:18
诶,就这需要一套规矩了,一套厨房管理条例,在电脑的世界里,这个规矩就叫mesi协域,你就把它当成一个交通警察,它会给每个厨子,也就是核心环唇里的数据都贴个标签儿,比如说这份菜谱现在就我一个人在看,或者这份菜谱我刚改过,再或者咱们好几个人都在看这份儿,一旦有个厨子改了菜谱,他就会立刻大喊一声,通知所有人,诶,哥几个注意了啊,我这更新了,你们手里的旧版都别用了,作废了。这样一来,就保证了每个厨子干到的永远都是最新最准的那份菜谱,天下太平了。哈,速度问题我们暂时解决了,接下来咱们要看一个更厉害甚至有点魔幻的方案,他不光解决了效率问题,还顺便把安全性和方便性都给搞定了,这就是虚拟内存。
04:02
虚拟内存说白了就是一个特别高明的骗局,它能让你电脑上开的每一个程序,不管是微信、浏览器还是游戏,都觉得,哇,整个内存条都是我的,我想怎么用就怎么用。但实际上呢,在背后,操作系统这个大管家正悄悄的管理这一块有限的物理内存,让所有程序一块儿用。要实现这个骗局啊,就需要一个关键角色,咱们可以把它想象成一个图书馆的管理员,在电脑里,它的学名叫内存管理单员,也就是MMU,每个程序一跑起来,这个图书管理员就会给他发一本特制的地址簿,这个地址簿呢就叫页表。这就引出了两个非常重要的概念,程序在他自己的地址簿里看到的地址,咱们管它叫虚拟地址,这其实是个幻觉,是为了方便,而数据真正在内存条那个硬件上放的位置呢,叫物理地址,这才是实实在在的。所以咱们那个图书馆员MMU的核心工作就是负责翻译,把程序报上来的虚拟地址转换成真实的物理地址。
05:00
那么,这个从虚拟到现实的翻译过程,这场神奇的魔法到底是怎么变的呢?咱们来一探究竟。整个过程大概是这样,当CPU,也就是程序说我要找个东西,他会报一个虚拟地址,图书馆员MU呢,就接过这个地址,然后翻开这个程序数数的那本厚厚的地址簿,也就是页表在里面查,哦,这个虚拟地址对应的是几号书架上的几号位置,也就是物理地址,然后呢,他就真的去那个书架上把东西给取回来,就是这么个流程。但是万一,我是说万一呀,管理员翻开地址簿一看,发现记录的这本书根本就不在图书馆的书架上,也就是物理内存力,这怎么办?这种情况就叫缺液中断,这时候操作系统这个总管长就得出门儿了,他会跑到更远的仓库,也就是你的硬盘里去,把这本书给找出来,搬到书架上放好,然后再告诉管理员,好了,东西来了,你继续干活吧。这个过程虽然听起来有点慢,但正是因为它,我们才能运行那些比我们物理内存大得多的程序。你可能已经想到了,每次都去翻那本又大又厚的地址簿,也太慢了吧?没错,所以啊,咱们这个聪明的图书馆员mm MU给自己搞了个小抄,一张速查表,他的名字叫TLB,他会把最近查的最频繁的那些地址翻译记录给记下来。这样一来,绝大部分时间,他只要瞄一眼这个小抄,马上就知道东西在哪儿,效率一下子就上来了。
06:19
好,到这里我们大概了解了CPU环质这个小金库和虚拟内存这个大片区域。那么问题来了,搞这么一套复杂的系统,对我们每天用电脑玩手机到底有什么好处呢?这么一通折腾到底给我们带来了什么呢?好处可太多了。首先就是能运行超级大的程序,你想想那些几十个记忆的游戏或者专业的视频编辑软件,就算你内存没那么大也能跑起来。其次就是安全,绝对的安全,每个程序都被关在自己的虚拟空间里,就像住在一个独立的沙盒里,一个程序崩了,完全不会影响到隔壁的程序,更不会把整个系统搞垮,对写代码的程序员来说呢,也简单多了。当然最关键的一点是,所有这些加起来,才让我们能够实现今天这种习以为常的包效。多任务处理,也可以同时开着几十个应用,来回切换都非常流畅,他们在后台都好好的。
07:10
有句话说的特别好,这个系统啊,就是让一大堆程序共享同一块物理内存,但同时又让每个程序都天真的以V这块内存是他自己独享的。这句话就完美的介绍了虚拟内存的精髓,他创造了一种秩序,一种幻觉,让混乱的资源争抢变成了一场井然有序、安全高效的合作。所以你看,从CPU、缓存到虚拟内存,我们现在用的电脑其实是建立在一系列非常精妙的幻觉或者说障眼法上面的,他们在速度和容量之间找到了一个近乎完美的平衡点。但是随着我们对性能的要求越来越高,越来越变态,一个问题也自然而然的冒了出来。当这些聪明的技巧再也藏不住物理世界的极限时,计算世界的下一场革命又会是什么样呢?
我来说两句