计算机存储梳理

35 阅读7分钟

什么是二进制?

平常咱们用的十进制表示法如: 0,1,2,3,4,5,6,7,8,9 其实就是用1个标志位标识某些数据的十个状态,套用到数据里可以表示数,当然也可以套用到其他地方, 因为严格意义上讲,每个标志位只是一个符号而已,它们标识的含义可以用于任何地方, 关键点是每个标志位能标识出十种状态,然后看用在什么地方再人为赋予其含义,标识某种含义或者其他的什么东西, 而二进制与之对应的, 每个标志位只能标识出两种数据状态, 为了更便于人类理解, 把状态标识为0 或 1, 也就是每个标识未只能有两种状态而已,与十进制没啥本质区别, 只不过人更容易理解十进制,具体为啥我也说不清,但我趋向于人有十个手指头,就更容易理解十进制

什么是存储介质?

我只说我的理解, 比如说纸张, 比如说算盘, 只要是有办法通过这种介质存储数据的某些状态就行,而存储这些数据状态的东西都算是存储介质

计算机的存储介质

比如磁盘,每个磁盘上的小颗粒材料被永久磁化,并且可以通过物理的方式改变磁极, 而且磁极只有两个,所以只能标示出两种数据状态, 对应二进制是0与1

比如固态硬盘,最小存储单元是晶体管, 晶体管也可以永久改变通道状态,根据是否通导能标识出两种状态:0 与 1, 随着技术的不断发展,甚至可以识别出更多种状态

磁盘和固态硬盘都可以实现永久存储, 存储量普遍也比较大, 还有一些是无法实现永久存储数据的存储介质,比如说内存条, 内存条只有通电的时候才能实现数据标识, 是根据电路与电压的变化, 每个电子元器件有通电电压如5v, 也可以不通电电压为0v, 这样也能标识两种状态 0 或 1

计算机还有其他非永久的存储介质,如寄存器, 存储原理与内存差不多

这些存储介质的读写速度都是不同的, 往往速度越快, 能存储的数据越少, 越快的同样的存储数据量造价也越高, 所以为了平衡造价与速度, 计算机往往使用多层内存结构, 因为计算机计算数据是通过cpu来的, 只要保证cpu不断地运行, 而不是堵塞在读取数据的过程中就行了, 至于是怎么做的, 就跟咱们平常写代码一样, 程序经常运行的代码可能只有代码总量的10%, 这10%占用cpu的的%90的运行时长, 那就先把经常运行的代码先放到读写效率更高的介质里, 如内存, 这些属于计算机组成设计层面的,但完全可以与程序设计相互印证地理解

计算机为什么要用二进制存储?

因为存储介质, 存储介质是不断地发展的, 最开始的存储介质包括现在的存储介质, 大多数最小存储单位都能标识数据的两种状态, 恰好对应二进制的两种状态 0 1, 顺其自然地,所以用二进制存储了, 而随着硬件结构的发展可能发展出最小单位能显示更多数据状态的介质, 但因为历史软件都是默认用2进制作为默认的存储与计算单位来处理的, 所以很难说推广出3进制或者4 5 6 7 的其他进制计算机,不过从存储与读取上来说, 10进制计算机体系肯定要比2进制计算机体系要更优秀的, 至少我是这么认为的..., 因为同样一次数据读写, 同样一个标志位10进制可以读出数据的10种状态, 2进制只能读取两种状态,读取与写入的次数肯定更少, 不过现在存储介质越来越大, 越来越快, 现在的最小数据组织单位往往以字节为单位, 也就是用八个最小单位标识一个字节, 每个最小单位能表示两种状态, 也就是能标识2^8种状态, 已经很快了, 而且现在有很多硬件设计都是以此为基础上做一些转化, 比如某个硬件的最小存储单元能标识数据的四种状态, 但是读取与写入都是对应二进制, 但是实际读取与写入只用更少的存储单元与存储步骤

寄存器 CPU-Cache(L1高速缓存 L2 高速缓存 L3高速缓存) 内存 SSD(固态) HHD(磁盘) 速度对比

先统一一下时间单位概念: 1s()=10^3ms(毫秒)=10^6μs(微秒)=10^9ns(纳秒) 为了对ns有直观的认识: 1ns 相当于 1/1000000000 秒 也就是10亿分之一秒

CPU时钟周期:即一次脉冲信号, 如果用时间单位衡量的话,不同型号的cpu都不同, 打个比方, 3GHz一秒可以产生30亿个脉冲信号, 也就是说如果换算成ns(纳秒的话) 相当于1ns 产生 3个脉冲信号, 1个脉冲信号 0.3333...ns 大约 0.3ns

特殊说一下寄存器与CPU-Cache: 寄存器与CPU-Cache结构都差不多, 寄存器是CPU直接读写的操作的区域,我理解的所有字节码都在这处理,因为cpu不会直接读取内存数据而是把cpu缓存或者内存数据一点点读到寄存器,然后再进行运算操作, 就大小而言32位cpu可存储4个字节,一个字节8位,相当于可以2^32个状态, 64位则可存储8个字节, 相当于 2^64个状态, 然后是多级缓存,一级比一级大,速度也越来越慢, 因为缓存是内存的缓存,cpu有多个核心, 里面还涉及到数据同步的问题, 所以缓存比寄存器读写要慢, 从物理上来讲他们的区别只有大小而已, 一般而言(就现在网络上的资料) 寄存器的读写速度要求在半个CPU时钟周期内完成读写, 按照3GHz的cpu来说大约是 0.3/2 ns

注意: 寄存器与CPU-Cache都是CPU处理器的组成部分, 是一起设计与工作的,所以CPU效率也要整体来看,不能单独看时钟周期,要看其他方面的优化,比如指令步骤之类的, 以后再梳理一下这个,感觉东西很多

介质大小时钟周期
寄存器4字节 或 8字节0.5左右
L1几十KB 到几百KB不等2 ~ 4时钟周期
L2几百KB到几MB不等10 ~ 20时钟周期
L3几MB到几十MB不等20 ~ 60时钟周期
内存大小不一定200 ~ 300时钟周期
SSD大小不一定2000 ~ 300000时钟周期
磁盘大小不一定20000000 ~ 30000000时钟周期

注意: 以上说的大小与时钟周期都不是固定的,随着计算机组件的发展这些介质的性能上限也在不断地刷新的, 这些数据只是大体标明一个量级而已

小技巧: 查看cpu的各级缓存详情: 在文件夹/sys/devices/system/cpu/cpu0/cache/ index0代表L1指令缓存大小 index1代表L1数据缓存大小 index2 index3分别代表L2 L3缓存 里面记录了缓存的大小以及其他信息, 其中cpu0相当于内核序号

image.png 网图:

image.png

image.png

image.png

Linux内存管理

待续...