这篇文章主要是对计算机数据的描述,以及对数据结构存在的原因进行了简要概述。
要想了解数据结构,首先我们要搞清楚以下问题。
数据就是数值,也就是我们通过观察、实验或计算得出的结果。数据有很多种,最简单的就是数字。数据也可以是文字、图像、声音等。<引自:百度百科·数据>
像语言一样,数据是人为创造的信息载体,人们指定数据表示特性的含义。
而在计算机中的数据以二进制信息单元0,1的形式表示。在实际存储过程中可能是不同的电压,晶体管中是否包含电子,单元中包含哪种磁性等等…
那么单单靠这些0,1能够存储什么信息呢?
其实靠这些0,1完全可以存储所有的信息。
如:0000 0000 0000 0001这一串二进制数据。在8086芯片指令集中表示的含义为“左方16位寄存器与右方16位寄存器相加后,数据存入右方寄存器”这一指令。
而在磁盘中可以表示十六进制数0x1,也就是十进制数字1;也可以表示图像、声音中的一个片段;或者是你在操作游戏英雄时的一次施展技能。
那么你可能会好奇,一样的数据,计算机如何区分数据携带的信息呢?
的确对于计算机而言,在相同条件下没有办法区分数据携带的信息。它只能通过不同的存储位置和计算机的不同状态来区分相同数据携带的不同信息。就像我们人一样,我们在使用同样数据携带不同信息的时候,往往是通过不同的使用场景来区分。所以通过数据的不同组合可以扩展数据所携带的信息。
现在我们知道了,计算机可以通过0,1存储数据了。那么计算机如何通过数据来给我们提供现在这么多的功能呢?
其中计算机一直为我们所提供的功能只有计算、读取、写入。是的一切复杂的操作,最终只有这三个。当你利用计算机在网上浏览数据、在键盘上敲打文字、在游戏里畅游、甚至用VR技术体验虚幻世界,都不过是这三个操作。
上面的图片,我相信学过计算机组成原理的同学都认识。这是美籍匈牙利数学家冯·诺伊曼于1946年提出存储程序原理。其中核心的部分就是把程序本身当作数据。这也是我们下一章要讲的。
虽然这个体系结构是1946年提出的,但是现在无论再先进的计算机,甚至包括量子计算机都是使用的这一体系结构。虽然随着技术的发展,计算机也出现一些改变,但是核心仍然是这些,就像虽然现在计算机拥有CPU、GPU。但是其实它们两个都主要是完成的计算任务。不通的是它们有分工,CPU主要负责复杂的计算任务拥有较少但是复杂的计算单元(ALU),GPU则不同,它主要完成的是一些简单的任务,但是量大,所以GPU拥有较多简单的(ALU)。GPU的出现主要是跟着图像显示需求的不断增加,同时它的并行任务处理能力也是其存在的重要原因之一。
那么计算机是如何操作数据呢?
首先读取和写入,都是通过不同的物理方式实现,根据不同的存储介质,操作的方式也都不一样。但是对于运算来讲,却是基本上都是相同的,计算机中的运算主要包括加、减、移位。甚至有的运算器只包括加法和移位。这是因为二进制的算术操作的特殊性,详细可以看一下数字逻辑。
上面那些简单的操作都是简单的数学计算,那么如何通过简单的数学计算实现如此复杂的计算机操作呢?
我们都知道乘法可以用加法来表示,那么除法呢?除法是通过移位和异或运算实现的。
有了加、减、乘、除
**怎么实现打开一个txt呢?(粗略讲) **
先将一个简单的在,命令行条件下打开txt,步骤如下
按下键盘,省略一大部分物理事件之后,按键的码值被传输到操作系统的硬件抽象层,
键盘在它的中断请求线(IRQ)上发送信号,信号会被中断控制器映射到一个中断向量,
实际上就是一个整型数 。CPU使用中断描述符表(IDT)把中断向量映射到对应函数,这些函数被称为中断处理器,它们由操作系统内核提供。
当一个中断到达时,CPU根据IDT和中断向量索引到对应的中断处理器,然后操作系统内核出场了。
当使用图形化的 X Server 时,X Server 会按照特定的规则把键码值再一次映射,映射成扫描码。当这个映射过程完成
之后, X Server 把这个按键字符发送给窗口管理器(DWM,metacity, i3等等),窗口管理器再把字符发送给当前窗口。
当前窗口使用有关图形API把文字打印在输入框内。
想看详细信息可以看一下这个链接:https://www.zhihu.com/question/265849231
系统对输入的字符串进行分析,确定命令与参数,并运行命令。
cat命令是查看文件的命令。具体在系统底层的实现是通过C语言调用输出接口和文件指针,来实现。
而进一步往下,到汇编语言的时候,首先要添加数据段,打开文件,读取文件到缓存中,显示缓存的内容,关闭文件。
到汇编之下
我们就来到了全是二进制的世界,在这里所有的命令,参数,值,全部变成了二进制。
https://wenku.baidu.com/view/bfbf042869eae009591bec26.html?from=search
上面的链接是,汇编指令的二进制操作码。这些二进制是设计在cpu中的逻辑电路的。
通过这些指令和ALU逻辑运算单元、缓存、总线、寄存器…便能够实现按机器代码的运行。
而汇编代码跟机器码是翻译关系,就是把机器语言翻译成人的语言。
高级语言的出现都是为了方便人类
c语言的出现让人的工作更加轻松。在c语言中不用再管用哪一个寄存器,怎么移位等等。
而比C更加高级的编程语言,则让人更加轻松,比如python语言,不用再管理内存,管理指针等等。
数据结构从编程出现便已经存在,但是并不是全部的数据结构在一开始都存在。
简单说,数据结构的出现就是为了更好的编程。在C语言之后,基本上都把寄存器等底层的存储硬件交给了编译器、解释器处理。(c语言还可以操作寄存器)所以留给程序的只有内存。而现代计算机都是多任务的计算机。所以会有很多的程序同时对内存进行读写操作。所以内存往往是散乱分布的。
为了使算法顺利运行并快速得出正确的结果,数据存储 和 检索技术在其中起着非常关键的作用。而内存就如我们上面所说的。所以的算法都是为了解决问题,有些算法很简单,而有些算法很复杂,因为它们解决了更复杂的问题。大多数算法的输入是存储在计算机上的数据,只有一种数据结构不足以解决所有问题,一些算法可能需要顺序访问所有数据,而另一些算法可能只需要最近插入的数据。随着问题陈述不断改变,算法也因此变化。“ 一个尺寸适合所有人“不能使用方法论,为了解决这个问题,我们有不同类型的数据结构来存储各种形式的数据,这取决于数据的用途,并且根据所设计的算法,必须识别和使用合适的数据结构。
总的来讲数据结构就是为了方便算法更快速高效的存储读取数据。
下面就让我们来深入了解数据结构吧!