缓存的故事
假设你是一位六十年代的白领,在巨大的办公楼里工作,没有电脑,你需要阅读大量的文件并且交叉检索这些文档。
你有一个办公桌(L1 缓存)。桌上的文件是你正在手头处理的资料,还有一些是你最近看过的或者你准备阅读的。通常我们需要阅读文件的每一页(对应于存储单元的一个字节),但除非它们在办公桌上,文件都是作为一个整体。即只想看某一页的内容,我们也必须把整份文件抓过来。
办公室里还有文件柜(L2 缓存)。这些文件柜里存放的是你最近处理过,但目前没有在使用的文件。办公桌上的文件在用完后,通常也会放回文件柜。从文件柜里拿文件就不是顺手拈来了——你需要走过去,打开相应的抽屉,还要查目录卡片,才能找到想要的文件——不过这也还比较快了。
有些时候,其他人也需要查看你的文件柜里的文件。勤杂工会推着一辆推车(环路公共汽车)在各个办公室转。如果有人在自己的文件柜没有找到相应的资料,他会写一个纸条交给勤杂工。为简化起见,假设这位勤杂工知道所有的东西放哪儿。所以当他来到你的办公室的时候,他会检查你的文件柜里是否有其他人需要的文件,如果有,就把这些文件抽出来放到车上。当他转到别的办公室,就会把找到的文件放在文件柜里,并留下收条。
有时候,这些文件并不在文件柜里,而是在办公桌上。那就不可以直接拿了,需要征询主人的意见,如果不行,大家就要商量如何协调。有大量冗长的详尽的合作指引来处理这类情况(至少要一起开会)。
文件柜经常会满,这时就不能放新的文件,需要先腾地方,把一些很久都没用到的文件拿出来。勤杂工会把这些文件放到地下室里(L3 缓存)。地下室里的文件被密集地堆放到纸箱里或者文件架上,交给文档管理员处理,其他人都不会下去,也不会了解文档的存放细节。
当勤杂工来到地下室,会把一堆不需要的文件放到‘in’框里,同时他也会留下一堆纸条,写着在楼上文件柜里找不到的文件名。文档管理员会拿着这些纸条,找到对应的文件,把它们放到‘out’ 框里。下次勤杂工下来的时候,就可以把‘out’框里的文件拿走,交给需要的人。
现在的问题是,文件还是太多,地下室也放不下,而且办公大楼的租金都很贵,所以通常公司都会在离市区较远的地方租一个仓库来存放归档文件(对应于DRAM内存)。文档管理员会记录哪些文件放在地下室,哪些文件放在仓库。这样,当需要拿文件时,管理员就知道哪些是能在地下室找到,哪些要到仓库里拿。每天有一两次,会有一辆货车开到仓库去拿需要的文件,同时把一些地下室的旧文件运过去。
对勤杂工而言,他并不关心这些细节,这些都是文档管理员在处理。他需要做的就是把纸条放到‘in’框里,从‘out’框里取出文件。