数据结构知识铺垫1:内存简述

        笔者写该系列文章的目的在于复习巩固自己所学过的数据结构知识,并尽可能以通俗易懂的语言描述数据结构,使得非科班的同学对这门课有一个大体的了解(在这之前希望读者有一定的C语言基础)。在学习数据结构这门课之前,我们要先学习一些知识作为铺垫。受水平限制,文章难免有纰漏,欢迎大家在评论区指正。话不多说,现在开始。

1.所见即所得

        先解释一下“所见即所得”。可能有的同学(包括笔者)闹过这样的笑话:在别的同学的电脑(Win系统)上看到了自己电脑(Win系统)上没有的软件,自己懒得去官网下载,直接在桌面上右键点击软件图标,复制到自己的U盘上,然后再用U盘将其复制到自己的电脑上,结果点击软件图标发现用不了 ;又或者想卸载某个软件,就右键点击图标,再点击删除就以为万事大吉了,实则不然。但是在手机上面,如果我们想卸载掉一个APP,直接长按再卸载,就可以将APP卸载干净。造成两者的区别的关键就在于:电脑上的软件图标不是“所见即所得”的。就好比软件是一台机器,而桌面图标只是这台机器的启动按钮而已,我们复制图标相当于只是把启动按钮复制了,但庞大的软件“机器”仍在同学的电脑中。而手机APP的图标做到了“所见即所得”,因此我们对图标进行卸载就相当于对整个APP进行卸载。

        看一下你桌上的电脑,这里以笔记本电脑为例,我们可以看到笔记本的主体部分是键盘,屏幕,USB接口等等一系列东西。注意:电脑是典型的“所见并非所得”,即我们看到的这些东西只是电脑部件的一部分,在电脑的内部另有洞天。

2.内存概述

        可能读者会问:前面说这么多有什么用?希望大家意识到,在计算机领域,很多时候是“所见并非所得”的,这个思想不仅体现在软件代码层面,在硬件层面也有所体现。比如你面前的笔记本电脑,你能看到的部件大多数是输入/输出设备,即与使用者完成交互的设备,而计算机内部的硬件细节,使用者不可见,也不需要了解。现在就让我们把外部的部件无视掉,去看一下电脑的内部结构,如下图:

        

                                                                 图1. 外存,CPU,内存

        你之前可能只是听说过它们三个的名字,但并不了解它们的具体作用。这里就稍微介绍一下(有些细节可能并不准确,但对于数据结构来说这些细节不是我们关心的)。对于一台计算机,让我们回到它最原始的功能:计算。这里以加法为例,加法需要用到哪些东西?两个做加法的数字(称为操作数),一个会执行加法功能的部件,图中的CPU就是可以执行加法功能的部件,但是从哪里取操作数呢?内存会提供操作数,CPU从内存中取出操作数之后就可以进行加法操作了。

        有同学会问:那外存有什么用呢?操作数最开始是在外存中的,只有程序运行时,才把操作数搬到内存,再提供给CPU进行运算。这里要纠正一下萌新同学的一些误区:误区1:我们常说的手机内存,比如256G/8G,这里的256G准确来说是存储空间(外存)而非内存,8G才是手机的内存。误区2:硬盘与U盘哪个是外存?哪个是内存?实际上他们都是外存,而内存在电脑的内部,硬件名称为内存条。关于这三者,可以形象地理解为:把数据比作水,外存为一个水库,内存为蓄水池,而CPU为喝水的人。执行程序,就相当于打开了水库的闸门,水从水库流向蓄水池(即数据从外存流向内存),人就可以从蓄水池取水(CPU就可以从内存取操作数进行运算);程序结束运行,就相当于关闭了闸门,而蓄水池中就没水了(这一点和现实取水不一样),人就没水喝了(CPU就没有操作数进行运算了)。

        可以看出,内存是保存运算数据的关键部件,也是我们在学习数据结构之前需要深刻了解的一个部件,因为数据结构的故事大部分发生在这个部件上。现在,就让我们探讨一下内存的部件细节。我们已经知道了,内存可以存储数据,但它是怎么存储123456...这些数字的呢?在高中时我们学习过二进制,知道了十进制正整数可以转换为二进制的正数。现在可以告诉大家,事实上二进制可以表示的数字不局限于正整数,它还可以表示负整数,小数等一系列我们平常用到的数字(具体表示细节是组成原理中的课程,这里不再赘述)。这就好办了,因为二进制数只包括0和1这两个数字。试想一下,有一排灯泡,灯泡有亮与灭两种状态,我们用亮的状态表示1,灭的状态表示0,那么就可以用灯泡的亮与灭来表示二进制数了。当然在内存中不是用灯泡,而是用的高低电平来表示1和0。现在我们看一下内存的内部细节:

                                                                 图2. 内存内部细节

        (图中有个错误,内存中没有0这个地址)如图为内存的内部细节,这张图大家务必要深刻理解,它不仅贯穿了整个数据结构课程,在组成原理和操作系统中也会有所涉及。我们把内存理解为一栋楼,则每一栋楼存储一个数字,这个数字是二进制数(由0和1组成),在硬件层面就是高/低电平,对应的就是图中的Data区域,至于每层楼可以存储几位二进制数,这是组成原理中的内容,在数据结构中我们不必深究,默认可以存储的数字大小满足需要即可。每栋楼都有许多的楼层,而内存这栋楼有很多层(可认为有无限多层,足够我们使用),有楼层就要有楼层编号,以方便我们找到对应的数字,内存这栋楼从第0层开始编号,然后0,1,2,3……一直编号下去,如图中的Add(Address)区域。你可能注意到了,我们并不会称呼数字在第几层,而是说它的地址(Address)是多少。还要强调一点:高/低电平只用于表示Data(数据);而Add(地址)并不需要高/低电平表示,Add只是方便我们寻找数据的。

3.内存抽象与简化

        看到这里,相信你已经对内存有了一个较为浅显的认识,事实上,在数据结构中,我们并不会很深入地刻画内存,而是尽可能地将内存抽象、简化。怎么理解抽象和简化?简化:比如在内存中的数据,我们不需要用二进制表示,为了方便讨论问题,我们仍用十进制来表示。抽象:比如当我们需要将每两个相邻地址的数据看做一个整体来研究问题时,即地址为0,1的两个数据记为数据A,地址为2,3的两个数据记为数据B……以此类推,那么A,B……的地址如何表示?我们可以将地址(0,1)看做地址0,将地址(2,3)看做地址1……将地址(2*i,2*i+1)看做地址i。当需要把三个、四个相邻地址的数据看做一个整体时情况类似,不再赘述。引入这两个思想之后,会简化之后一些问题的讲解。

        这里举个例子说明一下:

                                                                 图3. 内存抽象

         如图,我们将两个地址的内存空间看做了一个地址,并且其中的数据用十进制表示,以便于问题的研究(图中有个错误,内存中没有0这个地址)。

        讲到这里,一些必备的知识铺垫就结束了,下节课我们就利用内存,对数据结构进行一个整体的概括。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值