目录
- 前言
- 如何理解L1,L2,L3级缓存的树形结构设计
- 排队的烦恼
- 现实中的排队烦恼
- 计算机程序设计中的排队
- 队列类型
前言
本文是Metaverse大衍神君的《DOTS之路》系列课程的学习笔记
如何理解L1,L2,L3级缓存的树形结构设计
排队的烦恼
现实中的排队烦恼
这是一张关于排队的图,现实中相信大家多少也都有关于排队的烦恼
- 由于队形的结构类型不同
- 排队规则不同
- 队列中的人到达的事件不同
- 服务的时间不同
- 离开队列的条件
- 其他等等一系列不同的因素
以上各种内外部因素导致你的预期调度不仅没有加速你在队列中的等待时间
相反造成了更长时间的等待
计算机程序设计中的排队
联想到计算机程序设计,其实我们的CPU指令执行也在排队!
很多算法也是在处理数据队列
现实中队列的内外因素不同,我们可以通过一些设计和规则以及调度的调整来改善队列的效率
这在计算机上也是一样的
- DOTS面向数据的设计部分就是在设计队列的结构
- ECS就是在组织队列中的规则
- JobSystem就是在做队列的调度
队列类型
- 单队列
这是最常见的队伍类型
- 比较简单
- 参与队伍管理的工作人员可以很少
- 队列中的任何一个人或业务人员出现处理时间较长的问题
- 造成的阻塞是整个系统级别的
- 多队列
单队列的优点与缺点简单易懂
而为了解决系统级别的阻塞问题,很自然的会想到使用多队列
让他们并行处理,不就解决问题了吗?
当初的CPU设计人员也是这样想
并行设计多核计算也是这么干的
- 可并行处理
- 占地大
- 需要的服务人员与并行队列数量成正比
- 在CPU上就需要有更好的工艺,给多核留更大的空间
- 即使这样,单纯的多队列也并不一定高效
- 我们不知道系统中每个人需要多久时间完成
- 当一个并行队列中,一个人花费的时间太长时,依然会造成整体系统依旧很慢
-
单队列+调度
-
处理并行,调度串行的队列
-
需要一个调度人员来管理队列
-
当某个窗口被阻塞时,调度人员会将长队列等待的人员调到其他处理窗口
-
长的单行队列,就很像Cache缓存
-
与多行并行队列相比,可以解决
- 队列中每个人处理时间长度不一致的情况
- 新到来的人进入队列的时间随机的情况
-
复合队列-单行调度队列+多行并行队列
-
这种队列在现实中也有例子
- 大规模核酸现场队伍
- 每10人一管共测,每次调度员需要从单行队列中调10个人一起进入空闲并行队列等待
-
适合多阶段批次处理事务的队列
-
适合每个批次每个人处理的时间近似的情况
-
有点符合Cache Line的概念了
-
然而这种队列也不是没有问题的
一旦出现上图中这种同批次中每个人处理时间有巨大差异的时候,队列效率就会变得很差
调度员的调度工作量与复杂度也会上升
如图所示,我们再增加一层并行队列,并增加两个调度人员
一个是应付进入整体队列系统的调度员A,用来调度随机到来的人员进入类似属性的队列
一个是调度员B按照每个并行队列中单个队列是否达到上限,将队列中的人统一调度到下一层的单行队列中进行等待
我们增加处理完的队列后的后续工作
如果我们按照当前的系统调度,虽然队列按照相同属性组织完成了
但离开队列的系统情况是离散的,导致离开队列变乱了
以机场为例:
如果按照固定时间完成一次离开队列的摆渡车发车处理
有时甚至填不满或者超出单次的承载量,这样整个系统的效率又变差了
那么我们考虑在进入第一层并行队列时,除按照属性组之外,再按照家庭或旅行团分离队列
在进入办理登机手续的时候,第一位成员就可以拿多本护照一次性办理
并选择临近的座位,一起坐上摆渡车
类比到CPU上,其实就是把数据组织成矢量或对齐优化,处理时可以兼容SIMD指令
这样一个指令处理多条类似数据,不仅加快了处理效率,还可以保持离开队列系统时数据的连续
至此类比案例完成,最后做一个更加大胆的类比
我们可以将
蓝色部分类比为L1级缓存
青色部分类比成L2级缓存
紫色部分类比为一个CPU的逻辑核
红色部分类比为L3级缓存(多个逻辑核共享)
每个不同级别的缓存内的队列可以类比成Cache Line或Chunk
整个队列系统组织数据layout的过程可以类比成ECS
黄色调度员类比成不同调动方式下的JobSystem
而进入到蓝色处理元处理的人员队列类比成Burst编译器优化过后的支持SIMD的代码指令