小白的CTF学习之路8——节约内存的编程方式

时间:2023-12-11 20:07:56

今天第二更,废话不说上干货

上一章我们学习了内存和cpu间的互动方式,了解到内存的空间非常有限,所以这样就需要我们在编程的时候尽可能的节省内存空间,用最少的空间发挥最大的效果,以下是几种节约内存的方法:

函数共用

被调用方清理栈

数据压缩

函数公用:

假设有两个程序a,b,他们中有一个共同的代码都是用来发出显示指令的,这样就用了双倍的内存空间

windows有一个dll(动态加载)工具,把很多共有的指令集合到了一起,这样在软件需要的时候只需用函数调用就可以了,省去了写一长串代码的麻烦

被调用方清理栈:

这里引入了栈的概念,栈存放在内存区域,用于计算,存储一些临时使用的值,例如程序计算所产生的临时值,使用完需要回收

清理栈在什么时候完成?

答:在一个函数被调用后

windows由stdcall来做栈,其他方式要用一次声明一次

内存的物理结构:

扇区——>磁道(磁盘中的圆圈)

读写用簇的方式进行

一簇=一个扇区(早年)

簇:windows对于磁盘读写的单位,会根据磁盘大小而改变,簇与磁盘大小成正相关

一个扇区=512个字节

若存一个小于512b的文件,它会变成512b(byte)

1簇里不能有相同的文件

数据压缩:(节约磁盘)

RLE压缩算法

从数据来看:

AAAAAABBCCCDDDD

压缩后:A6B2C3D4

但是此种压缩方式有致命弱点

若:AAAA 4444 则会压缩成 A444,但这种压缩结果是错误的

所以RLE可以压缩图像(传真类型),EXE文件,但是无法压缩文本

文本压缩使用哈夫曼算法(很复杂,简单说)

大致原理:先找出出现的频率

例如:A:200 D::50 C:221

分别使用编码的方式,最短编码如1

按差进行编码,将编码方案与位数计算出来

使用电报的方式将常用编号做成短的,不常用的做成长的

最高压缩率能达到10%

以上所述为可逆压缩(可还原)

不可逆压缩(JPEG图片格式)会损坏文件

小白的CTF学习之路8——节约内存的编程方式

固态硬盘原理:本身没有改变,在磁盘扇区进行改变,通过类似集成IC操作,也是以出的方式读取,与U盘原理除通道不同其他一模一样

混合硬盘:有磁盘结构,还有一个IC比磁盘快,作为磁盘缓存

read磁盘阵列:

将数据分为几种块,使几种块同步读取,可理解为最早的分布式