1 一个工艺上的问题
- 处理器和内存所使用的半导体器件工艺不同
- 工艺的差异导致了处理器与内存的速度差异
- 数据处理时,处理器总是需要等待内存
2 程序访问的局部性
- 在短时间内,处理器访问的存储空间是一个很小的范围
- 时间局部性:某个存储单元在短时间内很可能被再次访问
- 空间局部性:某个存储单元的邻近单元在短时间内也被访问
3 高速缓冲存储器的引入(Cache)
- Cache是一种小容量高速存储器
- Cache的存取速度与处理器的运算速度几乎同量级
- Cache在现代计算机系统中直接内置于处理器芯片中
4 Cache解决方案
- 在处理器和内存之间设置cache
- 把内存中被频繁访问的指令和数据复制到cache中
- 大多数情况下,处理器能直接从cache中取得指令和数据
5 处理器数据访问
6 内存和cache之间的映射
6.1 直接映射法
6.1.1 直接映射法基本概念
- 将cache和内存分成固定大小的块(如:512Byte/块)
- 内存中的每一块在cache中有固定的映射位置
- 映射公式为:POScache = 内存块号%cache总块数
特点:任意一个内存地址都能被映射到cache中的一个固定位置。
6.1.2 直接映射法原理
地址划分
映射原理
- 根据访问地址中的c位找到cache中的对应块
- 比较地址的高t位是否和flag相同
相同:直接读取数据
不同:从内存中复制块内容
6.1.3 直接映射法举例
6.1.4 直接映射法的特点
- 优点:映射过程简单,所需耗时短
- 缺点:当短时间内访问的地址有同余冲突时,会造成缓存失效
7 cache原理的软件应用
项目背景:日志调试工具
- 解决的问题:
✓ 日志对系统效率影响巨大,且不容易分析查看
✓ 现有的日志系统无法高效的打印二进制数据
✓ 自定义日志内容的解析方式
✓ 对日志进行分类,并控制日志是否输出 - 出现过的性能问题:当短时间内有大量日志需要打印时,性能无法满足调试需要
最终的解决方案:根据cache原理,设置二级缓存机制,尽量避开查找!
核心伪码如下:
- 解决的问题:
void process(Message* msg)
{
static Parser* cache1 = NULL;
static Parser* cache2 = NULL;
static int flag = 0;
if ((cache1 != NULL) && (cache1->id == msg->type))
{
cache1->handle(msg);
}
else if ((cache2 != NULL) && (cache2->id == msg->type))
{
cache2->handle(msg);
}
else
{
Parser* p = find_parser(msg->type);
if (NULL != p)
{
p->handle(msg);
flag = !flag;
if (flag == 0)
{
cache1 = p;
}
else
{
cache2 = p;
}
}
}
}
修改记录
时间 | 动作 |
---|---|
2017.6.7 | 首次上传 |
参考资料
唐老师 — 狄泰软件学院 — 十二月提升计划
李云 — 《专业嵌入式软件开发 全面走向高质量编程》