(一)计算机基础
计算机基础
1、单核CPU如何执行多个程序
操作系统会为每个程序分配一个时间片,也就是一个很短的时间间隔,大概几十毫秒。单核CPU会轮流执行多个程序,在一个时间片内只执行一个程序,这个时间片用完就切换到下一个程序。这样用户感觉像是在同时执行多个程序,只不过它的切换是很快的。

2、CPU流水线设计
一条指令的执行需要经过 取指令、翻译指令、执行指令 三个基本流程,CPU内部电路也分为不同单元:取指单元、译码单元、执行单元,指令的执行按照流水线一步一步执行。

流水线设计将这些操作分为不同的阶段,每个阶段有专门的硬件单元负责,流水线的本质是以空间换时间,将每条指令的步骤拆分到不同的硬件单元上执行,从而使得多条指令并行执行。

如果将执行单元拆分成“ALU计算(指令执行) - 内存访问 - 数据写回”,那么它就变成一个五级的流水线。这样,在同一时刻,可以同时对5条不同指令的不同阶段进行处理,而非像传统模式那种,等待一件商品完全执行完毕,才执行下一个商品。
3、CPU绑定操作
单核CPU下,系统会为每个程序分配时间片,时间片用完,就切换到下一个程序
但现在CPU都是多核心的,在多CPU下,线程在多CPU下来回切换不利于cache的命中,虽然L3 Cache是多核心之间共享的,但L1和L2 Cache 是每个核心所独有的,如果一个线程在不同核心之间来回切换,势必会对每个核心的缓存命中率带来影响,相反,如果都在一个核心上执行,那么L1 和 L2 的缓存命中率可以得到有效提高,进而减少对内存的访问。
做法是:将线程绑定在某一个CPU核心上
实现:LInux上提供了sched_setaffinity方法,实现将线程绑定到某个CPU核心上
#define _GNU_SOURCE
#include <sched.h>
int sched_setaffinity(pid_t pid, size_t cpusetsize, cpu_set_t *mask);
4、前缀树
1. 前缀树的定义
前缀树(Trie Tree),也称为 字典树、单词查找树 或 键树,是一种树形数据结构。它的核心思想是利用字符串的 公共前缀 来减少查询时间,最大限度地减少无谓的字符串比较,从而提高查询效率。
2. 前缀树的特点
- 根节点不包含字符:除根节点外,每个节点都包含一个字符。
- 路径表示字符串:从根节点到某一节点的路径上经过的字符连接起来,即为该节点对应的字符串。
- 子节点字符唯一:每个节点的所有子节点包含的字符都不相同。
- 高效查询:利用字符串的公共前缀,减少重复比较。
4. 前缀树的操作
插入
- 从根节点开始,逐个字符插入。
- 如果字符对应的子节点存在,则移动到该子节点。
- 如果字符对应的子节点不存在,则创建新节点并插入。
- 重复上述过程,直到插入完整个字符串。
查找
- 从根节点开始,逐个字符查找。
- 如果字符对应的子节点存在,则移动到该子节点。
- 如果字符对应的子节点不存在,则说明字符串不存在。
- 重复上述过程,直到查找完整个字符串。
删除
- 从根节点开始,逐个字符查找。
- 找到字符串的最后一个字符节点后,删除该节点。
- 如果删除后父节点没有其他子节点,则继续删除父节点,直到遇到有多个子节点的节点。
6. 前缀树的优缺点
优点
- 高效查询:利用公共前缀减少比较次数,查询时间复杂度为 O(m),其中 m 为字符串长度。
- 空间优化:共享公共前缀,节省存储空间。
缺点
- 空间消耗:如果字符串集合中没有太多公共前缀,前缀树可能会占用较多空间。
- 实现复杂:相比哈希表等数据结构,前缀树的实现较为复杂。
5、LRU | LFU 的缺点
LRU缺点:
1)冷数据效应:某个冷数据被意外访问一次,它就可能被标记为“最近使用”
2)对周期性数据访问不友好
3)复杂度较高
LFU缺点:
1)数据老化问题:某些历史数据被长期保留,(家底厚,吃老本)
2)复杂度较高

浙公网安备 33010602011771号