【第三届字节跳动青训营|刷题打卡】DAY8

4,576 阅读2分钟
  • 为了助力本届青训营课程的学习,青训营项目组为同学们精心挑选了练手习题 📖
  • 每两天发布一篇,包含选择题和实操题各一题(第二天将发布答案解析)🥳
  • 同学们可以在评论区留下你的解题过程并进行互动交流 ✍️

一、【单选】以下描述正确的是:

a. 表达式和运算符都是执行计划的组成部分。
b. 在火山模型中,执行计划子节点对应的运算符执行完成后,父节点对应的运算符才能开始执行。
c. 排序算法仅仅在 Sort 运算符中使用。
d. 当使用 Index Scan 的时候,任何情况下都需要再回表读取数据。

答案 & 解析

a; 在火山模型中,很多情况下执行计划子节点和父节点的运算符是同时执行的。排序算法也可以在 Join,Aggregation 等运算符中使用。Index Scan 如果能够覆盖所有的查询字段,不需要再回表读取数据。

二、某应用需要一个可靠的审核管道,为大量用户提供文章的审核入口,并对接了专业的文章审核团队,请为该管道设计一个数据结构。【实现一个并发安全的环形队列】

要求:

  • 因为审核团队的人力有限,管道要起到流量控制作用,满了之后文章无法提交审核
  • 高峰期时,多篇文章同时送审的事情常有发生,审核团队的多位同学也可能同时审核文章
  • 先提交送审的文章应先被审核
  • 进入审核管道的文章不能遗失、重复
  • 每天有大量的文章送审,要尽可能节省审核管道的开销

解析

首先,提炼题目要求:实现一个并发安全的环形队列,进阶/加分项是可以无锁;
然后,并发安全的环形队列的实现是相对比较简单的,主要考察数组的下标操作和边界情况的考虑;
最后,无锁主要有两个思路,考察操作系统/体系结构的基础是否扎实、是否具备较好的高性能并发编程思维:

  • 内存屏障/内存格栅:操作系统未开放 API,对于 C/C++ 语言可以使用编译器的支持来实现,参考 DPDP rte_ring 等。
  • 原子操作:C/C++/Java/Go/Rust 等语言都有支持,相对于内存屏障是更佳的选择。

特别注意,基于 Go channel 的实现不是无锁

今天是第八天打卡,同学们加油哦 💪