数据结构讲的是啥
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构讲的是啥相关的知识,希望对你有一定的参考价值。
参考技术A 问题一:数据结构在讲什么? 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的 *** 。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。一、线性表
(一)线性表的定义和基本操作
(二) 线性表的实现
1. 顺序存储结构
2. 链式存储结构
3. 线性表的应用
二、栈、队列和数组
(一)栈和队列的基本概念
(二)栈和队列的顺序存储结构
(三)栈和队列的链式存储结构
(四)栈和队列的应用
(五)特殊矩阵的压缩存储
三、树与二叉树
(一)树的概念
(二)二叉树
1. 二叉树的定义及其主要特征
2. 二叉树的顺序存储结构和链式存储结构
3. 二叉树的遍历
4. 线索二叉树的基本概念和构造
5. 二叉排序树
6. 平衡二叉树
(三)树、森林
1. 书的存储结构
2. 森林与二叉树的转换
3. 树和森林的遍历
(四)树的应用
1. 等价类问题
2. 哈夫曼(Huffman)树和哈夫曼编码
四、 图
(一) 图的概念
(二) 图的存储及基本操作
1. 邻接矩阵法
2. 邻接表法
(三) 图的遍历
1. 深度优先搜索
2. 广度优先搜索
(四) 图的基本应用及其复杂度分析
1. 最小(代价)生成树
2. 最短路径
3. 拓扑排序
4. 关键路径
五、 查找
(一) 查找的基本概念
(二) 顺序查找法
(三) 折半查找法
(四) B-树
(五) 散列(Hash)表及其查找
(六) 查找算法的分析及应用
六、 内部排序
(一) 排序的基本概念
(二) 插入排序
1. 直接插入排序
2. 折半插入排序
(三) 气泡排序(bubble sort)
(四) 简单选择排序
(五) 希尔排序(shell sort)
(六) 快速排序
(七) 堆排序
(八) 二路归并排序(merge sort)
(九) 基数排序
(十) 各种内部排序算法的比较
(十一) 内部排序算法的应用
问题二:数据结构到底是讲什么的呢 相信你也知道俗话说:计算机程序=算法+数据结构。数据结构就是讲的怎样在计算机程序中组织存储批量数据,以及为什么这样组织。相同的一批数据,不同的组织方式(不同的数据结构)有不同的优缺点,有的利于查找(hash);有的利于排序(树);有的利于插入、删除(节点式链表)。在深入还有不同组织方式的查找、排序等等操作的时间、空间复杂度。
问题三:数据结构是什么意思?希望讲的通俗一点。 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的 *** 。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。bjl.website
问题四:什么是数据结构? 30分 数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的 *** 。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
数据结构在计算机科学界至今没有标准的定义。个人根据各自的理解的不同而有不同的表述方法:
Sartaj Sahni在他的《数据结构、算法与应用》一书中称:“数据结构是数据对象,以及存在胆该对象的实例合组成实例的数据元素之间的各种联系。这些联系可以通过定义相关的函数来给出。”他将数据对象(data object)定义为“一个数据对象是实例或值的 *** ”。
Clifford A.Shaffer在《数据结构与算法分析》一书中的定义是:“数据结构是 ADT(抽象数据类型Abstract Data Type) 的物理实现。”
问题五:数据结构学的到底是什么,和算法的关系 本人乃一个数据痴迷者,在计算机的道路上,也是一个数据结构的痴迷者,现在大学里面和同学搞开发也痴迷于数据库,我就我个人的理解给你谈一谈:首先,数据结构是一门计算机语言学的基础学科,它不属于任何一门语言,其体现的是几乎所有标准语言的算法的思想。上面的概念有一些模糊,我们现在来具体说一说,相信你门的数据结构使用的是一门具体的语言比如C/C++语言来说明,那是为了辅助的学习数据结构,而数据结构本身不属于任何语言(相信你把书上的程序敲到电脑里面是不能通过的吧,其只是描述了过程,要调试程序,还需要修改和增加一些东西)。你们的书上开始应该在讲究数据的物理存储结构/逻辑存储结构等概念,说明数据结构首先就是“数据的结构”,在内存上的存储方式,就是物理的存储结构,在程序使用人员的思想上它是逻辑的,比如:你们在C/C++中学习到链表,那么链表是什么一个概念,你们使用指针制向下一个结点的首地址,让他们串联起来,形成一个接一个的结点,就像显示生活中的火车一样。而这只是对于程序员的概念,但是在内存中存储的方式是怎样的那?对于你程序员来说这是“透明”的,其内部分配空间在那里,都是随机的,而内存中也没有一个又一根的线将他们串联起来,所以,这是一个物理与逻辑的概念,对于我们程序员只需要知道这些就可以了,而我们主要要研究的是“逻辑结构”。我可以给你一个我自己总结的一个概念:所有的算法必须基于数据结构生存。也就是说,我们对于任何算法的编写,必须依赖一个已经存在的数据结构来对它进行操作,数据结构成为算法的操作对象,这也是为什么算法和数据结构两门分类不分家的概念,算法在没有数据结构的情况下,没有任何存在的意义;而数据结构没有算法就等于是一个尸体而没有灵魂。估计这个对于算法的初学者可能有点晕,我们在具体的说一些东西吧:我们在数据结构中最简单的是什么:我个人把书籍中线性表更加细化一层(这里是为了便于理解在这样说的):单个元素,比如:int i;这个i就是一个数据结构,它是一个什么样的数据结构,就是一个类型为int的变量,我们可以对它进行加法/减法/乘法/除法/自加等等一系列操作,当然对于单个元素我们对它的数据结构和算法的研究没有什么意义,因为它本来就是原子的,某些具体运算上可能算法存在比较小的差异;而提升一个层次:就是我们的线性表(一般包含有:顺序表/链表)那么我们研究这样两种数据结构主要就是要研究它的什么东西那?一般我们主要研究他们以结构为单位(就是结点)的增加/删除/修改/检索(查询)四个操作(为什么有这样的操作,我在下面说到),我们一般把“增加/删除/修改”都把它称为更新,对于一个结点,若要进行更新一类的操作比如:删除,对于顺序表来说是使用下标访问方式,那么我们在删除了一个元素后需要将这个元素后的所有元素后的所有元素全部向前移动,这个时间是对于越长的顺序表,时间越长的,而对于链表,没有顺序的概念,其删除元素只需要将前一个结点的指针指向被删除点的下一个结点,将空间使用free()函数进行释放,还原给操作系统。当执行检索操作的时候,由于顺序表直接使用下标进行随机访问,而链表需要从头开始访问一一匹配才可以得到使用的元素,这个时间也是和链表的结点个数成正比的。所以我们每一种数据结构对于不同的算法会产生不同的效果,各自没有绝对的好,也没有绝对的不好,他们都有自己的应用价值和方式;这样我们就可以在实际的项目开发中,对于内部的算法时间和空间以及项目所能提供的硬件能力进......>>
问题六:谁的数据结构讲的好 你好。
用网易公开课,可以看斯坦福的和MIT的,那个秒杀国内的。
可以用手机WIFI看,也可以用电脑看。
如果我的回答没能帮助您,请继续追问。.
问题七:用你的理解说,什么是数据结构. 数据结构+算法=程序数据结构是指数据在计算机内存(或磁盘中)的组织形式
所谓组织形式是指数据的
逻辑结构:数据间的邻接关系 如 线性、树形、图状;
存储结构:数据以何种方式进行存储 如 顺序式、链式;
例:对10个人的成绩进行排序的算法
首先,将10个人的信息和成绩输入计算机
然后进行排序
最后,输出结果
第一步是存储信息 关键要考虑2个问题 :以何种方式将10个人的信息存入(存储结构),存入候每个人之间的关系是什么?(逻辑结构)
即 要求 指明数据在计算机内的组织形式 这是一个数据结构问题 显然如果只有这10个数据的话,我们会选择数组这种数据结构进行组织
先说几种常见的数据结构: 数组 链表 二叉树 栈 哈希表等所有的数据结构都通过其逻辑结构和存储结构来定位,二者也是每一个数据结构的核心部分。如 1维数组的
逻辑结构:线性
存储结构:顺序式
单链表 是 线性和链式 队列是 线性和顺序式解决了数据的存储问题
接着思考如何排序
首先处理同一类问题(此处为排序),如果数据结构不同,其算法也不同。同样是排序却有堆排序和数组排序之分等
因此在考虑算法时,要注意考虑数据结构。
在程序设计时更应该综合考虑算法与数据结构的选择与搭配,以设计出最适合的程序
因此 程序设计可分二步
1.选择数据结构
2.根据选择的数据结构设计算法
然后一个程序即构建成功了。
原创.
问题八:数据结构到底怎么学比较好啊? 写数据结构代码编程了学习C语言,是大多数初学者的经验,其实有办法可以避免的。
多想> 多看 > 多写字 > 多动键盘
养成好的编程习惯很重要。
做任何工作之前,要把自己的思路整理清楚 参考别人的相关工作经验,针对自己的需求做分析 把思路落实到纸张上 采用自顶向下的编程方式,先把你的个函数的功能,入口和出口描述清楚 每个函数内部的执行流程,都要注释好。 最后再分段逐步编码。
这样可以有效的避免大多数的错误发生。 即便出现错误,也很容易定位到问题的所在。 不知道大家是怎样看待数据结构这门课的,有多少人觉得数据结构很难呢?我知道还是有一些同学这样觉得的,有时候我跟我的朋友讲要怎样学,讲了一大堆以后,他就向我抱怨:我以前c++都没有学好,数据结构更学不好了,这哪跟哪的话啊,数据结构与c++没有什么关系,我想假如抱有这样的心态,自己就不相信自己,那是不可能学好的,然后那些觉得数据结构很难的同学,我想他们应该会很看重数据结构的吧,然后就一天到晚捧着一本数据结构,这样不会觉得很累吗?而且因为觉得很难,就容易不相信自己,学的效率也不会很好,个人认为数据结构很好学,很容易学,或许这有点妄自菲薄吧,但是因为我觉得很容易,当然就会觉得自己没问题,学得很轻松,效果也还可以。大家都是从高考走过来的,应该知道心态的重要性吧,两种不同的心态,完全就是两种不同的效果。学了这么久数据结构了,我们到底在学些什么呢?不知道大家有没有想过,那现在我们现在来归纳一下我们学习的内容吧,其实学到现在我们也就学了几种普通的数据结构,象二叉树,树,图,还有排序的问题,前面的线性表和字符串也就是一些概念,当然还有一个很重要的KMP算法,然后在每种数据结构中我们也就是学到了若干处理的算法,我想真正数起来也就是几十个算法吧。学习数据结构也就是要掌握这几十种算法,多简单。至于如何掌握每个算法呢,我想就是多看看书,重要的是能够理解。 如果真的想学好数据结构的话,最好是能够自己思考问题,不要刚想了一会就觉得做不出来,然后就去问其他人。其实张老师给我们的作业还是基于我们的水平的,我绝对相信我们自己能够独自想出算法,虽有可能会比较长时间吧,但是这样肯定会比问其他人学到更多的东西。当然我并不是说不要问同学,有时候就是脑筋转不过来,一问别人就懂了,当然问了别人不能只是我知道了这个算法,还应该去想如何思考才能得到这个算法,这样水平会提高很多。
很多计算机专业的同学对于大学2年级开设的数据结构课程很是头痛. 看见大家总在谈论数据结构重要性,可使自己学习却总也找不到合适的方法. 下面我和大家分享一下我过去一年多以来学习和应用数据结构方面一些经验. 内容都是来自作者本人的一些经历和体验,希望对于大家学习数据结构有引导作用。 1什么是数据结构 数据结构从文字上面来看,为数据和结构两部分。这样就很容易联系到数据结构的本质是一种对于数据结构花的知识。补充一个知识点,数据结构本质和离散数学有很密切的关系。离散数学是处理的是离散(非连续的)的数据,站在数据结构的观点上来看,也可以理解是一种非连续数据的结构。 2数据结构和程序设计语言 数据结构和程序设计语言本身没有任何联系,唯一有的关系就实用程序语言去描述数据结构。 因为数据结构是一种抽象数据,通过程序设计语言可以将在计算机中进行实现。今天大学里数据结构课程常用来描述数据结构的语言有C程序设计语言,C 程序设计语言和JAVA程序设计语言.而对于喜欢其他语言的同学完全可以自己通过学习数据结构后用自己熟悉的程序设计语言去完成程序化的描述. 我自己过去......>>
问题九:数据结构视频哪个讲的比较好 ! 清华大学 严蔚敏 的 - =# 优酷上有全集…… 但兄台你要忍住、刚开始看的时候吓坏我了、、、还有一个是中山大学的、普通话不太标准 讲的还比较彻底……都是在优酷或土豆上的
计算机组成原理是啥
计算机组成原理是什么
计算机组成指的是系统结构的逻辑实现,包括机器机内的数据流和控制流的组成及逻辑设计等。计算机由什么组成的,有什么原理呢?下面我为大家分析一下!
【计算机性能指标】
计算机的性能指标主要是CPU性能指标、存储器性能指标和I/O吞吐率。
处理机字长:是指处理机运算器中一次能够完成二进制运算的位数。
总线宽度:一般指CPU中运算器与存储器之间进行互连的内部总线二进制位数。
存储器带宽:单位时间内从存储器读出事物二进制数信息量,一般用字节数/秒表示。
主频/时钟周期:CPU的工作节拍受主时钟控制,主时钟不断产生固定频率的时钟,主时钟的频率(f)叫CPU的主频。主频的倒数称为CPU的周期(T)。
CPI:表示每条指令周期数,即执行一般程序所占用的CPU时间,
CPU执行时间=CPU时钟周期数*CPU时钟周期
MIPS:表示平均每秒执行多少百万条定点指令数,
FLOPS:表示每秒执行浮点操作的次数,用来衡量机器浮点操作的性能。
FLOPS=程序中的浮点操作次数/程序执行时间(s)
【定点数的表示和运算】
一个定点数由符号位和数值域两部分组成。按小数点位置不同,定点数有纯小数和纯整数两种表示方法。在定点计算机中,两个原码表示的数相乘的运算规则是:乘积的符号位由两数的符号位按异或运算得到,而乘积的数值部分则是两个正数相乘之积。两个原码表示的数相除时,商的符号位由两数的符号按位相加求得,商的数值部分由两数的数值部分相除求得。
【算数逻辑单元ALU】
为运算器构造的简单性,运算方法中算数运算通常采用补码加、减法,原码乘除法或补码乘除法。为了运算器的高速性和控制的简单性,采用了先行进位、阵列乘除法、流水线等并行技术措施。ALU不仅具有多种算术运算和逻辑运算的功能,而且具有先行进位逻辑,从而能实现高速运算。
【存储器的分类】
按存储介质,用半导体器件组成的存储器称为半导体存储器,用磁性材料做成的存储器称为磁表面存储器;作为存储介质的基本要求,必须有两个明显区别的物理状态,分别用来表示二进制的代码0和1。另一方面,存储器的存取速度又取决于这种物理状态的改变速度。
按存取方式,存储器中任何存储单元的内容都能被随机存取,且存取时间和存储单元的位置无关的存储器称为随机存储器,存储器只能按某种顺序来存取,即存取时间和存储单元的物理位置有关的存储器称为顺序存储器;半导体存储器是随机存储器,RAM和ROM都是采用随机存取的方式进行信息访问,磁带存储器是顺序存储器。
按信息易失性,断电后信息消失的存储器称为易失性存储器,断电后仍能保存信息的存储器称为非易失性存储器;半导体读写存储器RAM是易失性存储器,ROM是非易失性存储器,磁性材料做成的存储器是非易失性存储器。
按存储内容可变性,有些半导体存储器存储的内容是固定不变的,即只能读出而不能写入,这种半导体存储器称为只读存储器(ROM),既能读出又能写入的半导体存储器称为随机读写存储器(RAM);
按系统中的作用,可分为内部存储器、外部存储器;又可分为主存储器、高速缓冲存储器、辅助存储器、控制存储器;半导体存储器是内部存储器,磁盘是外部存储器,又是辅助存储器。
【存储器的层次化结构】
目前在计算机系统中,通常采用多级存储器体系结构,即使用高级缓冲存储器(cache)、主存储器和外存储器。CPU能直接访问的存储器称为内存储器,它包括cache和主存储器。CPU不能直接访问外存储器,外存储器的信息必须调入内存储器后才能为CPU进行处理。cache是计算机系统中的一个高速小容量半导体存储器,在计算机中利用cache来高速存取指令和数据。cache的工作原理基于程序运行中具有的空间局部性和时间局部性特征。cache能高速地向CPU提供指令和数据,从而加快了程序的执行速度。从功能上看,它是主存的缓冲存储器,由高速的SRAM组成。为追求高速,包括管理在内的全部功能由硬件实现,因而对程序员是透明的。与主存容量相比。cache的容量很小,它保存的内容只是主存内容的一个子集,且cache与主存的数据交换是以块为单位。主存储器是计算机系统的主要存储器,由MOS半导体存储器组成,用来存放计算机运行期间的大量程序和数据,能和cache交换数据和指令。外存储器是大容量辅助存储器,通常用来存放系统程序和大型数据文件及数据库。
存储器的技术指标有存储容量、存取时间、存储周期、存储器带宽。存取时间、存储周期、存储器带宽三个概念反映了主存的速度指标。
存取时间:指一次读操作命令发出到该操作完成,将数据读出到数据总线上所经历的时间。通常取写操作时间等于读操作时间,故称为存储器存取时间,存取时间又称存储器访问时间。
存储周期:指连续两次读操作所需间隔的最小时间。通常,存储周期略大于存取时间。
“位(bit)”是电子计算机中最小的数据单位,每一位的状态只能是0或1。8个二进制位构成一个“字节(Byte)”,字节是储存空间的基本计量单位,一个字节可以储存一个英文字母,2个字节可以储存一个汉子。“字”由若干字节构成,字的位数叫作字长,不同档次的机器有不同的字长。存储器的基本单位字节的长度是8 bit。表示主存容量的常用单位字节B,是基本单位。此外还有KB、MB、GB、TB。一个双稳态半导体电路或一个CMOS晶体管或磁性材料的存储元,均可以存储一位二进制代码。这个二进制代码位是存储器中最小的存储单位,称为存储位元。
所有的SRAM的特征是用一个锁存器(触发器)作为存储元,触发器具有两个稳定的状态,只要直流供电电源一直加在这个记忆电路上,它就无限期地保持记忆的1或0状态;如果电源断电,那么存储的数据(1或0)就会丢失。SRAM是易失性存储器。半导体静态存储器 SRAM 的存储原理是依靠双稳态电路。SRAM存储器的存储元是一个触发器,它具有两个稳定的状态。SRAM的优点是存取速度快,但存储容量不如DRAM大。动态MOS随机读写存储器DRAM的存储容量极大,通常用作计算机的主存储器。主存也可以用SRAM实现,只是成本高。与SRAM相比,DRAM成本低、功耗低,但需要刷新。动态RAM存储信息依靠的是电容。DRAM存储器的存储元是由一个MOS晶体管和电容器组成的记忆电路,其中MOS晶体管作为开关使用,而所存储的信息1或0则是由电容器上的电荷量来体现--当电容器充满电荷时,代表储存了1,当电容器放电没有电荷时,代表存储了0。读出过程也是刷新过程。输入缓冲期与输出缓冲器总是互锁的。这是因为读操作和写操作是互斥的,不会同时发生。与SRAM不同的是:DRAM增加了行地址锁存器和列地址锁存器,增加了刷新计数器和相应的控制电路。DRAM比SRAM集成度更高。DRAM读出后必须刷新,而未读写的存储元也要定期刷新,而且要按行刷新,所以刷新计数器的长度等于行地址锁存器。DRAM存储位元是基于电容器上的电荷量存储,这个电荷量随着时间和温度而减少,因此必须定期地刷新,以保持它们原来记忆的信息。DRAM是易失性存储器。一次读操作会自动地刷新选中行中的所有存储位元。然而通常情况下,人们不能准确地预知读操作出现的频率,因此无法阻止数据丢失。在这种情况下,必须对DRAM进行定期刷新。DRAM使用电容存储,所以必须隔一段时间刷新(refresh)一次,如果存储单元没有被刷新,存储的信息就会丢失。DRAM存储器有读周期、写周期和刷新周期,刷新周期比读/写周期有更高的优先权。DRAM存储器需要逐行进行定时刷新,以使不因存储信息的电容漏电而造成信息丢失。另外,DRAM芯片的读出是一种破坏性读出,因此在读取之后要立即按读出信息予以充电再生。动态MOS随机读写存储器DRAM的存储容量极大,通常用作计算机的主存储器。SRAM和DRAM都是随机读写存储器,它们的特点是数据可读可写。ROM叫作只读存储器,在它工作时只能读出,不能写入,其中存储的原始数据必须在它工作以前写入。FLASH叫作闪存存储器,是高密度非易失性的读/写存储器,高密度意味着它具有巨大比特数目的存储容量,非易失性意味着存放的数据在没有电源的情况下可以长期保存。FLASH存储元是在EPROM存储元基础上发展起来的。闪存存储器有三个主要的基本操作,它们是编程操作、读取操作和擦除操作。可编程ROM有PROM、EPROM、EEPROM。其中,PROM是一次性编程。EPROM叫作光擦除可编程只读存储器,它的存储内容可以根据需要写入,当需要更新时将原存储内容抹去,再写入新的内容。EEPROM叫作电擦除可编程只读存储器,其储存元是一个具有两个栅极的NMOS管,这种存储器在出厂时,存储器内容为全“1”状态。使用时,可根据要求把某些存储元写“0”。EPROM是可改写的,但它不能用作为随机存储器用。
【主存储器与CPU的连接】
主储存器和CPU之间增加cache的目的是解决CPU和主存之间的`速度匹配问题。程序和数据存储在主存中,主存通常采用多体交叉存储器,以提高访问速度。cache是一个高速缓冲存储器,用以弥补主存和CPU速度上的差异。指令部件本身又构成一个流水线,它由取指令、指令译码、计算操作数地址、取操作数等几个过程段组成。指令队伍是一个先进先出(FIFO)的寄存器栈,用于存放经过译码的指令和取来的操作数。它也是由若干个过程段组成的流水线。执行部件可以具有多个算数逻辑运算部件,这些部件本身又用流水线方式构成。为了使存储器的存取时间能与流水线的其他各过程段的速度匹配,一般采用多体交叉存储器。执行段的速度匹配问题,通常采用并行的运算部件以及部件流水线的工作方式来解决。一般采用的方法包括:将执行部件分为定点执行部件和浮点执行部件两个可并行执行的部分,分别处理定点运算指令和浮点运算指令;在浮点执行部件中,又有浮点加法部件和浮点乘/除部件,它们也可以同时执行不同的指令;浮点运算部件都以流水线方式工作。所谓资源相关,是指多条指令进入流水线后在同一机器时钟周期内争用同一个功能部件所发生的冲突。在一个程序中,如果必须等前一条指令 执行完毕后,才能执行后一条指令,那么这两条指令就是数据相关的。为了解决数据相关冲突,流水CPU的运算器中特意设置若干运算结果缓冲寄存器,暂时保留运算结果,以便于后继指令直接使用,这称为“向前”或定向传送技术。控制相关冲突是由转移指令引起的。当执行转移指令时,依据转移条件的产生结果,可能为顺序取下条指令;也可能转移到新的目标地址取指令,从而使流水线发生断流。为了减小转移指令对流水线性能的影响,常采用以下两种转移处理技术:由编译程序重排指令序列来实现的延迟转移法、硬件方法来实现的转移预测法。
【双口RAM和多模块存储器】
双端口存储器采用空间并行技术,能进行高速读/写操作。双端口存储器提供了两个相互独立的读写电路,可以对存储器中任意位置上的数据进行独立的存取操作。事实上双端口存储器也可以由DRAM构成。当两个端口的地址不相同时,在两个端口上进行读写操作,一定不会发生冲突。当两个端口同时存取存储器同一存储单元时,便发生冲突。总之,当两个端口均为开放状态且存取地址相同时,发生读写冲突。
一个由若干模块组成的主存储器是线性编址的,这些地址在各模块中的安排方式有两种:一种是顺序方式,一种是交叉方式。从定性分析,对连续字的成块传送,交叉方式的存储器可以实现多模块流水式并行存取,大大提高存储器的带宽,由于CPU的速度比主存快,假如能同时从主存取出n条指令,这必然会提高机器的运行速度。多模块交叉存储器是一种并行存储器结构。
【高速缓冲存储器(cache)】
cache是一种高速缓冲存储器,是为了解决CPU和主存之间速度不匹配而采用的一项重要技术。其原理基于程序运行中具有的空间局部性和时间局部性特征。cache能高速地向CPU提供指令和数据,从而加快了程序的执行速度。从功能上看,它是主存的缓冲存储器,由高速的SRAM组成。为追求高速,包括管理在内的全部功能由硬件实现,因而对程序员是透明的。当前随着半导体器件集成度的进一步提高,cache已放入到CPU中,其工作速度接近于CPU的速度,从而能组成两级以上的cache系统。cache除包含SRAM外,还要有控制逻辑。若cache在CPU芯片外,它的控制逻辑一般与主存控制逻辑合成在一起,成为主存/cache控制器;若cache在CPU内,则由CPU提供它的控制逻辑。CPU与cache之间的数据交换是以字为单位,而cache与主存之间的数据交换是以块为单位。一个块由若干字组成,是定长的。当CPU读取内存中一个字时,便发出此字的内存地址到cache和主存。此时cache控制逻辑依据地址判断此字是否在cache中:若是,此字立即传送给CPU;若非,则用主存读周期把此字从主存读出送到CPU,与此同时,把含有这个字的整个数据块从主存读出送到cache中。从CPU看,增加一个cache的目的,就是在性能上使主存的平均读出时间尽可能接近cache的读出时间。为了达到这个目的,在所有的存储器访问中由cache满足CPU需要的部分应占很高的比例,即cache的命中率应接近于1.由于程序访问的局部性,实现这个目标是可能的。运算器由算数逻辑单元(ALU)、通用寄存器、数据缓冲寄存器DR和状态条件寄存器PSW组成,它是数据加工处理部件。运算器接受控制器的命令而进行动作,即运算器所进行的全部操作都是由控制器发出的控制信号来指挥的,所以它是执行部件。运算器有两个主要功能:(1)执行所有的算数运算;(2)执行所有的逻辑运算,并进行逻辑测试,如零值测试或两个值的比较。通常,一个算数操作产生一个运算结果,而一个逻辑操作则产生一个判决。
与主存容量相比,cache的容量很小,它保存的内容只是主存内容的一个子集,且cache与主存的数据交换是以块为单位。为了把主存块放到cache中,必须应用某种方法把主存地址定为到cache中,称做地址映射。“映射”的物理含义是确定位置的对应关系,并用硬件来实现。这样当CPU访问存储器时,它所给出的一个字的内存地址会自动变换成cache的地址。由于采用硬件,这个地址变换过程很快,软件人员丝毫感觉不到cache的存在,这种特性成为cache的透明性。地址映射方式有全相联方式、直接方式和组相联方式三种。在全相联映射中,将主存中一个块的地址(块号)与块的内容(字)一起存于cache的行中,其中块地址存于cache行的标记部分中。这种带全部块地址一起保存的方法,可使主存的一个块直接拷贝到cache中的任意一行上。全相联映射方式的检索过程:CPU访存指令指定了一个内存地址(包括主存和cache),为了快速检,指令中的块号与cache中所有行的标记同时在比较器中进行比较。如果块号命中,则按字地址从cache中读取一个字;如果块号未命中,则按内存地址从主存中读取这个字。在全相联cache中,全部标记用一个相联存储器来实现,全部数据用一个普通RAM来实现。全相联方式的主要缺点是比较器电路难于设计和实现,因此只适合于小容量cache采用。直接映射方式也是一种多对一的映射关系,但一个主存块只能拷贝到cache的一个特定行位置上去。直接映射方式的优点是硬件简单,成本低。缺点是每个主存块只有一个固定的行位置可存放,如果块号相距m整数倍的两个块存于同一cache行时,就要发生冲突。发生冲突时就要将原先存入的行换出去,但很可能过一段时间又要换入。频繁的置换会使cache的效率下降。因此直接映射方式适合于需要大容量cache的场合,更多的行数可以减小冲突的机会。采用直接映射时,cache无需考虑替换问题。从存放位置的灵活性和命中率来看,全相联映射方式为优;从比较器电路简单及硬件投资来说,直接映射方式为佳。组相联映射方式将cache分成u组,每组v行,主存块存放到哪个组是固定的,至于存到该组哪一行是灵活的。组相联映射方式的比较器电路容易设计和实现,而块在组中的排放又有一定的灵活性,使冲突减少。全相联映射方式和组相联映射方式速度较低,通常适合于小容量cache。
cache工作原理要求它尽量保存最新数据。当一个新的主存块需要拷贝到cache,而允许存放此块的行位置都被其他主存块占满时,就要产生替换。对直接映射方式来说,因一个主存块只有一个特定的行位置可存放,所以只要把此特定位置上的原主存块换出cache即可。对全相联和组相联cache来说,就要允许存放新主存块的若干特定行中选取一行换出。cache的替换全部靠硬件实现。
如何选取就涉及替换策略,又称替换算法,硬件实现的常用算法主要有以下三种:1)近期最少使用(LRU)算法:将近期内长久未被访问的行换出;2)最不经常使用(LFU)算法:将一段时间内被访问次数最少的那行数据换出;3)随机替换:实际上是不要什么算法,从特定的行位置中随机地选出一行换出即可。在Cache替换算法中,近期最少使用法比较正确地利用了程序访存局部性原理,替换出近期用得最少的存储块,命中率较高,是一种比较好的替换算法;随机法是随机地确定替换的存储单元,先进先出法是替换最早调入的存储单元,它们都没有根据程序访存局部性原理,命中率较低;而后进先出法不是cache所使用的替换算法,此法在堆栈存储结构中使用。
【虚拟存储器】
常用的虚拟存储系统由主存-辅存两级存储器组成,其中辅存是大容量的磁表面存储器。在虚拟存储器中,主存的内容只是辅存的一部分内容。虚拟存储系统是为了提高存储系统的性能价格比而构造的分层存储体系,力图使存储系统的性能接近高速存储器,而价格和容量接近低速存储器。虚拟存储利用了程序运行时的局部性原理把最近常用的信息块从相对慢速而大容量的存储器调入相对高速而小容量的存储器。虚拟存储主要是解决存储容量问题,另外还包括存储管理、主存分配和存储保护等方面。虚存所依赖的辅存与CPU之间不存在直接的数据通路,当主存不命中时只能通过调页解决,CPU最终还是要访问主存。虚存管理由软件(操作系统)和硬件共同完成,由于软件的介入,虚存对实现存储管理的系统程序员不透明,而只对应用程序员透明(段式和段页式管理对应用程序员“半透明”)。主存未命中时系统的性能损失要远大于cache未命中时的损失。
【虚拟内存管理】
虚存机制也要解决一些关键问题:(1)调度问题:决定哪些程序和数据应被调入主存;(2)地址映射问题:在访问主存时把虚地址变为主存物理地址,在访问辅存时把虚地址变为辅存的物理地址,以便换页;(3)替换问题:解决哪些程序和数据应被调出主存;虚拟存储器的替换算法与cache的替换算法类似,有FIFO算法、LRU算法、LFU算法,虚拟存储器的替换有操作系统的支持(4)更新问题:确保主存和辅存的一致性。虚拟存储器分为页式、段式、段页式三种。
页式虚拟存储系统中,虚地址空间被分成等长大小的页,称为逻辑页;主存空间也被分成同样大小的页,称为物理页。相应地,虚地址分为两个字段:高字段为逻辑页号,低字段为页内地址(偏移量);实存地址也分为两个字段:高字段为物理页号,低字段为页内地址。通过页表可以把虚地址(逻辑地址)转换成物理地址。在大多数系统中,每个进程对应一个页表。现代的中央处理机通常有专门的硬件支持地址变换。每个进程所需的页数并不固定,所以页表的长度是可变的,因此通常的实现方法是把页表的基地址保存在寄存器中,而页表本身则放在主存中。由于虚地址空间可以很大,因而每个进程的页表有可能非常长。由于页表通常在主存中,因而即使逻辑页已经在主存中,也要至少访问两次物理存储器才能实现一次访存,这将使虚拟存储器的存取时间加倍。为了避免对主存访问次数的增多,可以对页表本身实行二级缓存,把页表中的最活跃部分存放在高速存储器中。这个专用于页表缓存的高速存储部件通常称为转换后援缓冲器(TLB),又称快表。而保存在主存中的完整页表则称为慢表。快表的作用是加快地址转换。TLB的作用和与主存与CPU之间的cache作用相似,通常由相联存储器实现,容量比慢表小得多,存储慢表中部分信息的副本,可以完成硬件高速检索操作。地址转换时,根据逻辑页号同时查快表和慢表,当在快表中有此逻辑号时,就能很快地找到对应的物理页号。根据程序的局部性原理,多数虚拟存储器访问都将通过TLB进行,从而有效降低访存的时间延迟。由于TLB的缓冲过程与cache的缓冲过程是独立的,所以在每次存储器访问过程中有可能要经历多次变换。
; 参考技术A 计算机组成原理是什么是一门假大空的课程。
根本不实用。
以上是关于数据结构讲的是啥的主要内容,如果未能解决你的问题,请参考以下文章