存储与压缩

我们都知道Unix类系统根本哲学”一切皆文件” , 那么这到底是什么意思呢? 其他类别的组件可以由文件表示,那文件系统(FS)本身呢? 文件常见的操作压缩,又蕴含了哪些值得思考的点呢? 存储的内容非常多,很多涉及到底层和OS的许多东西, 这篇文章就先来简单看看~ (后续可能会拆分)

这篇文章会慢慢更新.

0x00.溯源

存储与文件,这是一个非常有历史的话题. 甚至远比PL(程序语言)早. 因为从很早的时期开始,人们就学会用各种物品进行存储了. 而“文件”多是一个存储的载体.

0x01.存储

这个东西感觉要配合计算机体系结构来讲. 感觉很难一次性规划好…慢慢补吧~说几个最根本的原则

  • 冷热分离
  • 时空互换 (时间和空间)

0x02.文件

1.文件描述符(fd)

2.

n.文件链接

软硬链接接的根本理解离不开inode相关概念, 最直观的还是用一张图来解释:

ln00

如果我们把inode看做是文件的真实本体 .可以看出硬链和文件名本质都是指向文件本身,相当于一个别名(其实各种alias/链接本质也都是取别名,清楚本质再去看名次就会舒服很多.)

0x03.文件系统

对普通人而言,接触很底层的存储几乎不太现实, 相对来说. 接触得最多的一层就是物理磁盘(block)之上的FS(file system) .比如Linux非常经典的VFS . 这个也等后续慢慢说吧..

0x04.缓存

缓存(cache) 其实有多种含义, 我们这里先说广义上的. 先看一下一张引用的经典图. 回顾一下基本硬件~

storageSpeed00

计算机的存储结构中 , 我们可以像图中的金字塔一样, 把比自己低一级的设备看做自己的缓存 .(内存是硬盘的缓存, SSD(固态)是HDD的缓存 .. 寄存器/Cache是内存的缓存) 有人说硬盘岂不是最慢的了?

你忘记了你用XX下载器 ,打游戏的时候那龟速的网线了么~~ (还有网络I/O垫底呢)

言归正传, 缓存用的地方如此之多, 并且形成了一种线性的传递, 但是缓存大小不管在哪一层都是有限的.应该存储最热点的数据. 根据我们冷热分离法则 , 我们自然应该让冷数据尽可能的被T出去 ~ 这种自然的想法对应的就是我们OS中常说的页面置换 ,其中OS层面有几种经典的实现方法:

  • LRU (Least recently used) 最少时间使用就T出, 最新使用到最前
  • FIFO (Queue) 先进先出用于作业调度是很常见的. 在缓存中会把最先进的缓存给T掉
  • LFU (Least frequently used) 最少次数使用的先T出. 有点类似LRU ,注意区别

他们也有很多的优化跟改进综合版本, 这超过了缓存的主题, 暂不多说. 我们首先来想一下缓存的核心是什么? K-V 对 , 也就是最常用的哈希表 结构.

0x0n.压缩

压缩技术广泛用在非常多的地方,因为这是本质上在利用算法节约存储空间,目前计算机砖家指出,根据XX压缩原理,通用压缩算法(any files)的压缩率不可能达到1/16 . 并认为有些文件哪怕一个二进制位都无法压缩—–这就是”压缩的有限性”

人们通常都能理解很多事物是有限的, 无限多是因为我们还不知道如何去界定(比如宇宙?) .要知道压缩的极限在哪,就得先从压缩的原理谈起.

1.原理

之前在学习Elasticsearch或Lucene的时候,我们看到了大量的压缩技巧,多是位运算级别的操作. 从性能来说,压缩是一种CPU换存储(时空互换)的做法 ; 从原理来说,其实就是对数据“重复位–>合并” 的过程,把长串用各种加工转为特殊的短串 . (比如XYYYY 计为 1X4Y)

可是,从上面的例子就可以看出,这种情况并不通用. 如果是完全不重复甚至不确定的串,那如何压缩呢? 比如无限不循环的自然数e .怎么去压缩? 因为在目前计算机的存储体系下,能操作的最小单位就是0101...的位, 所以因为压缩就是尽可能的减少重复位, 所以是存在很明显的局限性的.

一般常说的高压缩率的7z 压缩,就可以说是很好的压缩算法,尽可能的把重复冗长的地方转为不重复短小的.

2.应用

那么接着说,在Linux中,我们常能使用的两个命令, tar 和 zip/unzip 之间的关系是什么呢? tar.gz, tgz , zip,rar,7z,jar 这种压缩格式的区别又是什么呢? 首先要明白一个基本概念,我们目前说的压缩包 = 打包+压缩 . 打包只是单纯把多个文件归为一个文件. (文件版的文件夹)

  • tar包是单纯的打包,压缩需要其他算法来进行.所以单纯的 xx.tar是没有压缩的.
  • tar.gz 和 .tgz一般是一种格式,代表先用tar打包再用了gzip压缩.后者是一种缩写格式,我习惯后者,但是建议统一规范不要团队内混用.
  • rar是一种集打包和压缩一体的商业软件压缩格式, 压缩率比较优. (7z是7zip开源的压缩包,效率也挺好,推荐使用)

未完待续… 因为存储方面很多东西还不好随便写, 片面的理解容易误导大家..


参考资料:

  1. RuanYiFeng’s blog (地址待补..)