深入浅出lz4压缩算法

深入浅出lz4压缩算法,第1张

lz4是目前综合来看效率最高的压缩算法,更加侧重压缩解压速度,压缩比并不是第一。在当前的安卓和苹果 *** 作系统中,内存压缩技术就使用的是lz4算法,及时压缩手机内存以带来更多的内存空间。本质上是时间换空间。

lz4压缩算法其实很简单,举个压缩的栗子

其中两个括号内的便代表的是压缩时检测到的重复项,(5,4) 代表向前5个byte,匹配到的内容长度有4,即"bcde"是一个重复。当然也可以说"cde"是个重复项,但是根据算法实现的输入流扫描顺序,我们取到的是第一个匹配到的,并且长度最长的作为匹配。

压缩后的数据是下面的格式

其他情况也可能有连续的匹配:

Literals 指没有重复、首次出现的字节流,即不可压缩的部分

Match 指重复项,可以压缩的部分

Token 记录literal长度,match长度。作为解压时候memcpy的参数

可以想到,如果重复项越多或者越长,压缩率就会越高。上述例子中"bcde"在压缩后,用(5,4)表示,即从4个bytes压缩成了3个bytes来表示,其中offset 2bytes, match length 1byte,能节省1个byte。

大致流程,压缩过程以至少4个bytes为扫描窗口查找匹配,每次移动1byte进行扫描,遇到重复的就进行压缩。

由于offset用2bytes表示,只能查找到到2^16(64kb)距离的匹配,对于压缩4Kb的内核页,只需要用到12位。

扫描的步长1byte是可以调整的,即对应LZ4_compress_fast机制,步长变长可以提高压缩解压速度,减少压缩率。

我们来看下 apple的lz4实现

压缩理解了其实解压也很简单

根据解压前的数据流,取出token内的length,literals直接复制到输出,即memcpy(src,dst,length)

遇到match,在从前面已经拷贝的literals复制到后面即可

设置名大致意思调节建议

USB mass storage mode USB大容量存储模式 看你喜好

governor CPU调度模式 建议 “zzmoove zanez optimised”

scheduler(int sd) 内置SD, i/o调度大小 建议选1024 或ROW

scheduler(ext sd) 外置SD,i/o调度大小 建议选1024 或ROW

CPU max frequency CPU最大频率。你自己看着办 建议1800

CPU min frequency CPU最小频率。你自己看着办 建议默认的200

CPU undervolting 调节CPU最小电压 建议不调

GPU frequencies GPU频率组调节 可以调高点

GPU undervolting 调节GPU最小电压 建议不调

GPU threshold GPU性能阈值 看你喜好,我选的performance,就是性能的意思

led fading led灯渐褪控制 看你喜好

led speed LED闪烁速度 看你喜好

LMK minfree 安卓低内存杀进程机制控制 建议不调

AC charge rate 电池电流等 建议不调

USBcharge rate USB电流等 建议不调

lgnore unstable charging power 忽略不稳定的充电电源 看你喜好

agni preload swap 512mb SWAP.大家都懂吧,虚拟内存 NOTE2运存够大,不需要开启

touchboost 触觉刺激频率 我也不知道是干嘛的

touch wake 触摸屏幕唤醒 看你个人喜好了,不过不是很好用,偶尔点屏幕不亮

internalSD read_ahead_kb 预读缓冲区大小(内置sd卡) 建议1024

EXternalSD read_ahead_kb 预读缓冲区大小(外置sd卡) 建议1024

power saving load balancer 电量节省平衡控制 建议medium savings

lz4 zram size Z4内存压缩 建议500MB

swappiness 控制swap触发的百分比 数值越大。虚拟内存才用得到,不过NOTE2运存本身就大,不需要

frandom rng 实在不懂 就不要开启

agni extsd2intsd expanded 大概意思就是在外部内存卡上开启虚拟内存供内部SD卡使用 没什么用

touche key lighting scenario 点亮屏幕键选择 无

mdnie hijack 屏幕显示色彩方案 建议选“standard”

mdnie hijack sharpness 屏幕显示锐度 可以开启

dynamic filesync V1.2 CPU动态调频 建议开启

agni filesystems checking on boot 开机自动检测文件系统 建议不调

agni battery stats clear on boot 开机自动清除电池状态 建议不调

以下命令在Linux root下进行

1.apt-getinstall gnupg2 wget –y

2.加入Proxmox 软件包源

wget -qO -http://download.proxmox.com/debian/proxmox-ve-release-6.x.gpg | sudo apt-key add echo "deb http://download.proxmox.com/debian/pve buster pve-no-subscription " | sudotee /etc/apt/sources.list.d/buster-pvetest.list

3.apt-getupdate

4.安装编译环境

apt-get install build-essentialasciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzipzlib1g-dev libc6-dev subversion flex uglifyjs p7zip p7zip-full msmtp libssl-devtexinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automakelibtool autopoint device-tree-compiler screen

apt-get install python3-dev  python3-sphinx lintian bc bison libdw-devlibiberty-dev libnuma-dev libslang2-dev lz4 rsync  libpve-common-perl dh-make docbook5-xml

若是出现libncurses5-dev安装依赖错误,用aptitude安装即可解决

5. Git pve内核源码

git clonegit://git.proxmox.com/git/pve-kernel.git

6. 修改Makefile文件

23行内容 KERNEL_ARCH=x86和之后 修改成如下图所示:

7.  在pve-kernel/debian/rules.d文件目录下生成文件arm64.mk,内容如下

KERNEL_BUILD_ARCH       = arm64

KERNEL_HEADER_ARCH   = $(KERNEL_BUILD_ARCH)

KERNEL_BUILD_IMAGE     = Image

KERNEL_IMAGE_PATH =arch/$(KERNEL_BUILD_ARCH)/boot/${KERNEL_BUILD_IMAGE}

KERNEL_INSTALL_FILE       = vmlinuz

8.  修改pve-kernel/debian/rules文件,将rysnc中的tools修改成source,修改结果如下图所示

9.  Make all

10.最终编译成功后会生成四个文件包,使用dpkg -i命令安装四个deb包,即可完成pve内核的安装。

linux-tools-{KERNEL_VER}_arm64.deb

linux-tools-5.0-dbgsym_{KERNEL_VER}_arm64.deb

pve-headers-{KERNEL_VER}_arm64.deb

pve-kernel-{KERNEL_VER}_arm64.deb


欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/bake/11607443.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存