-
2021-04-07 12:01:47
地址总线和数据总线
- CPU通过地址总线寻址,然后通过数据总线与外部设备互换信息(即通过地址总线确定要访问的内存地址,再由数据总线传输数据)。 从开发者角度来说,数据总线长度应该和地址总线宽度一致,也就是一个指针和一个整数宽度相等,但是从硬件角度来讲,有些不切实际,比如说8位的CPU,如果地址总线和数据总线宽度一致,那么只能寻址256个地址单元(多少位cpu对应的是数据总线),这对于实际应用来说,太少了,从商业角度来讲太浪费了,所以一般8位cpu的地址总线都是16位的(专门增加了一些16位的地址指令),这也导致了一个结果,造成了一些8位cpu在结果上的一些不均匀性,所以一些8位的系统指令实际上是16位的操作,鉴于历史原因,cpu的位数总是低于实际所需的地址总线的宽度,所以Intel芯片采取的都是这种地址总线和数据总线不一致的架构,最初的16位CPU对应都是20位的地址总线,对应1M内存,所以呢Intel 设计人员要考虑着怎么匹配16位的数据总线和20位的地址总线,不能再像8位cpu那样设计,没有灵魂,其实也可以采用映射的方式,但是Intel采取的方式叫做分段。
- 地址总线的位数决定CPU的寻址范围;数据总线的位数决定CPU单次通信能交换的信息数量
- 总线的熟读决定CPU和外设互换信息的速度
注意:
- CPU的地址总线位数和数据总线位数可以不相同(典型就是51单片机)。但是一般都相同
- CPU的位数指的是数据总线的位数。32位CPU寻址的范围是4G(即2^32),所以最多支持4G内存
- 数据总线是32位的,内存使用32位的比较合适,所以编程最好用int类型
内存: 内部存储器 是用来运行程序和数据的 一般称为 RAM(Random Access Memory 随机访问存储器 可以随意访问任意一个地址任意一个字节的数据) (类似于电脑的运行内存 掉电不保存数据)
举例(DRAM SRAM DDR SDRAM)
外存: 外部存储器 是用来存储东西的 一般称为ROM(Read Only Memory 这里不是指数据只读 而是指CPU不能通过地址总线和数据总线来访问这个存储器 ) (类似于电脑的固态硬盘和机械硬盘 掉电也会保存数据)
举例(硬盘 Flash (Nand iNand U盘 SSD(固态硬盘)等))
CPU连接内存和外存的连接方式不同:
- 内存 需要直接地址访问,所以是通过地址总线和数据总线的总线式访问方式连接的(好处是 可以直接访问,随机访问任意一个地址任意一个字节的数据;坏处是占用CPU的地址空间,大小受限)。
- 外存 是通过CPU的外存接口来连接的(好处是 不占用CPU的地址空间,坏处是 访问速度没有内存快,访问时序复杂)
内存:
SRAM (Static Random Access Memory,静态存储器) 特点就是容量小,价格高,优点就是不需要软件初始化 直接上电就可以用
DRAM (Dynamic Random Access Memory,动态存储器)特点就是容量大,价格低,缺点就是上电后不能直接使用,需要软件初始化后才可以使用。
SRAM不应该与SDRAM相混淆,SDRAM代表的是同步DRAM(Synchronous DRAM),这与SRAM是完全不同的。SRAM也不应该与PSRAM相混淆,PSRAM是一种伪装成SRAM的DRAM。(SDRAM就相当于是一种特殊的DRAM)
SDRAM具体可以看这篇博客http://blog.sina.com.cn/s/blog_dae1e1400102vmxa.html
SRAM和DRAM的特点和区别可以参考这篇博客https://blog.csdn.net/qq_21435127/article/details/79617714
- 单片机中:内存需求小,而且希望开发尽量简单,适合全部使用SRAM
- 嵌入式系统:内存需求大,而且没有 NorFkash等可启动介质
- PC机:内存需求大,而且软件复杂,不在乎DRAM的初始化开销,适合全部使用DRAM
外存:
NorFlash :特点是容量小,价格高,优点是可以和CPU直接总线式相连,CPU上电后可以直接读取,所以一般用作启动介质(如BIOS)(一般将NorFlash集成到主板或SOC上)。
NandFlash :跟硬盘一样 特点是容量大,价格低,缺点是不能总线式访问,也就是说不能上电CPU直接读取,需要CPU先运行一些初始化软件,然后通过时序接口读写。
所以
- 一般的单片机: 很小容量的NorFlash+很小容量的SRAM
- 嵌入式系统:因为现在NorFlash很贵,所以现在很多嵌入式系统倾向于不用NorFlash;而是直接用:外接大容量NandFlash(也可能是SD卡) +外接大容量 DRAM+SOC内置的SRAM
- 一般PC机都是:很小容量的BIOS(NorFlash)+很大容量的硬盘(类似于NandFlash)+大容量DRAM(一般为DDR)
更多相关内容 -
cpu可直接处理外存上的信息吗?_常见问题解析
2021-07-30 01:57:04win7电脑出现蓝屏0x00000074怎么办_常见问题解析win7电脑出现蓝屏0x00000074是因为找不到...cpu是不可以直接处理外存上的信息。指令代码序列称为程序吗_常见问题解析为解决某一特定问题而设计的指令序列称为程序,...win7电脑出现蓝屏0x00000074怎么办_常见问题解析
win7电脑出现蓝屏0x00000074是因为找不到指定的模块,其解决办法是:首先在开机时按“F8”键,进入选择菜单;然后进入安全模式;最后卸载有问题的驱动,并删除替换有问题的系统文件即可。
cpu可直接处理外存上的信息吗?
cpu是不可以直接处理外存上的信息。指令代码序列称为程序吗_常见问题解析
为解决某一特定问题而设计的指令序列称为程序,计算机程序是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具;它以某些程序设计语言编写,运行于某种目标结构体系上。
外存就是我们常见的硬盘、U盘等,现在计算机上所有外存上的数据,都要先被读取到内存—就是内存条中,才能被cpu处理。
相关介绍:
CPU,(Central Processing Unit)也叫做中央处理器,是一台计算机的运算核心(Core)和控制核心( Control Unit)。是计算机内的电子电路,通过执行由指令指定的基本算术、逻辑、控制和输入/输出(I/O)操作来执行计算机程序的指令。计算机工业至少从20世纪60年代初就使用了术语“中央处理单元”。主存储器和I/O电路。
-
关于计算机外存和内存中的存储结构解析
2018-09-26 11:59:32我们的计算机中能够存储数据的东西有内存,外存等等 内存的读写速度优于外存很多很多,但是由于其成本高的特点,一般只适用于做短时存储读取,也就是说,当我们的电脑关闭的时候,内存中的数据就全部消失了。与之...我们的计算机中能够存储数据的东西有内存,外存等等
内存的读写速度优于外存很多很多,但是由于其成本高的特点,一般只适用于做短时存储读取,也就是说,当我们的电脑关闭的时候,内存中的数据就全部消失了。与之相比,外存也就是磁盘,是致力于实现数据持久化技术的
了解过一些硬件的人应该知道,我们的磁盘是由很多个个圆形磁道组成的,每个磁道上又分成很多个小块,用来存储数据,如下图所示:
因为小块的数量很多很多,再加上为了便于理解,我们可以将这些数据存储单元抽象为下图这样的平面矩形分块:
到现在为止,我们将基本的数据存储模型建立完毕了,下面我们来比较一下内存和外存中存储结构的差异
外存
假设我们有一段数据,大小需要占满3个格子,那么我们在外存中应该如何选择格子来存储呢?
假如我们直接选择相邻的3个格子来存储数据,如下图棕色区域所示:
这样,我们当读取这段数据的时候,直接通过第一个棕色格子的地址,就可以找到这段数据把它读出来,这不是挺好的吗?
但是,当我们存储了很多数据之后,我们就发现了问题所在了
假设我们又存储了一段大小为4个格子的数据,存储了一段大小为两个格子的数据,存储了大小为7个格子的数据,存储了大小为1个格子的数据,存储了大小为8个格子的数据
用一种颜色代表一段数据,可以看到,我们的磁盘存储容量已经被占满了:
这时,我们想要删除绿色的和蓝色的数据,如图:
删除之后,按理说我们的磁盘已经空出了三个格子的空间,可以存储大小为三个格子的数据了,但是由于我们是顺序存储,所以上面的两个格子和下面的一个格子连不到一起,意味着我们只能再存进去两个格子的数据和一个格子的数据,并不能存进去三个格子的。
也就是说,如果按照顺序存储,用到最后,我们的磁盘只能存入比较小的数据了,明明容量充足,却没法存进去大的数据,岂不是很难受?
有人可能要说了,我们可以通过删除之后把后面的数据移到前面来填补上前面的格子来达到,就像玩电脑游戏里的整理背包一样。但是如果这样的话,我们每次删除一个数据都要把这个数据后面的数据向前移动(更改数据的存储地址),这样对性能的影响非常严重,所以,显然,我们的磁盘不是用这种方式来存储数据的,而是用下面这种:
这就是磁盘的存储方式——链式存储,这种方式能最大限度的利用磁盘的空间。
内存
上述的链式存储方式虽然最大限度地利用了磁盘的存储空间但是毕竟在增删改查的数据操作上的速度不如顺序存储,对于内存来说,因为它的读写速度非常非常快,因此我们上述的每次删除之后的重新整理的速度也非常快,因此我们的内存使用的是顺序存储方式,这样不会速度很慢,而且也方便了增删改查的操作。
-
java中arraylist最多可以存储多少条数据?arraylist存满之后会发生什么?
2020-12-18 11:06:40问题一(最多可以存储多少条数据)问题二 ,存储到最大之后再进行add会出现什么情况为什么(why?)ArrayList中add运行的代码块回过头来分析为什么数组越界业务中真的碰到了怎么解决链表形式存储(LinkedList)map分级...本文源码与分析基于jdk1.8
)问题一(最多可以存储多少条数据)
答案先放在上面 Integer.MAX_VALUE 2147483647
简单解释arraylist底层是一个数组对象Object[] arr = new Object[10]; 数组的大小只能设置int类型。想进一步了解可以看后面的源码部分//这样会直接编译报错 Long len = 10L; Object[] arr = new Object[len];
问题二 ,存储到最大之后再进行add会出现什么情况
准确的说会抛出来内存不足异常。throw new OutOfMemoryError();
感谢 如果時間不記得 大佬指正,给大佬敬茶。Integer minCapacity = Integer.MAX_VALUE; minCapacity++; System.out.println(minCapacity); minCapacity = -2147483648; // arraylist 代码块 private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; } if (minCapacity < 0) // overflow throw new OutOfMemoryError();
为什么(why?)
首先list在被创建出来时会存放在jvm堆内存中,假设一个对象为1kb的大小,存放10个对象的数组大小就是10kb。而数组最大限制是2147483647,这就要求硬件内存超过2147483647kb(实际使用中可能需要2147483647kb*2 因为list在add的时候是需要扩容的,除非你在创建的时候指定大小为最大值,否则你在add的时候超过内存阀值会直接抛出内存溢出)。
代码块摘自jdk1.8 java.util.ArrayList。 里面都标注好了注释,希望可以帮助你愉快的阅读完。
ArrayList中add运行的代码块
//当前集合对象 transient Object[] elementData; //当前集合大小 private int size; //arraylist add对象的方法 本文问题的源头 public boolean add(E e) { ensureCapacityInternal(size + 1); elementData[size++] = e; return true; } //这个方法是判断的当前数组容量是否需要扩容,需要的话扩容 //如果需要扩容 扩容之前我们需要设定新数组的大小 //那么就是先确定新数组大小,然后初始化一个新容器将旧的数据copy到新容器里面 //elementData 表示的是当前数组对象 //minCapacity 这个是上个add方法调用的 集合当前大小+1 private void ensureCapacityInternal(int minCapacity) { ensureExplicitCapacity(calculateCapacity(elementData, minCapacity)); } private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; private static final int DEFAULT_CAPACITY = 10; //DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个空数组 //DEFAULT_CAPACITY为10 //如果是空对象,也就是刚初始化里面还没有存入值返回默认大小 private static int calculateCapacity(Object[] elementData, int minCapacity) { if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { return Math.max(DEFAULT_CAPACITY, minCapacity); } return minCapacity; } //minCapacity 上一个方法返回的数值 //modCount++ 与本文问题无关,这个值是关于迭代器迭代的时候用来保证线程安全方面的东西 //如果 集合当前size+1 - 当前集合数量 大于0 则grow 成长(扩容) //看到这里已经改就明白了吧 问题的解码就都在grow函数里 private void ensureExplicitCapacity(int minCapacity) { modCount++; // overflow-conscious code if (minCapacity - elementData.length > 0) grow(minCapacity); } private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; //minCapacity 集合当前size+1 //oldCapacity 当前数组大小 //newCapacity 当前数组大小 + 当前数组大小的一半,也就是默认扩容机制是0.5倍扩容 //重点来了 newCapacity - MAX_ARRAY_SIZE //MAX_ARRAY_SIZE 为int最大值-8 //如果新数组大小- (int最大值-8)>0 则看hugeCapacity // Arrays.copyOf(elementData, newCapacity); 创建一个大小为newCapacity的集合,将就数据copy进去。 private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; int newCapacity = oldCapacity + (oldCapacity >> 1); if (newCapacity - minCapacity < 0) newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) newCapacity = hugeCapacity(minCapacity); // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } //minCapacity 集合当前size+1 //如果 集合当前size+1 > 数组最大值 则返回int最大值 //大体意思 数组在扩容到 (int最大值-8)之后,还没存满默认还是使用(int最大值-8) //存满之后使用Integer.MAX_VALUE 所以最多可以存Integer.MAX_VALUE private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }
回过头来分析
源码分析完了以后我们在回过头来看add方法存满之后发生什么呢?
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
当size达到int最大值以后,size++ 这个运算并不会报错(具体可以看java中的int类型计算),那存满之后再存值为什么会数组越界呢
为什么数组越界
public static void main(String[] args) { Integer aa = Integer.MAX_VALUE; aa++; System.out.println(aa); Object[] arr = new Object[aa]; arr[aa] = 11; } //代码执行结果 -2147483648 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -2147483648
业务中真的碰到了怎么解决
知道问题的发生原理与实际运行情况之后我们在回过头来分析,如果真的有业务场景需要存储大量的数据但是不知道数组大小的情况下,我们该怎么办呢。
链表形式存储(LinkedList)
为避免大量的扩容导致内存溢出,可以选择使用LinkedList,它里面是链表的结构,并不会有大小限制,不过使用它的话取值只能通过循环比较去取值,在保证内存够用的情况下,理论上可以想存多少存多少。但是取值效率会因为值太多效率极低。可以简单看下(LinkedList)里面的实现
private static class Node<E> { E item; // 当前对象 Node<E> next;//当前对象的下一个引用地址 Node<E> prev;//当前对象的上一个引用地址 Node(Node<E> prev, E element, Node<E> next) { this.item = element; this.next = next; this.prev = prev; } }
map分级存储
如果即想存多一些的数据又想查询快一些可以通过所存的对象中的业务逻辑划分为map对象存储,比如学生表中有type,优/良/差 ,type为key,list为value,但是key分级少了,数据还是会很多,可以考虑多层分级,比如type基础上按年纪,班级再分层,到最后不就越来越少,插值或者查询都可以提高效率。
数据库(mysql,oracle等)
真的有这样大的数据肯定还是存到数据库中是最好的方式。如果这么大的数据集合直接放在内存中,那要数据库干什么。
-
简述计算机的内存和外存有何区别与特点?内存是由哪几部分组成?有何特点?
2021-07-25 06:21:26简述计算机的内存和外存有何区别与特点?内存是由哪几部分组成?...最佳答案2019-10-05 14:04(1)内存条又称“主存储器”,它的作用是暂时存储计算机运行时的数据,中央处理器能够直接访问内存,而外存的数据是中... -
内存与外存的主要特点
2021-07-27 04:14:33内存与外存的主要特点是:内存储器:计算机存储常用或当前正在使用的数据和程序,所有执行的程序和数据须先调入内存可执行,容星小,存取速度快,价格贵。外存储器:存放暂进不使用的程序和数据,容量大,存取速度慢... -
把数据存到vuex中
2020-05-27 10:47:251、第一步:现在store中的index.js文件中的state中定义这个数据 2、在store中的index.js文件中的定义和这个数据相关的方法 3、然后在需要使用的页面中进行引用和使用 先用this.$store.commit调用 循环数据 ... -
计算机组成原理之CPU、外存、内存之间的关系
2018-12-26 15:51:43现在我们使用的计算机基本都是在电脑之父冯·诺依曼的理论下所制造的,即组成计算机的五大部件为:...输出设备: 将电脑中的信息输出给用户的设备。例如显示器、打印机、投影仪等。 传统的计算机就由以上五大部件所... -
【Python】把excel文件中的数据转化为字典格式存起来
2020-06-17 11:47:05现在需要把表格转化为字典存起来,方便读取。 【步骤】 (1)把“值班表.xlsx”另存为无格式的“值班表.csv”。默认是以逗号作为分隔符。 (2)把第一列的日期作为关键字,构建空字典。例如,dic = {'20200617'... -
CPU,缓存,内存,外存全解析
2020-07-05 20:25:27一:缓存 定义:凡是位于速度相差较大的两种硬件之间,...存放的数据:内存中被CPU访问最频繁的数据和指令被复制入CPU中的缓存 作用: 用于协调两者数据传输速度差异的结构 实际例子: 缓存是CPU(Central Processing -
计算机的内存、外存、主存、辅存
2017-10-01 16:27:50存储器是计算机的重要组成部分,用于存储程序与数据,可分为:计算机内部的存储器(内存储器,简称内存)、计算机外部的存储器(外存储器,简称外存)一般来说,主存指的是内存;但是在一些专业性较强的场合,主存与... -
mysql一张表到底能存多少数据?
2021-02-19 11:10:50程序员平时和mysql打交道一定不少,可以说每天都有接触到,但是mysql一张表到底能存多少数据呢?计算根据是什么呢?接下来咱们逐一探讨 知识准备 数据页 在操作系统中,我们知道为了跟磁盘交互,内存也是分页的,... -
Java简单的使用redis存、取数据
2021-02-26 09:46:30简单的使用redis存、取数据首先,redis配置类如下:package org.jeecg.config;import java.lang.reflect.Method;import java.time.Duration;import java.util.Arrays;import javax.annotation.Resource;import org.... -
外储存器断电后信息会丢失吗
2021-07-31 09:59:43大家好,我是时间财富网智能...3、断电时,外存储器正在运行系统或程序时,可能丢失(如直接电源关机,损坏系统文件等)。4、外存储器也包括ROM,如只读光盘就不会丢失。外储存器(又称:辅助存储器)是指除计算机内存及... -
外存储器中的信息,必须首先调入 ______ ,然后才能供CPU使用。
2021-07-17 05:25:27因为外部存储器的速度比较慢,如果CPU直接调用外存的信息,那么就会增加CPU等待数据的时间,在这个过程中,CPU处于空闲状态,浪费了CPU的处理能力。RAM即内存,它起到一个缓存的作用,是外存储器和CPU之间的桥梁,... -
数据中台,我还能爱你吗(文末送书)
2022-05-30 21:03:45数据中台 -
mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据
2019-06-13 10:18:02当达到最大内存限制时, 如果需要使用更多内存,则直接返回错误信息。(redis默认淘汰策略) allkeys-lru: 在所有key中优先删除最近最少使用(less recently used ,LRU) 的 key。 allkeys-random: 在所有key中随机删除... -
电子合同数据全流程实时上链存证,君子签打造数据证据链闭环
2022-01-12 18:18:35君子签创新“区块链+司法+电子签约”模式,从2015年以来一直致力于为用户提供“实名认证、合同编辑、合同发起、在线签署、合同管理、区块链存证、司法出证”等全生态闭环服务,有效地保障合同签署主体可信、签署行为... -
数据中台(七) 数据中台架构
2020-09-23 12:59:15数据汇聚是把数据资源通过实时、批量的方式存储到数据中台。基本是按照数据的原始状态堆砌在一起的,是企业对过往所有IT信息化建设积累的成果的融合。 数据开发 数据开发是数据资产内容建设的主战场,是数据价值... -
数据库, 数据仓库, 数据集市,数据湖,数据中台
2019-02-22 16:21:47数据仓库和数据集市的区别 作者:修鹏李 出处:CSDN 大数据:数据仓库和数据库的区别 作者:南宫蓉 出处:简书 第一篇:数据仓库概述 第二篇:数据库关系建模 作者:穆晨 出处:CNBLOS 摘要 本文简要介绍... -
内存储器_能直接与CPU交换信息的存储器是
2021-07-26 05:59:24而外存储器不能与CPU直接进行信息交换,CPU只能直接读取内存中的数据。举一反三的答案和解析:[单选题]下列关于世界上第1台计算机的叙述,错误的是( )此台计算机当时采用了晶体管作为主要元件解析:显然,我们了解第... -
利用Python爬虫网站数据直接导入mysql数据库中
2019-07-05 18:41:18说明:可能经常出现要爬取某个网站的数据,这时候需要利用爬虫技术来完成,这块主要使用Python来实现。 如何搭建Python环境我上节文章有详细描述:https://blog.csdn.net/Joe192/article/details/94722117 (1)... -
关于内存、外存、磁盘、硬盘、软盘、光盘的区别
2020-08-10 13:35:04计算机存储器分为两大类:内存存储器和外部存储器(简称内存或内存条和外存)。...它好比是数据的外部仓库一样,相当于有了记忆功能,外存主要是磁盘。 光盘: 是用激光打上去的数据,区别于磁盘。 磁盘: -
内存、主存、外存、主存储器、外存储器等之间的区别
2020-04-23 17:32:01存储器单元实际上是时序逻辑电路的一种,是用来存储程序和各种数据信息的记忆部件。 按存储器的使用类型可分为只读存储器(ROM)和随机存取存储器(RAM) 按其用途可分为主存储器(简称主存或内存)和辅助存储器(简称辅存... -
matlab将数据保存为excel表格-怎样将MATLAB中的数据输出到excel中
2021-04-18 10:59:26怎样将MATLAB中的数据输出到excel中?xlswrite()函数可以将matlab中数据保存到excel中,请面例子:>>data=magic(5)%示例数据data=17241815235714164613202210121921... -
内存条是如何存储数据的?
2021-07-28 00:12:35存储器的种类很多,按其用途可分为主存储器和辅助存储器,主存储器又称内存储器(简称内存),辅助存储器又称外存储器(简称外存)。外存通常是磁性介质或光盘,像硬盘,软盘,磁带,CD等,能长期保存信息,并且不依赖于... -
在Python中如何将数据直接输出到文件中
2021-08-03 12:13:27在Python中如何将数据直接输出到文件中 # 将数据输出文件中,注意点1. 所指定的盘存在,2. 使用file= fp = open("G:/Codes/test1.text", "a+") # a+ 如果文件不存在就创建。存在就在文件内容的后面继续追加 print(... -
Python将数据写入excel表格中保存
2020-11-27 14:41:42直接pip install openpyxl就可以完成安装。 先看一个小demo: from openpyxl import Workbook mybook = Workbook() wa = mybook.active wa.append([1, 2, 3]) mybook.save('hh.xlsx') 得到: 如上,每个... -
文件与磁盘空间管理---外存分配方式、存储空间管理
2018-11-22 12:10:56一、外存分配方式 二、储空间管理