认识内存Memory

认识内存Memory认识内存 芯片 memory 的名称含义

1,简介

内存(memory)是计算机中最重要的部件之一,它是程序与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存对计算机的影响非常大,内存又被称为主存,其作用是存放CPU中的运算数据,以及与硬盘等外部存储设备交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到主存中进行运算,当运算完成后CPU再将结果传送出来,主存的运行也决定了计算结的稳定运行。

2,物理结构

内存的内部是由各种IC电路组成的,它的种类很庞大,但主要分为三种存储器

1,随机存储器(RAM)

内存中最重要的一种,表示既可以从中读取数据,也可以写入数据。当机器关闭时,内存中的信息会丢失。

2,只读存储器(ROM)

ROM一般只能用于数据的读取,不能写入数据,但是当机器停电时,这些数据不会丢失。

3,高速缓存(Cache)

Cache也是我们经常见到的,它分为一级缓存(L1 Cache)、二级缓存(L2 Cache)、三级缓存(L3 Cache)这些数据,它位于内存和CPU之间,是一个读写速度比内存更快的存储器。当CPU向内存写入数据时,这些数据也会被写入高速缓存中。当CPU需要读取数据时,会直接从高速缓存中直接读取,当然,如需要的数据在Cache中没有,CPU会再去读取内存中的数据。

3,读写过程

1,首先给VCC接通电源,给GND接通0V的电源,使用A0~A9来指定数据的存储场所,然后再把数据的值输入给D0~D7的数据信号,并把WR(write)的值置为1,执行完这些操作后,即可以向内存IC写入数据。
2,读取数据时,只需要通过A0~A9的地址信号指定数据的存储场所,然后再将RD的值置为1即可。
3,RD和WR被称为控制信号。其中当WR和RD都为0时,无法进行写入和读取操作。

4,内存的现实模型

为了便于记忆,我们把内存模型映射成为我们现实世界的模型,在现实世界中,内存的模型很像我们生活的楼房。在这个楼房中,1层可以存储一个字节的数据,楼层号就是地址,下面是内存和楼层整合的模型图。

在程序中的数据不仅仅只有数值,还有数据类型的概念,从内存上来看,就是暂用内存大小(占用楼层数)的意思。即使物理上强制以1个字节为单位来注意读写数据的内存,在程序中,通过指定其数据类型,也能实现以特定字节数为单位来进行读写。

低字节序列:将数据低位存储在内存低位地址。

高字节序列:将数据的高位存储在内存低位的方式称为高字节序列。

1,内存的使用

1,指针

指针是C语言非常重要的特征,指针也是一种变量,只不过它所表示的不是数据的值,而是内存的地址。通过使用指针,可以对任意内存地址的数据进行读写。

下面是一个完整的类型字节表:

数据类型读写长度示意图:

 

2,数组是内存的实现 

 数组是指多个相同的数据类型在内存中联系排列的一种形式。作为数组素的各个数据会通过下标编号来区分,这个编号也叫作索引,如此一来,就可以对置顶所以的素进行读写操作。

不同数据类型的数组:

3,栈

栈,Stack,是一种很重要的数据结构,栈采用LIFO(Last In First Out),即后入先出的方式对内存进行操作。

写入数据叫做 压入(push),取出数据叫做 弹出(pop)。

运行时栈的变化:

4,队列

队列和栈很相似但又不同,相同之处在于队列也不需要指定素的地址,不同之处在于队列是一种先入先出(First In First Out)的数据结构。

写入数据称为 EnQueue()入列,从队列中读出数据称为DeQueue()。

运行时队列的变化:

 队列的实现方式一般有两种:顺序队列和循环队列,我们上面的是顺序队列,下面看一下循环队列的实现方式。

环形缓冲区

循环队列一般是以环状缓冲区(ring buffer)的方式实现的,他是一种用于表示一个固定尺寸、头尾相连的缓冲区的数据结构,适合缓存数据流。假如我们要用6个素的数组来实现一个环形缓冲区,这时可以从起始位置开始有序的存储数据,然后再按照存储时的顺序把数据读出。在数组的末尾写入数据后,后一个数据就会从缓冲区的头开始写。这样,数组的末尾和开头就连接了起来。

 

5,链表

 链表和二叉树,都是可以不用考虑索引的顺序就可以对素进行读写的方式。通过使用链表,可以高效的对数据素进行添加和删除操作。而通过使用二叉树,则可以更高效的对数据进行检索。

在实现数组的基础上,除了数据的值之外,通过为其附带上下一个素的索引,即可实现链表。数据的值和下一个素的地址(索引)就构成了一个链表素:

 链表的删除

链表的添加

 

链表的添加不涉及到数据的移动,所以链表的添加和删除很快,而数组的添加涉及到数据的移动,所以比较慢,通常情况下,使用数组来检索数据,使用链表来进行添加和删除操作。

 6,二叉树

二叉树也是一种检索效率非常高的数据结构,二叉树是指在链表的基础上往数组追加素时,考虑到数组的大小关系,将其分成左右两个方向的表现形式。假如我们把50这个值保存到了数组中,那么,如果接下来要进行值写入的话,就需要和50比较,确定大小,比50大的放右边,小的放左边。

 二叉树是由链表发展而来,因此二叉树在追加和删除素方面也是同样有效的。

5,二进制表示

计算机内部是由IC电子件组成的,其中CPU和内存也是IC电子件的一种,CPU和内存使用IC电子件作为基本单,IC电子件有不同种的形状,但是其内部的组成单称为一个个的引脚。有人说CPU和内存内部都是超大规模集成电路,其实IC就是集成电路(Integrated Circuit)。

IC件切面图:

 IC件两侧排列的四方形块就是引脚,IC的所有引脚,只有两种电压:0v和5v,IC的这种特性,也就决定了计算机的信息处理只能用0和1表示,也就是二进制来处理。一个引脚可以表示一个0或1,所以二进制的表示方式就变成0、1、10、11、100、101等,虽然二进制数并不是专门为引脚来设计的,但是和IC引脚的特性非常吻合。

计算机的最小集成单为位,也就是比特(bit),二进制数的位数一般为8位、16位、32位、64位,也就是8的倍数,为什么要跟8扯上关系?因为在计算机中,把8位二进制数称为一个字节,一个字节有8位,也就是由8个bit构成。

字节是最基本的计量单位,位是最小单。

用字节处理数据时,如果数字小于存储数据的字节数(二进制的位数),那么高位就用0填补,高位和数学的数字表示是一样的,左侧表示高位,右侧表示低位。比如,一个六位数用二进制表示是,只有6位,高位需要用0填充,填充完后是0010 0111,占一个字节, 如果用16位表示就是0000 0000 0010 0111占用两个字节。

1,二进制数

二进制转十进制数表示图:

 也就是说二进制数代表的00转换成十进制就是39。

在任何情况下位权的值都是数的位数减一。那么第一位的位权就是1-1=0,第二位的位权就是2-1=1,以此类推。

2,移位运算和乘除运算

移位过程

把十进制的39转换为二进制的00,然后 向左移位 一个字节,就变成了0,那么再把此二进制转换为十进制就是78,和39是2倍关系。左移两位,就是156,相当于扩大了四倍。

3,便于计算机处理的补数

二进制数中表示负数数值时,一般会把最高位作为符号来使用,因此我们把这个最高位当做符号位。

计算机世界中是没有减法,计算机在做减法的时候其实是在做加法,也就是用加法来实现的减法运算。比如100-50,其实计算机来看的时候应该是100+(-50),在表示负数的时候就要用到二进制补数,补数就是用正数来表示的负数。

负数的二进制表示就是先求其补数,补数的求解过程就是对原始数值的二进制各位取反,然后将结果+1。

4,算数右移和逻辑右移的区别

右移在移位后空出来的最高位有两种情况0和1。当二进制数的值表示图形模式而非数值时,移位后需要在最高位补0,类似于霓虹灯向右平移的效果,这就被称为逻辑右移。

将二进制数作为带符号的数值进行右移运算时,移位后需要在最高位填充移位前符号位的值(0或1)。这就被称为算数右移。如果数值使用补数表示的负数值,那么右移后在空出来的最高位补1,就可以正确的表示1/2、1/4、1/8等的数值运算。如果是正数,那么直接在空出来的位置补0即可。

左移时,无论是图形还是数值,移位后,只需要将低位补0即可;右移时,需要根据情况判断是逻辑右移还是算数右移。

将数据进行符号扩展是为了产生一个位数加倍、但数值大小不变的结果,以满足有些指令对操作数位的要求,例如倍长于除数的被除数,再如将数据位数加长以减少计算过程中的误差。

5,逻辑运算的窍门 

计算机能够处理的运算,大体可分为逻辑运算和算术运算,算术运算指的就是加减乘除四则运算;逻辑运算指的是对二进制各个数位的0和1分别进行处理的运算,包括逻辑非(NOT运算)、逻辑与(AND运算)、逻辑或(OR运算)和逻辑异或(XOR运算)四种。

逻辑非:指的是将0变成1,1变成0的取反操作

逻辑与:指的是“两个都是1时,运算结果才是1,其他情况都是0”

逻辑或:指的是“至少有一方是1时,运算结果为1,其他情况下运算结果都是0”

逻辑异或:指的是“其中一方是1,另一方是0时运算结果才是1,其他情况下是0”

6,认识压缩算法

1,文件存储

文件是将数据存储在磁盘等存储媒介的一种形式。程序文件中最基本的存储数据单位是字节。文件的大小不管是xxxKB、xxxMB等来表示,就是因为文件是以字节B=Byte为单位来存储的。

文件就是字节数据的集合。用1字节(8位)表示的字节数据有256种,用二进制表示的话就是0000 0000 - 1111 1111。如果文件中存储的数据是文字,那么该文件就是文本文件。如果是图形,那么该文件就是图像文件。在任何情况下,文件的字节数都是连续存储的。

2,压缩算法的定义 

压缩算法,compaction algorithm,指的就是数据压缩的算法,主要包括压缩和还原(解压缩)的两个步骤。

其实就是在不改变原有文件属性的前提下,降低文件字节空间和占用空间的一种算法。

根据缩算法的定义,我们可将其分成不同的类型:

1,有损和无损

无损压缩:能够无失真地从压缩后的数据重构,准确地还原原始数据。可用于对数据的准确性要求严格的场合,如可执行文件和普通文件的压缩、磁盘的压缩,也可用于多媒体数据的压缩。该方法的压缩比较小。如差分编码、RLE、Huffman编码、LZW编码、算术编码。

有损压缩:有失真,不能完全准确地回复原始数据,重构的数据只是原始数据的一个近似。可用于对数据的准确性要求不高的场合,如多媒体数据的压缩。该方法的压缩比较大。例如预测编码、音感编码、分形压缩、小波压缩、JPEG/MPEG。

2,对称性

如果编解码算法的复杂性和所需时间差不多,则为对称的编码方法,多数压缩算法都是对称的。但也有不对称的,一般是编码难而解码容易,如Huffman编码和分形编码。但用于密码学的编码方法则相反,是编码容易,而解码则非常难。

3,帧间与帧内

在视频编码中会同时用到帧内与帧间的编码方法,帧内编码是指在一帧图像内独立完成的编码方法,同静态图像的编码,如JPEG;而帧间编码则需要参照前后帧才能进行编解码,并在编码过程中考虑对帧之间的时间冗余的压缩,如MPEG。

4,实时性

在有些多媒体的应用场合,需要实时处理或传输数据(如现场的数字录音和录像、播放MP3/RM/VCD/DVD、视频/音频点播、网络现场直播、可视电话、视频会议),编解码一般要求延时<=50ms。这就需要简单、快速、高效的算法和高速、复杂的CPU、DSP芯片。

5,分级处理

有些压缩算法可以同时处理不同分辨率、不同传输速率、不同质量水平的多媒体数据,如JPEG2000、MPEG-2/4。

3,几种常用压缩算法的理解
1,RLE算法

 从图中我们可以看出,17个字符被成功压缩成了12个字符,也就是12/17=70%,压缩比为70%。

像这样,把文件内容用数据*重复次数的形式来表示的压缩方法称为RLE(Run Length Encoding,行程长度编码)算法。RLE算法是一种很好的压缩方法,经常用于压缩传真的图像等。因为图像文件的本质也是字节数据的集合体,所以可以用RLE算法进行压缩。

通过上表可以看出,使用RLE对文本文件进行压缩后的数据不但没有减小反而增大了。几乎是压缩前的两倍!因为文本字符中连续的字符并不多见。

 2,哈夫曼算法和莫尔斯编码

文本文件是由不同类型的字符组合而成的,而且不同字符出现的次数也是不一样的。例如,在某个文本文件中,A出现了100次左右,Q仅仅用到了3次,类似这样的情况很常见。哈夫曼算法的关键就在于多次出现的数据用小于8位的字节数表示,不常用的数据则可以使用超过8位的字节数表示。A和Q都用8位来表示时,原文件的大小就是100次*8位+3次*8位=824位,假设A用2位,Q用10位来表示就是2*100+3*10=230位。

不过要注意一点,最终磁盘的存储都是以8位为一个字节来保存文件的。

莫尔斯编码一般把文本中出现最高频率的字符用短编码来表示。如下表所示,假如表示短点的位是1,表示长点的位是11的话,那么E(嘀)这一数据的字符就可以用1来表示,C(嘀嗒嘀嗒)就可以用9位的来表示。

 AAAAAABBCDDEEEEEF=A*6次+B*2次+C*1次+D*2次+E*5次+F*1次+字符间隔*16 = 4位*6次+8位*2次+9位*1次+6位*2次+1位*5次+8位*1次+2位*16次 = 106位 = 14字节。

所以使用莫尔斯电码的压缩比为14/17 = 82%。效率并不太突出。

3,用二叉树实现哈夫曼算法

哈夫曼算法是指,为各压缩对象文件分别构造最佳的编码体系,并以该编码体系为基础来进行压缩。用哈夫曼算法压缩过的文件中,存储着哈夫曼编码信息和压缩过的数据。

哈夫曼树的构造过程。自然界树是从根生叶,而哈夫曼树是叶生枝。

 

 

 使用哈夫曼树之后,出现频率越高的数据所占用的位数越少,这也是哈夫曼树的核心思想。

AAAAAABBCDDEEEEEF=000000000000 110 0 111,40位 = 5字节。

 3,可逆压缩和非可逆压缩

图像文件的使用目的通常是把图像数据输出到显示器,打印机等设备上。常用的图像格式有BMP、JPEG、TIFF、GIF格式等。

BMP:是使用Windows自带的画笔来做成的一种图像形式

JPEG:是数码相机等常用的一种图像数据形式

TIFF:是一种通过在文件中包含“标签”就能够快速显示出数据性质的图像形式

GIF:是由美国开发的一种数据形式,要求色数不超过256个

一般来说,JPEG格式的文件是非可逆压缩,因此还原后有部分图像信息比较模糊。GIF是可逆压缩。 

今天的文章 认识内存Memory分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2024-12-18 23:30
下一篇 2024-12-18 23:27

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/89489.html