硬盘、内存、cache为什么要组成金字塔结构?
电脑不是只有CPU、处理器的,它还必须有存储器。存储器就相当于是处理器运算时用的草稿纸。而且电脑还总是处于“草稿纸”不够用的情况,非常耽误处理器运算的速度。
那怎么办呢?我说了,设计电脑的科学家和工程师们就想出了一个绝妙的主意,那就是把电脑的存储器分成内存和外存。外存负责大,就像是仓库一样,可以很便宜地存放很多东西。内存呢,就是负责快了,不需要很多内存空间,就可以让电脑运行得比较快。
注意啊,我刚才说的把存储空间分成内存和外存,是一个非常绝妙的主意。我这可不是夸张啊。为什么这么说,听完这一集你就知道了。
我相信啊,我说把内存和外存分开是一个绝妙的主意,肯定会有人觉得我故弄玄虚。哪里有什么绝妙,不就是一个简单的分工问题吗?不知道你有没有听自己妈妈开玩笑说过这么一句话,“爸爸负责赚钱养家,妈妈负责貌美如花”,别看这是一句玩笑话,但这的确就是一种分工。
虽然现在很多妈妈不见得比爸爸赚钱少,但是靠分工来提高效率还是很有道理的。就比如说做家务活吧,怎么能提高效率呢,就是分工。就比如爸爸不喜欢做饭,但是妈妈特别爱做各种好吃的,相反妈妈不爱整理房间,爸爸却特别喜欢整洁。这就可以分工啊,爸爸负责打扫房间,妈妈负责做饭,这样就可以又吃到好吃的饭,又能让家里干净整洁了。
1
内存和外存是不是就是这个道理啊,一个擅长快,一个擅长大,分分工就可以既快又大了。
哪有这么简单啊,如果是这么简单的话,我也不会总是在强调把内存和外存分开是绝妙的想法了。
问题在哪里呢?
你看啊,不论是做饭还是收拾家,都是互相独立的,做饭不影响收拾家,收拾家也不影响做饭。但是你再看电脑里面,存储器的快慢和大小,虽然看起来是互不相关的,但其实是分不开的。
我举个例子啊,假如最新版的游戏《我的世界》发布了,这个新版本利用了很多新技术,已经完全不是现在你玩到的样子了,各种酷炫的效果非常多,游戏的场景也非常大,还能几百人同时在线一起玩。增加了这么多功能,虽然玩家们很开心,但是这也代表着新版游戏需要更高性能的电脑了。就比如,它需要的存储空间就特别大,需要40G的空间。不只是需要的空间大啊,它还必须运行的特别快才行。新版本的《我的世界》对存储速度要求非常高,如果速度不够的话,画面就会一卡一卡的,根本玩不了。
这个时候怎么办呢?你电脑的外存有256G的空间,虽然大小是够了,但是速度太慢。而内存呢,速度肯定没有问题,不过只有8G内存,远远不够存储游戏。这个时候还怎么分工啊,交给外存速度跟不上,交给内存空间不够大。你发现了吧,这个时候是同时既需要空间大,又需要速度快,这可就和做家务不一样了,没办法独立,也就没有办法分工了。
那怎么办呢?这就能体现出科学家和工程师的聪明才智了。
他们让游戏不用的时候保存在外存,等到需要的时候,再把需要那部分数据提取到内存里面来,让这部分需要的数据在内存里面被CPU读取和处理。这一下就可以既能享受到外存的大空间,又能发挥内存读取速度快的优势了。
其实这个原理还是挺简单的,你在自己的家里可能都用过类似的方法。不知道你自己家里的玩具多不多啊,不管多还是不多,爸爸妈妈们肯定不会愿意让你把玩具随便乱放的,平时必须收拾起来。
就比如在我家,我孩子的玩具车啊,乐高啊就很多,如果不收拾的话会到处都是,家里都没地方落脚了。所以,为了能把这么多的玩具保存起来,我家里就准备了一个6层的架子,每层都可以放很多玩具。这样,就算是再买更多的玩具也都可以放下了。
这个架子啊,其实就相当于是电脑的外存,空间大可以放更多的东西。但是架子也高啊,拿什么玩具爬上爬下的特别不方便,你要是想用乐高拼一个机器人,如果直接在架子上拼,那肯定要累个半死。外存也一样,空间大,但是访问起来麻烦,读写的速度比较慢。
那怎么办?也好办,想玩什么玩具了,不要直接在架子上玩啊,先拿下来放在桌子上,桌子上玩起来多方便啊。这个桌子就相当于是内存了,把架子上的玩具拿下来的过程,就是把外存里的数据读取到内存的过程。
在桌子上玩完玩具了,还要放回到架子上,这样就可以存放很多的玩具,又可以玩得痛快了。电脑里面也一样,内存里的数据处理完了,也会继续存放到外存上,这样就可以既享受外存的空间大,又发挥内存快速读取的优势了。
原理是不是也很简单呢?你可能会继续说了,就这啊,我整理玩具都会用到的方法,你还大夸特夸,是不是有点太夸张了啊。
当然,如果科学家和工程师们只是想到这个层次,那么的确不能说特别厉害。那我是不是在夸张呢?
当然没有了,因为我刚才介绍的都是一些基本原理,具体实现起来那可是有非常多的细节问题需要考虑和解决呢。
就比如,处理器读取数据只能是一条一条的读取,这就代表了处理器每进行一次运算,都需要从内存里面读取一次数据。内存最开始可是空着的,什么数据也没有,数据都在外存上呢。所以,每到处理器需要数据的时候,它就会去内存读,一读发现内存没有需要的数据,这个时候再去外存去读数据。
你想,这样是不是就反而更慢了。要是没有内存,处理器直接去外存读取数据,只需要读取一次外存,花费一份时间。但是现在有了内存,处理读取外存的时间,还需要加上读取内存的时间,这不是反而更慢了吗。
2
怎么办?也有办法。
你也可以继续想想,自己是怎么在架子上取玩具的。如果你想玩架子上的乐高,用乐高拼一个大型机器人,一个大型机器人可能需要几十上百个积木块呢,你会需要一个积木块就上去架子上拿一个,需要一个拿一个吗?肯定不会吧,肯定是要一次性把需要的积木全拿下来,然后全部放在桌子上拼积木啊。这样这个过程只需要去架子上取一次,花费一次爬架子的时间,剩下的都是在桌子上拼积木了,这就很快了。
内存从外存里面取数据也一样,也不是一条一条的取,而是一下读取一堆。
你玩积木拼机器人,一般都是提前知道需要哪些玩具的,所以可以很轻松的就把玩具收集齐全,一下子全部拿下来放在桌子上。那内存从外存读取数据,可以一下子把需要的数据全部读取到内存里面吗?不是不可以,不过要看情况。
还是用你用乐高拼机器人来举例啊。你这次要拼的机器人特别大,拼好了比你还高,那肯定需要非常多的乐高积木块啊,整张桌子都放不下。所以,你就没办法一次性把所有的积木全部从架子上取下来放在桌子上。当然了,一把这么大的机器人乐高,爸爸妈妈不舍得买,所以你也不太会遇到这样的问题。
但是内存从外存就不一样了,上次讲过,外存的空间往往是内存空间的成百上千倍,就比如刚才我说的最新版《我的世界》,需要40G的空间,而内存呢,只有8G ,电脑的内存根本就装不下。这可不是我随便举例子啊,这是现在的普遍情况。
这个时候该怎么办?内存从外存解决方法我们可以先放放,我们可以先想想看,如果你爸爸妈妈真的在你生日的时候买了一个巨大的机器人乐高,你该怎么办呢?难道因为桌子放不下就不玩了吗?
你可能会说了,桌子放不下不会放地板上吗?那要是地板也放不下该怎么办呢?你是不是又要说,哪里会有地板也放不下的机器人呢?
别急,哆啦A梦就遇到了地板也放不下的情况。没错就是那个机器猫,他和大雄遇到了和你同样的问题。
是什么问题呢?那我就需要把前因后果给你讲一讲了。
在《大雄与铁人兵团》这个长篇大冒险的故事里面,大雄又被欺负了。这次欺负他的是一个机器人。说是机器人,其实只是一个遥控玩具机器人,是小夫的哥哥特别制作的,这个机器人比小夫还要高。
大雄看到了当然就特别羡慕了,就问小夫是不是可以让他也来玩一玩啊。我们都知道,小夫特别爱炫耀,只是在大雄面前操作机器人,就是不让他玩。不只是炫耀啊,还让机器人装上了橡胶子弹攻击大雄,追得大雄只能躲在家里。
大雄就特别不甘心啊,所以就像用出自己的必杀技,哭着去找哆啦A梦帮忙,希望他从口袋里面拿出一个未来的机甲机器人,打败小夫。可是哆啦A梦正因为暑假的天气太热烦躁呢,一听大雄的哭诉,就更加烦躁了,哪有什么未来的机甲机器人啊,那是需要花很多钱才能买来的,根本没钱买。最后哆啦A梦被大雄缠着没办法,就掏出了任意门跑到北极避暑去了。
大雄也跟着跑到了北极,结果没有找到哆啦A梦,但是却捡到了一个和保龄球一样的东西。等把保龄球拿回家之后,发现这个保龄球隔一会就会哔哔哔的响。每次一响,就会从次元空间中掉出一个巨大的零件。大雄刚被小夫的机器人欺负了,所以满脑子还都在想机器人呢,所以一看这些零件就发现了,这些零件应该是属于一个巨大的机甲机器人的。光是一条腿就有两三层楼高,要是拼起来的话估计就能有六七层楼的高度了。
大雄当然就认为这是哆啦A梦刀子嘴豆腐心,虽然嘴上说不帮忙,私底下还是帮他从外来定制了超大型机器人。
结果等哆啦A梦被北极熊追着回到家之后,他一看这些零件也傻眼了,他根本没有预定未来机器人啊。这个巨大的机器人到底是谁的呢?如果你看过这一集的话,当然就知道了,这个机器人其实是一个外星机器人文明派来的先锋,等他侦查清楚地球的情况之后,就会有大部队来征服地球。
当然当时大雄和哆啦A梦不知道,还以为这就是一个巨大的机器人玩具呢。于是大雄就想着,一定要把这个机器人安装完成,拥有一个如此巨大的机器人,一定会让小夫心服口服的。
不过大雄和哆啦A梦却遇到了一个问题,这么大一个机器人,比大雄的家还要大,不论是房间里还是院子里,根本没有足够的空间把这个巨型机器人安装起来。这是不是和你遇到的问题一样,你是拼一个乐高机器人,桌子不够用了,大雄呢是拼一个巨型机甲机器人,别说是放地板上,就是把院子也用上仍然不够用。
大雄怎么办呢?大雄可是有哆啦A梦啊,哆啦A梦从口袋里面拿出了未来道具,创造了一个镜子中的世界,穿过镜子就可以到达一个与真实世界一模一样的平行世界。在那个镜中世界,除了左右相反和没有人之外,其他所有的一切都和真实世界一模一样。只需要把巨型机器人的零件搬到镜中世界,那里有无限大的空间可以安装机器人。
3
你可能会说了,这是作弊,大雄那是有哆啦A梦,可以用未来工具,我又没有,创造一个镜中世界的方法肯定不靠谱啊。这个时候该怎么办呢?
你没有办法了,但是计算机的科学家和工程师们有。他们可是经常遇到这种情况的。把几十G上百G的内容,放在8G的内存里面进行处理,这种情况应该比大雄他们在房间里安装巨型机器人还难吧。大雄只能用未来工具解决问题,一点也不现实,而科学家和工程师们就不一样了,他们的解决方法以及在所有的电脑里面实现了。
他们是怎么做的呢?他们会告诉你,别一下把所有的乐高积木都拿下来,而是一部分一部分地拿。比如先把腿部的积木块拿出来,拼好腿部,再把身体的积木块拿出来拼好身体,然后是胳膊啊,头啊,最后再拼成一个整体的机器人。
电脑里面的处理方法也一样,会把外存里面的数据拆开,拆成一页一页的。这个“页”就是一页纸的页,这是电脑里面专有名词了,内存和外存交换数据可不是一条一条交换数据的,而是一页一页的交换数据。页就是内存和外存交换的最小单位。
这就相当于你的玩具和积木块不是一个一个单独地放在架子上,而是把腿部需要的积木放在同一个整理箱里面,胳膊和头的,也都分别保存在不同的整理箱里面。这样,每次取玩具就简单了,可以先把一个整理箱拿出来组成腿部,然后放回架子上,把桌子空间腾出来,再拿下胳膊的整理箱,在桌子上拼好胳膊。
电脑里面内存和外存的数据交换和这个一样。
这个页的大小其实还挺关键的,不能太大了,也不能太小了。如果太大了效率是会降低的,就比如,举一个特别极端的例子。内存不是8G吗,那么我们就让一页等于8G。你第一次打开《我的世界》,一次性就把8G的数据打包好,一次性交换到内存里面。因为一些进来了这么多数据,处理器就好一顿忙活。
这个时候就需要提前注意了,搭积木我们是可以提前知道需要哪些积木块的。处理器处理数据可没有办法预测,也许刚处理完这一条数据,下一条数据就不在内存里了,而是在外存上。这就出现问题了,很可能大概处理了20%的数据吧,发现需要一个数据现在内存里面没有,是在外存上。
这个时候怎么办呢?就需要把现在内存里的所有8G数据,全部再交换到外存上,把内存空间空出来,再把另一页8G的内容交换到内存里面。虽然一下交换了很多数据,但是又80%的数据都没有用到就被交换出去了,非常浪费。到最后可能就会因为处理器找不到数据,而让内存和外存频繁交换数据。效率非常低下。这就像是,在草稿纸上写字,每次只写20%就换一页新纸,太浪费了。
所以,如果一页太大了,就会让很多数据的交换浪费掉,拖慢速度。如果页大小太小了呢,最极端的情况就是一页就只能放一条数据。如果是这样的话,这不就和一条数据一条数据地读取一样了吗?我们前面已经讲过了,这种方式效率更低,还不如直接在外存上进行处理呢。
所以,页的大小必须是一个不大不小的数值。现在的电脑,一般是一页有4K的大小,这样的话最新款《我的世界》有40G的数据存储在硬盘,那这40G的数据将会分成10M个页,也就是40G除以4K=10×1024×1024个页。内存有8G,它除以4K,也就是说内存有2M个页。内存就是用着2M个页的空间,完成了10M个页的数据处理。
其实到这里,问题还没有完。我刚才讲的所有情况,都是只在电脑里面运行一个程序,电脑里的内存全都被一个程序独占了。现实情况可不是这样子的,现在的电脑经常是几十个上百个程序同时运行。有的时候,你觉得自己只打开了一个《我的世界》一个游戏在玩,其实在系统后台你看不见的地方,一定是有几十个程序在和游戏争夺内存的使用权呢。
你拼乐高,如果是在家里,那么家里的整个桌子都是你的。如果是你是在商场的游乐场里面,这就不是你独有的了,那就会有很多孩子和你抢地盘抢玩具,一个处理不好了,就会互相争执起来,甚至还会有人哇哇大哭。
如果是玩玩具,那还好,起争执了还会有家长过来帮忙处理。要是电脑内存也出现这样的情况,那么轻者系统混乱,重者电脑完全瘫痪。
内存里面动辄有上千万个页,怎么管理它们也是一个复杂和精细的工作。科学家和工程师是怎么解决好这个问题的,现在我还没有办法给你解释,等到后面,你对电脑有了更多的了解之后,我们介绍操作系统的时候再给你介绍吧。
4
自从电脑有了内存和外存这种协作方式,处理器终于解决了自己的“草稿纸”问题,既可以快速的读写数据,又有足够大的空间来存储数据。
不过,这个故事还没有结束。因为这只是暂时把问题解决了,只要处理器的时间特性和存储器的空间特性,这两个特性不变,那么随时技术的发展,处理器和存储器之间的矛盾,还是会越来越明显的。
这不,到了上个世纪80年代,处理器的速度又远远大于了内存的速度了。这一次该怎么办呢?内存和外存协作的方法,其实就相当于把存储器从原来的一层,分成了两层。也就是内存是第一层,外存是第二层。如果处理器速度又快了,就是速度快的内存也跟不上了,怎么办呢?那就继续分层啊。
在处理器和内存之间再加一层存储设备,这个存储设备速度比内存还要快,速度快肯定价格更高嘛,所以空间就会更小。这就相当于是内存的内存。工程师为了和内存区别,把处理器和内存之间的这部分存储器叫做cache,中文叫做缓存。因为英文单词正好是拼音“擦车”,所以大家一般也会开玩笑说“我电脑的擦车大小是多少多少”,这样的玩笑话。
缓存在处理器和内存之间,为了处理器能更快访问,所以一般的做法都是把缓存集成到处理器芯片内部,所以不需要单独购买缓存,缓存已经是处理器内部的特性之一了。所以,高手挑处理器,就不只是看处理器的主频率是不是够高,还要看缓存的大小。
最开始,处理器和内存之间,只需要多加一层“擦车”就行了,但是随着处理器速度的越来越快,一层缓存已经不够了,于是在处理器和缓存中间又加了一层,缓存就变成了2层了,分别是一级缓存和二级缓存,也就是L1 cache和L2 cache。到了现在,2层都已经不够用了。就比如我现在正在用的电脑,是Intel的i7处理器,就有3级缓存,L1是64KB,L2是256KB,L3是16MB。当然,现在的处理器都是多核处理器,我的处理器是8核的,L1和L2是每个核心都有自己独立缓存,L3是所有核心共用的。而我的内存,是32GB,磁盘空间也就是外存有2TB。
而它们之间的速度差别呢,我可以给你对比一下。假如把处理器本身读取一条数据的时间放慢到1秒的话,那么L1缓存读取一条数据的时间就是3秒,L2是9秒,L3是43秒,内存是6分钟,固态硬盘是2-6天,机械硬盘的话是1-12个月。差距那是非常大的。
所以,如果把电脑里面从L1缓存到外存都放在一起的话,这就像是一个金字塔一样,最顶层空间最小,但是速度最快,最底层速度最慢,但是空间最大。这整个结构就是科学家和工程师,为了解决处理器和存储器之间矛盾提出的整体解决方案,一个存储设备的金字塔结构。