计算机中无处不在的“预制菜”

2023-03-28 08:56:20 浏览数 (1)

我是cloud3,

今天聊聊计算机中无处不在的“预制菜”,

后面还会聊计算机中无处不在的“虚拟化”

先举个例子:

你发了工资先向微信钱包里转了一万零花钱,每次微信支付时就用微信钱包里的钱。

假如你没向钱包里转钱,每次微信支付时要向绑定的银行卡申请支付。

后一种方式多了一步微信和银行的沟通成本,而且去银行打印流水时那流水单老长了。

内存池就是这种预制思想

程序提前申请一块大内存由自己的内存池管理,并分成小块使用。程序使用完小块内存之后将内存归还到内存池中(并没有真正的从系统释放),当程序再次请求内存时,内存池将池中的可用内存块分给程序使用。

当内存池不够用了,还可以动态扩大内存池。

这样有个好处:一次性向内存申请一块大的内存慢慢使用,避免了频繁的向内存请求内存操作,提高内存分配的效率。当然内存池还可以降低内碎片问题。

其他预制菜

提前给程序准备足够多的资源,以备不时之需,这就是池化技术。

除了上面的内存池,还有线程池、连接池等。

线程池主要思想是:先创建若干的线程,让它们处于睡眠状态,当有任务要执行时,唤醒池中某个睡眠的线程来处理任务,处理完任务后,该线程又进入睡眠。这样的好处就是不需要频繁的创建线程了。

连接池主要用在网络通信上,主要思想是:先建立好一堆长连接放到连接池中,比如tcp连接、websocket连接等,即取即用,用完放回。

长连接的建立需要进行三次握手,而连接的释放需要进行四次握手,所以连接池的即取即用和用完放回的特性,避免了大量握手操作,节省了系统资源。

预制思想无处不在

再看刚才的例子,平时你经常用微信抢红包,强的红包钱都存在了微信钱包里,而不是每次都把红包在转回你的银行卡。因为下次再用时更方便。

这不就是缓存嘛。

我们经常见到:数据库缓存池、磁盘缓存、CPU的高速缓存、CPU的快表。

以PCU的高速缓存为例:当CPU读写内存时,首先从高速缓存中找,如果高速缓存中不存在,就去主内存中找。从内存中找到的数据就缓存到高速缓存中,下次再使用就会Cache命中,不再去内存中找了。

这些都是用完了不还,下次接着用的思想。

CPU中也能预制

了解编译器的朋友知道在编译器中可以做静态分支预测,与之类似的在CPU内部可以动态分支预测。下面简单说一下分支预测。

如果CPU没有分支预测,流水线如下:

取指-译码-重命名-分发-发射-执行-写回-提交

CPU有分支预测,流水线如下:

取指-分支预测-译码-重命名-分发-发射-执行-写回-提交

没有分支预测,分支指令要到执行阶段才能知道分支目标是哪里,取指到发射数个周期之间都没有事情可以做,因为没有确定下一条指令的pc值之前,是无法对下一条指令进行取指的。

有了分支预测,在分支得到结果之前能预测到后续指令的pc值,并按照分支预测的结果执行,预测对了这部分执行就可以继续,预测错了,执行的部分就没有用了,流水线就需要清空,重新从正确的分支执行。

所以分支预测是优化CPU流水线的一种手段,从这个角度上讲也是一种预制菜技术。

计算机中类似的预制思想还有很对,你还用过哪些预制菜,可以留言讨论。

我是cloud3,

今天聊了计算机中无处不在的“预制菜”

后面再聊聊计算机中无处不在的“虚拟化”

0 人点赞