内存

一、内存的物理结构:

 

内存的形式:ROM(只读)、RAM(读、写)、DRAM(经常更新)、SRAM(不经常更新)

 

内存IC物理模型,如下图所示:

芯片引脚的分类:电源引脚(供电)地址引脚(寻址)数据引脚控制引脚(读、写)

图中 5V、0V为电源引脚,A0--A9为地址引脚,RD为读引脚、WR为写引脚,D0--D7为数据引脚

 

内存容量:假如 地址为10位 那么可寻址的范围为(0000000000--1111111111 一共1024个地址),1024 * 1byte = 1KB

 

内存芯片写入数据的过程:首先接入电源,A0--A9引脚通过通电和不通电来确定当前的地址(地址:001111000) 通过地址我们就能找到内存中对应的位置(即存储场所),然后通过CPU控制D0--D7引脚(数据:00001111)通电和不通电 确定要写入的数据,再将WR引脚通电(置1),此时就将数据00001111写入到001111000这个地址中去,这样我们就完成了一次的数据的写入。

注意:数据的写入只能是8位8位这样来写,即一个字节一个字节来写,不是1位1位来写。

 

二、内存的逻辑结构

数组:

我们将内存想想成一间间存储数据的楼房,每一层都有一个编号(这个编号就是内存地址),每一个楼层大小(8bit = 1byte),楼层每加1,数据就加8bit。

 

这时我们就会引入两个问题:

1、我们将内存看成是以整一栋楼房,每一层楼房都能存储8bit,但是我们想要存储一个32bit的数据该怎么办呢?

2、怎么样的操作才能让这样楼房式结构的读和写数据更快呢?

 

先来解决第一个问题:

我们都知道 char是1byte,int是4byte,存储char类型的数据的时候我们就直接在一楼层存储即可,但是我们想存储int类型的数据,一个楼层的容量不够来存储,这时我们就将4个楼层打包成一个楼层来存储int类型的数据,并且告诉我们首地址为0011,如下如所示。 

 

接下来解决第二个问题:

我们的内存地址都是从上而下依次来进行累加的,要最快地访问这些地址里面存储的数据的话,我们也只需要通过累加一步步下来。例如下图所示的我们要存储6个char类型的数据,我们取的时候只需要拿到首地址,然后依次从下面取即可,这样的操作就非常符合我们内存当中的结构。这样的数据模型我们称之为数组,数组的操作效率高,顺序读取能力是最快最强的,我们可以一次就能读取到我们想要读取的那些数据。

 

为什么数组的顺序读取能力是最快的?

我们想要访问内存中的一些数据,CPU只需要算出存储这些数据内存的首地址例如为0001,然后将首地址后面直到我们想要取到的数组的位置这一整块取回给CPU,如果我们想要访问第5个数据的时候,我们只需要将首地址加上一个偏移量(0001 + 4 = 0004),这样我们就能访问到第5个数据了,如下图所示。

 

但是数组这样的数据结构也存在着的这样问题:我们想要将下图中的3删除,我们通过首地址寻址到存储3的位置,将3删除之后我们为了保持原来的数据结构不变 通过偏移量来访问数据,我们还需要将下面的4和5上移,这样就会变得很慢。

 

针对于上面出现的问题,我们引入了几种新的数据结构:栈、队列、链表、二叉树

1、栈用于数据记录,做记录的查询以及一些回溯(比如我们发现10:05 做的事情不好,我们想回溯到11:00我们就可以采用这种数据结构)

在内存中划分出一个栈区,区别于数组的存储,数组的存储是从上往下存,栈的存储是从下往上存,具有先进后出的性质;只有两种操作,其中一种是入栈,另一种是出栈

 

2、队列:从上向下存储具有先进先出的特性

 

总结:栈和队列都属于数组结构形式的存储,删除和插入会比较麻烦,这时我们就引出一种新的数据结构 链表。

 

3、链表:某楼层中 不仅存储数据(占8bit)也存储指针(占8bit)

比如我们想删除掉存储520这个链表单元,我们只需将第一个楼层的指针指向520后面的楼层即可。

 

三、磁盘

物理结构

扇区:磁盘中是由一个个圆盘组成,一个圆盘叫做一个磁道,讲一个一个磁道划分开的部分叫做扇区,硬盘中读写是以簇的方式来进行的,一簇等于一个扇区,如下图所示。

 

计算机中存储数据的东西:
1、寄存器(CPU内部):速度快、容量小、最贵

2、内存:速度一般快、容量一般多、一般贵

3、硬盘:速度慢、容量大、便宜

 

计算机执行程序的时候是如何来执行的?

1、第一种方式:CPU直接从磁盘当中取数据取回到寄存器中,进行运算完成之后再将数据存到磁盘中,如下图所示。

2、第二种方式:将硬盘中的数据加载到内存中然后CPU直接访问内存,这样的速度相对于直接访问硬盘会快不少,如下图所示。

存储式计算机:一个程序(app)存储在一个固定的地方,当我们运行时只需要执行一次加载即可。

 

磁盘缓存:第一次使用数据的地方读取硬盘中的数据,访问的同时将需要读取的数据写入到内存中(这种方式就叫磁盘缓存),当第二次使用数据的地方再次使用这个数据的时候就可以直接从内存中进行读取,数据用完之后再还给硬盘。这种使用内存当硬盘的方式解决了硬盘访问慢的问题。

 

引入磁盘缓存之后解决论文速度慢的问题,但是出现了内存不够用的问题,这时就引入了一个虚拟内存的概念。

虚拟内存:将磁盘当中的一块作为内存来使用

假设我们的内存只有5MB,但是此时我们需要运行10MB的程序,我们就从硬盘中划分出5MB来给程序做加载用的内存,因为CPU只能运行内存中的程序,我们运行完内存中5MB的程序,那么存储在硬盘当中的5MB程序怎么运行呢,这时就通过分页式或者是分段式这两种算法,将虚拟内存中的程序和物理内存中程序进行交换,如下图所示。

 

四、节约磁盘的编程方式

1、函数共用:DLL,动态加载

我们用两块内存存放两个程序,这两个程序(A、B)有同一个方法(显示),这样就会造成内存的浪费,如下图所示。

这时我们就用一种动态内存库的方式,存放显示的程序,当A程序用到显示时就去动态内存库调用,当B程序用到显示时就去动态内存库调用,这样就使一块内存被无限次地使用,如下图所示。

 

2、被调用方清理栈

我们的程序最后都会变成机器码对应着汇编代码,在程序运行的时候我们需要进行计算和存储一些临时使用的值。在我们的内存中专门有一块区域来存放临时计算的值,这个专门的区域就叫做,但是栈不能无限扩大,并且使用完成需要清理回收(栈在函数调用完进行清理回收)。

 

3、数据压缩

RLE算法:适用于压缩图像和exe文件

哈夫曼算法:适用于文本的压缩

 

专栏连接:https://blog.csdn.net/weixin_39903708/category_10358586.html

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个写代码的修车工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值