(一)计算机基础

计算机基础

1、单核CPU如何执行多个程序

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

image-20250210134939250

2、CPU流水线设计

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

image-20250210135410475

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

image-20250210135843879

如果将执行单元拆分成“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. 前缀树的特点

  1. 根节点不包含字符:除根节点外,每个节点都包含一个字符。
  2. 路径表示字符串:从根节点到某一节点的路径上经过的字符连接起来,即为该节点对应的字符串。
  3. 子节点字符唯一:每个节点的所有子节点包含的字符都不相同。
  4. 高效查询:利用字符串的公共前缀,减少重复比较。

4. 前缀树的操作

插入

  1. 从根节点开始,逐个字符插入。
  2. 如果字符对应的子节点存在,则移动到该子节点。
  3. 如果字符对应的子节点不存在,则创建新节点并插入。
  4. 重复上述过程,直到插入完整个字符串。

查找

  1. 从根节点开始,逐个字符查找。
  2. 如果字符对应的子节点存在,则移动到该子节点。
  3. 如果字符对应的子节点不存在,则说明字符串不存在。
  4. 重复上述过程,直到查找完整个字符串。

删除

  1. 从根节点开始,逐个字符查找。
  2. 找到字符串的最后一个字符节点后,删除该节点。
  3. 如果删除后父节点没有其他子节点,则继续删除父节点,直到遇到有多个子节点的节点。

6. 前缀树的优缺点

优点

  • 高效查询:利用公共前缀减少比较次数,查询时间复杂度为 O(m),其中 m 为字符串长度。
  • 空间优化:共享公共前缀,节省存储空间。

缺点

  • 空间消耗:如果字符串集合中没有太多公共前缀,前缀树可能会占用较多空间。
  • 实现复杂:相比哈希表等数据结构,前缀树的实现较为复杂。

5、LRU | LFU 的缺点

LRU缺点:

1)冷数据效应:某个冷数据被意外访问一次,它就可能被标记为“最近使用”

2)对周期性数据访问不友好

3)复杂度较高

LFU缺点:

1)数据老化问题:某些历史数据被长期保留,(家底厚,吃老本)

2)复杂度较高

posted @ 2025-04-09 13:23  墨羽寻觅  阅读(19)  评论(0)    收藏  举报