系列导读
本系列基于 64 位平台、1Page=8KB
明天咱们开始拉开《Go 语言轻松系列》第二章「内存与垃圾回收」的尾声。
对于「内存与垃圾回收」章节,大体从如下三大部分开展:
-
常识准备:为后续的内容做一些常识储备,常识准备包含
- 指针的大小
- Tcmalloc 内存调配原理
- Go 内存设计与实现
- Go 的垃圾回收原理
本篇前言
第一局部 常识准备
的第一个知识点 指针的大小
。
为什么
指针的大小
会作为一个知识点呢?
因为后续内存治理的内容会波及一些数据结构,这些数据结构应用到了指针,同时存储指针的值是须要内存空间的,所以咱们须要理解指针的大小,便于咱们了解一些设计的用意;其次,这也是困扰我的一个问题,因为有看见 64 位平台下指针底层定义的类型为uint64
。
为了搞清楚这个问题,咱们须要理解两个知识点:
- 存储单元
- CPU 总线
什么是存储单元?
存储单元是存储器 (本文指内存) 的根本单位,每个存储单元是 8bit,也就是 1Byte,如下图所示:
同时从上图中咱们能够看出,每个存储单元会被编号,这个编号又是什么呢?
- 就是咱们通常所谓的“内存的地址”
- 也就是指针的值
论断:指针的值就是存储单元的编号。
接着,咱们只须要晓得这个「编号」的最大值是多少,就能够晓得存储「指针」的值所需的大小。要找到这个最大值就须要理解 CPU 总线 的常识了。
CPU 总线的概念
CPU 总线由系统总线、等等其余总线组成。
总线的组成 |
---|
系统总线 |
等等其余总线 … |
系统总线由一系列总线组成。
系统总线的组成 |
---|
地址总线 |
数据总线 |
信号总线 |
内存的地址 (存储单元的编号) 是通过 地址总线 传递的,地址总线里的“每一根线”传递二进制 0
或1
,如下图所示(理论不是这么简略,图示为了便于大家了解)。
地址总线的 宽度 决定了一次能传递多少个 0
或1
,因为 64 位 CPU 每次可解决 64 位数据,所以实践上地址总线的宽度能够反对到最大 64,也就是 2^64 种组合,可代表的数字范畴为0 ~ 2^64-1
。
论断:实践上 64 位 CPU 地址总线可传输的 10 进制数范畴为
0 ~ 2^64-1
。
下面晓得 64 位 CPU 的地址总线可寻址范畴 为 0 ~ 2^64-1
,须要一个类型能够存储这个指针的值,毫无疑问就是 uint64
,uint64
又是多大呢?是不是 8byte。所以:64 位平台下,一个指针的大小是 8 字节。
顺便裁减个问题:
为什么 32 位平台下,可寻址空间是 4GB?
备注:64 位太大,咱们这里用 32 位来看这个问题
咱们来剖析一下:
- 因为,32 位平台可反对地址总线的最大宽度为 32,及代表的存储单元编号的范畴:0 ~ 2^32-1
- 则,最多能够找到 2^32 个存储单元
- 又有,存储单元的大小为 8bit(1Byte)
所以咱们能够失去,32 位平台最多能够寻找到 2^32 个存储单元,再翻译下2^32 个存储单元 这句话:
2^32 个存储单元 == 2^32 个 1Byte == 2^32Byte == 4GByte == 4GB
做个总结哈
咱们回头再来看,本次内容能够 get 到如下知识点:
- 存储器的根本单位是存储单元
- 存储单元为 8bit
- 指针的值就是存储单元的编号
- CPU 地址总线的宽度决定了指针的值的最大范畴
查看《Go 语言轻松系列》更多内容
链接 http://tigerb.cn/go/#/kernal/