侧边栏壁纸
博主头像
Terry

『LESSON 5』

  • 累计撰写 90 篇文章
  • 累计创建 21 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

转载:SDS为什么使用内存不对齐

Terry
2021-01-16 / 0 评论 / 0 点赞 / 694 阅读 / 841 字 / 正在检测是否收录...

为什么要使用内存不对齐

在看下面之前首先要对内存对齐有个基本概念,为什么要内存对齐了,这里就设计到cpu的工作原理相关了,可以百度cpu工作原理,主要是跟内存地址和寄存器的映射关系有关,但是有两条定理可以在这里了解。

  1. 一个32位的cpu, 每一个周期从内存里面能读到32位的数据。
  2. 基于这个原因和寄存器的原因,cpu的每次读的地址开始是4的倍数,打个比方我们要读地址2上面长度为4的数据,那么就需要两个周期, cpu首先得从0-3地址上面读数据,然后再从3-7的地址上面的数据, 在这里我们可以看到内存对齐的作用。
    那么问题来了,对于redis 作者一个对内存和cpu 用到极致的作者,为什么还要用非对齐的sds了,原因在于sds的本身结构注定只能非对齐状态。
    请看下图,在对齐状态我们的结构体在内存里面表现形势是如何的。

sds-3

可以看到不同类型的sds 下面,pad 的位数也是不同的,那么我们要从sds 指针位置访问到flag,在不知道类型的情况下是不可能了,那么有同学又要发问了,去掉sdshdr8的结构不就行了吗,从理论来说这样牺牲的内存也不会太多,也保证了性能,但是这仅仅是在32位系统下面的结构,如果在64位系统,那可能又是另外一个结构了。 好的那么有同学又要说了 我们能不能把指针放到flag开始的位置。答案也是不能,1,这样我们就没办法完美兼容string, 2, 这样我们也会引入各种类型判断调整,所以redis 最后还是用到内存不对齐这个方案。

出自: redis 系列,要懂redis,首先得看懂sds(全网最细节的sds讲解)

0

评论区