0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

计算机基础知识之内存

jf_78858299 来源:前端柒八九 作者:前端柒八九 2023-03-31 16:14 次阅读

计算机是进行 「数据处理」 的设备,而程序表示的就是处理顺序和数据结构。由于处理对象(数据)是存储在 「内存」「磁盘」 上的,因此我们今天来聊聊内存和磁盘。

内存的物理机制

❝内存实际上是一种名为 「内存IC电子元件。

「内存IC」 中有 电源「地址信号「数据信号」「控制信号」 等用于输入输出的大量 「引脚」 (IC的引脚),通过为其 「指定地址」 ,来进行数据的读写。

下图是 「内存IC」 的引脚配置示例。图片

  • VCCGND是**「电源」**
  • A0~A9「地址信号」 的引脚
  • D0~D7「数据信号」 的引脚
  • RDWR「控制信号」 的引脚

将电源连接到VCCGND后,就可以给其他引脚传递比如01这样的信号。大部分情况下,+5V「直流电压」 表示1,0V表示0

  • 「数据信号」 引脚有D0~D7共8个,表示 「一次可以输入输出8位」 (=1字节)的数据。
  • 「地址信号」 引脚有A0~A9共10个,表示可以指定0000000000~11111111111024个地址

由于地址用来表示数据的存储场所,因此我们可以得出这个 「内存IC」 可以存储1024个1字节的数据。又因为1024=1K,所以内存IC的容量就是1KB

向内存IC读写数据

写入数据

假设我们往内存IC中写入1字节的数据。

  • 可以给VCC接入+5V,给GND接入0V的电源
  • 并使用A0~A9「地址信号」 来指定**「数据的存储场所」**
  • 然后把数据的值输入给D0~D7的数据信号
  • 并**「把WR(write的缩写)信号设定为1」**

执行完这些操作,就可以在 「内存IC」 内部写入数据了。

图片

读取数据

在读取数据时,只需要通过A0~A9的地址信号指定数据的存储场所,然后再 「将RD(read的缩写)信号设成1」 即可。执行完这些操作,指定地址中存储的数据就会被输出到D0~D7的数据信号引脚中。

图片

WRRD这样可以让IC运行的信号称为 「控制信号」

「内存IC」 内部有大量可以存储8位数据的地方,通过地址指定这些场所,之后即可进行数据的读写。


内存的逻辑模型

❝内存的逻辑模型是楼房

图片

上图表示的是,内存为1KB时,有1024层的楼房,每层都有1字节的数据。并且地址的值是从上往下逐渐变大的。

不过,在实际的 编程环境」 下,还包含着物理内存中不存在的概念,那就是 「数据类型」 。在编程语言中的 「数据类型」 表示存储的是何种类型的数据。从内存来看,就是占用的内存大小(占有的楼层数)的意思。

❝即使是 「物理」 上以1个字节位单位来逐一读取数据的内存,在 「程序」 中,通过指定其类型,也能实现以 「特定字节数」 为单位来进行读写

我们通过一个具体示例来进行说明。

下面是一个往abc这三个变量中写入数据123C语言程序,

// 定义变量
char a;
short b;
long c;

// 给变量赋值
a = 123;
b = 123;
c = 123;

这3个变量表示的是内存的特定区域。

❝通过使用变量,即便不指定 「物理地址」 ,也可以在程序中对内存进行读写。

这是因为,在程序运行时候,操作系统「自动决定」 变量的物理地址。

在3个变量的数据类型分别是

  • char:1字节长度
  • short:2字节长度
  • long:4字节长度

因此,虽然同样是数据123,存储时其占据的内存大小是不一样的。

图片上面的示例图中,采用的是 「将数据低位存储在内存低位地址」 的低字节序Little Endian方式。

由此,我们可以得出一个结论: 「根据程序中所指定的变量的数据类型的不同,读写的物理内存大小也会随之发生变化」


数组是高效使用内存的基础

「数组」 是指多个 「同样数据类型」 的数据在内存中连续排列的形式。

作为数组元素的各个数据会通过 「连续的编号」 被区分开来,这个编号称为 索引「指定索引后,就可以对该索引对应地址的内存进行读写操作」

如下用C语言定义char类型、short类型、long类型三个数组。

char g[100];
short h[100];
long i[100];

数组的定义中所指定的数据类型,表示一次能够读取的内存大小。

❝数组是使用内存的基本,因为其他的内存使用技能,每一种都需要以数组为基础

图片


栈、队列以及环形缓冲区

❝栈和队列,都可以不通过指定地址和索引来对数组的元素进行读写。

栈和队列的区别在于 「数据出入的顺序是不同的」 。在对内存数据进行读写时, 「栈」 用的LIFO(Last Input First Out, 「后入先出」 )方式,而 「队列」 用的是FIFO(First Input First Out, 「先进先出」 )方式。

❝在内存中 「预留」 出栈和队列所需要的空间,并确定好写入和读出的顺序,就不用再指定地址和索引了

我们假定往栈中写入数据的函数名为Push,把栈中读出数据的函数名为Pop

使用栈

// 往栈中写入数据
Push(123);  // 写入123
Push(456);  // 写入456
Push(789);  // 写入789

// 从栈中读出数据
j = Pop();  // 读出789
k = Pop();  // 读出456
l = Pop();  // 读出123

图片

❝当我们需要 「暂时」 舍弃当前的数据,随后再 「恢复」 原貌时候,优先选用栈

使用队列

假定往队列中写入数据的函数名为EnQueue,把栈中读出数据的函数名为DeQueue

// 往栈中写入数据
EnQueue(123);  // 写入123
EnQueue(456);  // 写入456
EnQueue(789);  // 写入789

// 从栈中读出数据
m = DeQueue();  // 读出123
n = DeQueue();  // 读出456
o = DeQueue();  // 读出789

图片

❝当我们需要处理 「通讯」 中发送的数据时,或由 「同时运行的多个程序」 所发送过来的数据时,会用到这种队列中存储的不规则数据进行处理的方法

队列一般是以环形缓冲区Ring Buffer的方式来实现的。

假设我们要有6个元素的数组来实现一个队列。这时可以从数组的 「起始位置」 开始有序地存储数据,然后再按照存储时的顺序数据读出。在数组的末尾写入数据后,后一个数据就会被写入数据的起始位置(此时数据已经被读出所以该位置是空的)

图片

环形缓冲区的模型


链表

❝通过使用链表,可以更加高效地对数组数据(元素)进行 「追加」「删除」 处理

在数组的各个元素中, 「除了数据的值之外,通过为其附带上下一个元素的索引」 ,即可实现链表。 「数据的值和下一个元素的索引组合在一起」 ,就构成了数组的一个元素。

图片

由于链表末尾的元素没有 「后续」 的数据,因此就需要用别的值(这里是-1)来填充。

在需要追加或删除数据的情况下,使用链表是很高效的。

这里,我们把之前我们针对JS链表相关算法的一些技巧直接迁移过来了。这里使用 「哨兵节点」 来对链表操作进行简化处理。

「哨兵节点」 是为了简化处理链表 「边界条件」 而引入的**「附加链表节点」**

哨兵节点通常位于 「链表的头部」 ,它的值没有任何意义。在一个有哨兵节点的链表中, 「从第二个节点开始才真正的保存有意义的信息

追加数据

function append(head,value) {
  // 哨兵节点 
  let dumy = new ListNode(0);
  dumy.next = head;
  
  // 遍历链表,直到链表尾部
  let node = dumy;
  while(node.next!=null){
    node = node.next;
  }

  node.next = new ListNode(value);
  return dumy.next;
}

首先,创建一个 「哨兵节点」 (该节点的 「值」 没有意义 -即ListNode(0)参数为啥不重要),并把该节点当做链表的头节点, 「把原始的链表添加到哨兵节点的后面」dumy.next = head)。

然后,返回真正的头节点(哨兵节点的下一个节点)node.next

这里有一个小的注意点,就是在 「遍历」 链表的时候,并不是直接对dumy进行处理,而是用了一个 「零时游标节点」 (node)。这样做的好处就是,在append操作完成以后,还可以通过dumy节点来,直接返回链表的头节点dumy.next。因为,dumy一直没参与遍历过程。

删除数据

❝为了删除一个节点,需要找到被删除节点的 「前一个节点」 ,然后把该节点的next指针指向它 「下一个节点的下一个节点」

「哨兵节点」 ,在删除指定节点

function delete(head ,value){
  let dumy = new ListNode(0);
  dumy.next = head;
  
  let node = dumy;
  while(node.next!=null){
    if(node.next.value==value){
      node.next = node.next.next;
      barek;
    }
    node = node.next;
  }
  return dumy.next;
}

通过哨兵节点(dumy)直接将 「链表为空」「被删除节点是头节点」 的两种特殊情况,直接囊括了。用最少的代码,处理最多的情况

二叉树

「二叉树查找树」 是指在链表的基础上往数组中追加元素时,考虑到数据的大小关系,将其分成左右两个方向的表现形式。

图片

❝二叉查找树使 「数据搜索」 更有效。


「我们这里不对具体的数据结构进行详细的介绍。如果了解更多关于数据结构的和对应的算法的东西,可以移步到我们之前的文章中。」 总有一款适合你。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计算机
    +关注

    关注

    19

    文章

    6649

    浏览量

    84534
  • 内存
    +关注

    关注

    8

    文章

    2767

    浏览量

    72765
  • 数据处理
    +关注

    关注

    0

    文章

    509

    浏览量

    28247
  • 数据结构
    +关注

    关注

    3

    文章

    564

    浏览量

    39900
收藏 人收藏

    评论

    相关推荐

    计算机基础知识

    世界上第一台数字式电子计算机是由美国宾夕法尼亚大学的物理学家约翰 莫克利(John Mauchly)和工程师普雷斯伯 埃克特(Presper Eckert)领导研制的取名为ENIAC
    发表于 03-08 15:50

    计算机知识

    计算机知识
    发表于 07-20 08:50

    计算机组成原理基础知识

    计算机组成原理基础知识,前言参考:《王道计算机组成原理》学习笔记总目录+思维导图2019 王道考研 计算机组成原理第一章 计算机系统概述1.
    发表于 07-16 07:48

    计算机网络基础知识了解

    计算机网络技术复习一、 计算机网络基础知识了解:计算机网络(Internet)的发展 面向终端的计算机网络(单个
    发表于 07-26 06:27

    介绍一下计算机底层知识

    的更远,而计算机基础知识又是重中之重。下面,跟随我的脚步,为你介绍一下计算机底层知识。CPU还不了解 CPU 吗?现在就带你了解一下 CPU 是什么CPU 的全称是Central Pr
    发表于 07-26 06:21

    介绍一下计算机底层知识

    我们每个程序员或许都有一个梦,那就是成为大牛,我们或许都沉浸在各种框架中,以为框架就是一切,以为应用层才是最重要的,你错了。在当今计算机行业中,会应用是基本素质,如果你懂其原理才能让你在行业中走的更远,而计算机基础知识又是重中之
    发表于 07-28 06:15

    计算机基础知识点汇总,不看肯定后悔

    计算机基础知识点汇总,不看肯定后悔
    发表于 11-15 06:03

    计算机基础知识

    前言《MSP430单片机应用基础与实践》(华中科技大学出版社)------第0章------计算机基础知识(本文章作备忘录使用)1.进制转换2.数值数据的表示3.计算机的码制
    发表于 11-29 06:03

    计算机简介

    1计算机基础知识1.计算机简介1.1计算机定义:按照一定逻辑处理数据的带存储的机器。微型,小型,大型等。2.2计算机组成分为硬件、软件2.2
    发表于 12-23 06:45

    计算机基础知识选择题

    计算机基础知识选择题 1.微型计算机是由( )、存储器、输入设备和输出设备等部件组成的。  A. 硬盘 B. 软盘 C. 键盘 D. 运算控制单元 2.一台微机型号
    发表于 03-03 08:32 89次下载

    计算机基础知识练习题

    计算机基础知识练习题(一)单选题:1.计算机的描述中,( )是错误的。A. 计算机是一种可供计算的机器  、B.
    发表于 03-03 08:33 70次下载

    计算机基础知识试题

    计算机基础知识试题 1、CPU的主要功能是进行(     )。
    发表于 10-25 10:59 7843次阅读

    计算机总线技术基础知识

    计算机总线技术基础知识 任何一个微处理器都要与一定数量的部件和外围设备连接,但如果将各部件和每一种外围设 备都分别用一
    发表于 05-22 08:52 779次阅读

    计算机基础知识介绍

    计算机基础知识计算机基础知识计算机基础知识
    发表于 12-03 16:13 0次下载

    计算机控制技术的基础知识点说明

    本文档的主要内容详细介绍的是计算机控制技术的基础知识点说明包括了:1 计算机控制系统的概念,2 计算机控制系统的组成,3 计算机控制系统的分
    发表于 04-27 08:00 5次下载
    <b class='flag-5'>计算机</b>控制技术的<b class='flag-5'>基础知识</b>点说明