精华内容
下载资源
问答
  • CPU访问内存

    千次阅读 2016-05-02 16:02:53
    这个图我们可以认为是一个基本的读内存数据的总线周期: T1时钟周期期间,CPU往总线上发地址信息,以指出要寻址的存储单元; T2时钟周期间,撤销地址,总线低16位置为高阻状态,为传递数据做准备...

    1. CPU总线周期

    总线周期,包含若干个时钟周期,计算机是在时钟脉冲下一个节拍一个节拍的工作。看下面这张图,我们可以很好的理解为什么要时钟了:


    这个图我们可以认为是一个基本的读内存数据的总线周期:

    1. 在T1时钟周期期间,CPU往总线上发地址信息,以指出要寻址的存储单元;

    2. 在T2时钟周期间,撤销地址,总线低16位置为高阻状态,为传递数据做准备;

    3. 在T3时钟周期间,CPU将数据读至数据总线上;

    4. 在T4时钟周期间,结束这个总线周期;

    以上过程略去了某些步骤,不过用于理解这些原理是足够的。从以上过程看,我们就可以理解了我们CPU干活是按时间来的,如T1时钟周期CPU放地址到总线上,然后T2就去准备接收数据。在T1周期内并没有一个其他的标记告诉CPU T1时间放至的地址信息已经被处理请执行下一个动作。没有!!整个过程中,时间本身就是标记!时间到了就去做下一个动作吧!这就是时钟周期的重要性。

    所以我们电脑的主频频率还是很重要的,主频频率越高,那么时钟周期就越短,时钟周期越短,那么一个如上面的读内存数据的操作耗时就越少,给你的感觉就是,这个电脑的性能真不赖:)给妹子选电脑时是不是又多了一个绝技!哈哈。。。。这个部分暂且到此按下不提。

    2. 存储体

    我们都知道CPU读物理内存中数据,是先在地址线上给出地址,然后从数据线上将数据取走,如下图所示:


    地址从地址线上给出,然后数据从16位数据线(DB)上取走,注意:16根数据线一次取走的就是2个字节的数据!!!所以这个存储体称为16位存储体。在这种存储体中,最小的单位就是取两个字节。有时我们真的只需要取一个字节就好。那该怎么办?给CPU配置8位的存储体,配置8位的存储体后,那我想按字节读取数据又该如何呢?

    天才的科学家总能找到办法,我直接看奔腾32位CPU连接存储是如何设计的,请看下图:


    其中, D0~D31是连接到CPU对应的32根数据线上,我们这个图中,总共有4块内存接到CPU,每块内存为1GB,所以总共是4GB大小。每块存储都是8位的存储体,BEx为选通信号,也就是BE0,BE1,BE2,BE3分别对应的数据线地址为D7~D0,D15~D8,D23~D16,D31~D24。

    3. 访问存储

    通过上面的接法,CPU可以按照双字,字,字节访问存储。

    3.1 按双字访问

    按照双字访问存储时,以CPU的A31~A2地址去寻址双字存储空间,而A1,A0通过CPU内进行译码以控制BE0,BE1,BE2,BE3同时选择这四块存储进行数据的读取。而且,从双字地址(A31~A2)的角度看,地址是连续的。而每次读取到的都是双字,真是很巧妙的设计。

    3.2 按字访问

    按字访问时,以CPU的A31~A2地址去寻址字的存储空间,A1,A0经过CPU译码后,控制BE0,BE1,BE2,BE3,中只同时选中两块相邻的内存。

    3.3 按字节访问

    按字节访就是每次只控制BE0,BE1,BE2,BE3,使得只有一个存储被选中,那么就只读取了一个字节。

    对于非对齐的字或者双字需要两个周期才能够取得,看下表,可以自己举个例子对照上面的接线图看看:


    4、学了就要应用

    编程过程中#pragma pack(n),可以设置编译器对齐字节数,那么CPU后端是怎么实现的,通过本篇文章应该有更深入的了解了。

    另外,我们看一个真实世界里的内存:


    图里标示为4GB的内存条,看见木有,有4块物理内存块!!!就是我们上面说的单个1GB的8位存储体。

    有的企业级服务器可以插很多条内存,但是没有插满时对内存条的插入的插槽位置是有要求的,通过本文是不是可以可以理解大概是什么原因了呢???

    另外还有网上总是说的选择对齐的一个原因:不同各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。16位存储体就只能从偶数地址开始读取。

    展开全文
  • 数据在内存中存储

    千次阅读 2018-07-13 16:27:51
    数据在内存中存储首先认识一下计算机存储结构:寄存器:中央处理器CPU的一部分,空间比较小kb级别,用来暂存指令,数据和地址。CPU在处理数据时往往先把数据取存到寄存器,然后再做处理,这样可以加快直接从...

    数据在内存中的存储
    首先认识一下计算机存储结构:

    寄存器:中央处理器CPU的一部分,空间比较小在kb级别,用来暂存指令,数据和地址。CPU在处理数据时往往先把数据取存到寄存器中,然后再做处理,这样可以加快直接从内存中读取指令和数据。

    高速缓存区:内存与CPU之间的存储器,容量比较小在MB级别,但是速度比内存高的多(比寄存器要慢一倍左右),接近于CPU的速度,它是加速读取速度的一个桥梁, CPU在内存中读取数据时首先查询缓存区是否有对应的数据,如果有则直接读取,没有的话在村内存中读取,在缓存区中存储的数据都是内存中存储数据。
    *系统会自动管理缓存中的数据,如果某个数据访问频率降低到一定的值,那么就从缓存区中移除,从而将在内存中访问频率较高的数据放入缓存区中。

    内存: 是计算机运行过程中的存储主力,用于存储指令(编译好的代码段),运行中的各个静态,动态,临时变量,外部文件的指针等等。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大,用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据,CPU会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。
    *举例:如果内存大小是4G,一个程序装入内存需要大于4G空间的话,该程序是无法运行的,当然实际是还要去掉操作系统占用的内存,因此连4G都无法满足的。(当然现在有了虚拟内存,也就是将硬盘的一部分映射为内存空间,将不经常访问的指令放到虚拟内存中,这样其实是支持大于4G的程序的,这里只是在假设没有虚拟内存的情况下的举例说明)。

    硬盘:硬盘的空间大,一般用于存储永久性的文件。

    整型在内存中存储:
        原码:直接将二进制按照正负数的形式翻译成二进制就可以。
        反码:符号位不变,其他位次按位取反。
        补码:反码+1。
        *正数的原码、反码、补码都相同。
    整型在内存中的存放的是补码。
    为什么是补码?
        在计算机中,数值一律用补码来表示和存储,因为使用补码可以将符号位和数值统一处理。同时,加法和减法也可以统一处理,补码和原码可以相互转化,其运算过程是相同的,不需要额外的硬件电路。

    大小端的存储:
        大端存储:是指数据的低位保存在内存的高地址中,而数据高位保存在内存的低地址中。
        小端存储:是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
    计算机有大小端存储的原因:
        对于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题,因此就导致了大端、小端存储模式。

    设计一个程序来判断当前机器的字节序。

    int check_sys()
    {
           int i = 1;
           return *(char*)&i;
    }
    int main()
    {
           int ret = check_sys();
           if (ret == 1)
           {
                  printf("小端机器\n");
           }
           else{
                  printf("大端机器\n");
           }
           system("pause");
           return 0;
    }

    浮点数在内存中存储:
        首先浮点数家族包括:float、 double、 long double。
        根据国际标准IEEE(电气和电子工程协会)754,任意一个二进制浮点数V可以表示成下面形式:
                (-1)^S*M*2^E
        其中 (-1)^S表示符号位,当S=0时,V为正数;当S=1时,V为负数。M表示有效数字,大于1小于2。2^E表示指数位。

    举个例子:对于5.0,写成二进制是101.0,相当于1.01*2^2。
    对于-5.0,写成二进制是-101.0,相当于-1.01*2^2

    IEEE规定:
        


    c/c++中内存分配
        1.栈区:由编译器自动释放,存放运行函数而分配的局部变量、函数参数、返回数据、返回的地址。
        2.堆区:由程序员分配释放,如果程序员不释放,结束程序后时,可能由OS回收。分配方式类似链表。
        3.全局区(静态区):存放全局变量、静态数据、常量。程序结束后由系统自动释放。
        4.文字常量区:常量字符串就存放在这里,程序结束后由系统释放。
        5.程序代码区:存放函数体(类成员函数和全局函数)的二进制代码。

    内存分配方式的三种:
        1.从静态存储区分配
        2.在栈上创建
        3.从堆上分配


    展开全文
  • CPU访问内存时的地址对齐问题

    千次阅读 2018-09-18 15:29:36
    CPU 通过地址总线和数据总线访问内存内存类似一个大的矩阵阵列,通过地址总线找到相应的位置,然后将数据发送到数据总线上。CPU通过高速缓存Cache读取数据在CPU的寻址空间,字节(Byte,8 bits)是表示存储...
    • CPU 通过地址总线和数据总线访问内存。内存类似一个大的矩阵阵列,通过地址总线找到相应的位置,然后将数据发送到数据总线上。CPU通过高速缓存Cache读取数据。
    • 在CPU的寻址空间中,字节(Byte,8 bits)是表示存储容量的唯一单位。
    • 32位存储系统(内存)的每个存储单元都是4字节(32 bits)。一个总线周期内,CPU从内存读写4字节(32 bits)。CPU 要在能够被4整除的地址上访问内存。CPU发出地址(A,4的倍数),从内存中找到这个地址(A= A/4), 内存将这个地址上的数据发送到数据总线上。
    • 设置编译器对齐字节数
       #pragma pack(n) /* n = 1, 2, 4, 8, 16 */
      
    展开全文
  • 附上本人绘制的cache、寄存器、cpu内存之间的关系脑图,如果你有所收获希望大家看完能给我的脑图点个赞谢谢!!! https://www.processon.com/view/link/6038cc331e085364c6761ffb 问题起因: 陈铁力公司的一...

    问题起因:

    公司的一个处理图像的程序得到的结果中,图像是漏点的。(大量像素点位的RGB值错误)

     

    分析原因:

    1、元素点的值(RGB)计算错误?

    1. 计算元素值的算法出错
    2. 计算结果没有更新

    2、通过测试发现不是1)的问题,所以就应该是2),查找数据更新节点,发现确实计算结果正确,程序执行结束,应该更新完成了(按照道理来说,赋值之后就应该更新,但是最后的输出结果却没更新),经过调研发现数据存储位置的不同,更新机制就不同。(数据存储一般存储在内存或者cache中,问题的原因就是因为数据存储到cache中了,程序运行结束前没有进行sync)

     

    分析后的问题延伸:

    1、cache物理结构及物理地址:SRAM为主体的存储器,也是一种内存,只是被集成到CPU上了。

     

     

    2、存储速度是内存的60倍,接近寄存器的速度(稍慢不到1ns)。

     

     

    3、cache数据的更新机制

     

    1. cpu快速读取大量数据的时候,新数据覆盖旧数据。

     

    1. Cache 替换算法和写策略:简单来说就是每一个数据块都有一个计数器,当某一个数据块被使用的时候,这个数据块的计数器被清零,其他数据块的计数器加1,当需要替换的时候淘汰计数器值最大的数据块。

     

     

    4、因为Cache 中的内容是主存块副本,当对 Cache 中的内容进行更新时,就存在 Cache 和主存如何保持一致的问题。(答案:https://www.jianshu.com/p/39b75482c0ed

     

    1. 当多个设备都允许访问主存时,例如:I/O 设备可直接读写内存时,如果Cache 中的内容被修改,则 I/O 设备读出的对应主存单元的内容无效;若 I/O 设备修改了主存单元的内容,则Cache 中对应的内容无效。

     

    1. 当多个 CPU 都带有各自的 Cache 而共享主存时某个 CPU 修改了自身 Cache 中的内容,则对应的主存单元和其他 CPU 中对应的内容都变为无效。

     

    1. 写操作也有两种情况:
      1. 写命中(Write Hit):要写的单元已经在 Cache 中
      2. 写不命中(Write Miss):要写的单元不在 Cache 中

     

    1. 最后解释一下之间说的:“no-cache其实指的就是具有写直达的cache,这个概念我在网上没搜索到,但是按照理解就是这个样子的,在http协议中的no-cache值的是接收这个缓存数据要进行验证)

     

    解决方案:

    1、直接在程序结尾,添加指令。cache一致性的维护由硬件CPU自动完成,同时处理器也会提供一些指令,以支持软件对cache的操作。以x86为例,有四条指令可以对cache进行invalidate/flush.

    1、全部invaliate/flush

    WBINVD, 即write back invalidate的缩写,具体操作是先将cache中标记为modified的内容全部write back到外部内存,再清空整个cache。INVD, 相比WBINVD少了个write back的操作,所以没法保证数据一致性,这条指令只在cache和外部内存不需要保持一致的情况下使用(如某些测试环境)。

    2、部分invalidate/flush

    CLFLUSH/CLFLUSHOPT,即cache line flush的缩写,可针对某些cache lines单独操作,适用于该cache line对应的内存区域之后不会再被访问(access)到的情况。

     

    2、将数据存储到内存中。

     

    附上本人绘制的cache、寄存器、cpu、内存之间的关系脑图,如果你有所收获希望大家看完能给我的脑图点个赞谢谢!!!

    https://www.processon.com/view/link/6038cc331e085364c6761ffb

     

    展开全文
  • 直接内存访问DMA

    千次阅读 2017-04-23 21:12:26
    DMA(Direct Memory Access)是一种硬件体系特性,它允许某些硬件子系统不通过CPU直接访问随机访问内存(RMA)。为什么要提供DMA机制呢?由于内存访问的操作通常频繁发生,如果没有DMA机制,所有的硬件都要等到CPU...
  • CPU是如何访问内存的?

    千次阅读 2019-07-09 18:24:10
    内存管理可以说是一个比较难学的模块,之所以比较难学。一是内存管理涉及到硬件的实现原理和软件的复杂算法,二是网上关于内存管理的解释有太多错误的解释。...CPU通过MMU访问内存 我们先来看一张图: ...
  • 页式存储管理方式,如果没有引入快表,则每取一次数据,要访问()次内存 ; 段页式存储管理方式,如果没有引入快表,则每取一次数据,要访问()次内存
  • 换句话说:CPU访问非对齐的内存时为何需要多次读取再拼接? 首先简单说一下何为内存对齐。 例如,当cpu需要取4个连续的字节时,若内存起始位置的地址可以被4整除,那么我们称其对齐访问。 反之,则为未对齐访问。...
  • CPU 读、修改内存数据过程

    千次阅读 2015-07-21 17:05:48
    之前一直不明白为什么一个线程修改了数据(不用volatile修饰),而另一个线程读取时还是之前的值...2.内存:它的容量比较大,但是CPU访问内存的效率相对缓存较低 有了缓存和内存,内存储器(缓存+内存)就变成既有缓存
  • 众所周知,CPU是计算机的大脑,它负责执行程序的指令,而内存负责存数据, 包括程序自身的数据很多年前,CPU的频率与内存总线的频率同一层面上。内存访问速度仅比寄存器慢一些。但是,这一局面上世纪90年代...
  • RDMA(远程直接内存访问)技术浅析

    千次阅读 2017-10-26 10:52:29
    远程直接内存访问(即Remote Direct Memory Access)是一种直接内存访问技术,它将数据直接从一台计算机的内存传输到另一台计算机,无需双方操作系统的介入。
  • CPU角度看内存访问对齐

    千次阅读 2013-05-30 21:13:40
    关于自然对齐 ...2. 什么是对齐:有些人说,address of data % sizeof(data type)==0 就是对齐,其实这不准确,全面的理解它必须从CPU为什么需要对齐,不对齐就会造成数据访问花费额外的时钟周期,和额外的指
  • java的各种数据类型在内存中存储的方式

    万次阅读 多人点赞 2012-12-03 13:47:02
    分配:内存的分配是由程序完成的,程序员需要通过关键字new为每个对象申请内存空间(基本类型除外),所有的对象都堆(Heap)分配空间。 释放:对象的释放是由垃圾回收机制决定和执行的,这样做确实简化了程序员的...
  • 直接内存访问(DMA)初探

    千次阅读 2013-12-12 14:55:18
    DMA(Direct Memory Access),直译为直接内存访问,是一种无需CPU的参与就可以让外设与系统内存之间进行双向数据传输的硬件机制。 使用DMA可以使系统CPU从实际的I/O数据传输过程摆脱出来,从而大大提高系统的吞吐...
  • CPU缓存是CPU内存之间的临时数据交换器,为了解决CPU运行处理速度与内存读写速度不匹配的矛盾——缓存的速度比内存的速度快多了。 上图左侧为简易的高速缓存结构,数据的读取和存储都经过高速缓存Cache,CPU核心与...
  • 本章知识点Linux系统提供复杂的内存管理功能,内存的概念Linux系统相对复杂,有常规内存、高端内存、虚拟地址、逻辑地址、总线地址、物理地址、I/O内存、设备内存、预留内存等概念。1、内存和I/O的硬件机制,...
  • CPU内存(Memory)或缓存(Cache)取出指令,放入指令寄存器,并对指令译码分解成一系列的微操作,然后发出各种控制命令,执行微操作系列,从而完成系统指令的执行。 CPU里包含计算单元(...
  • 首先计算机内是按8位1字节的方式编织,(书上也说了,一个存储单元必须是8的倍数)然后一个存储单元里面可能有存放多个字节,(很多存储单元一起变成一个存储矩阵)。行对应的就是它的行号(字地址),列就是...
  • CPU过载内存溢出分析

    千次阅读 2018-04-05 17:34:20
    CPU过载、内存溢出问题一般出现在线上项目,因为开发环境用户量和数据量都很小,即使你的代码有问题也不会爆发出来。线上出现这样的问题是比较严重的,需要认真对待,妥善解决。问题原因造成这样问题有两个大类型...
  • CPU,缓存,内存,外存全解析

    千次阅读 2020-07-05 20:25:27
    一:缓存 定义:凡是位于速度相差较大的两种硬件之间,...存放的数据内存中CPU访问最频繁的数据和指令被复制入CPU的缓存 作用: 用于协调两者数据传输速度差异的结构 实际例子: 缓存是CPU(Central Processing
  • DOS 实方式下直接访问4GB 内存

    千次阅读 2014-02-08 10:51:27
    摘 要: 分析了80486CPU 的寻址机制, 提出了实方式下直接访问4GB 内存的策略和C 程序设计方法。 关键词: DO S 程序 扩展内存 程序设计 高档PC 微机系统, 如80486CPU 微机系统,应用软件的开发可以基于DO S...
  • 这样,虽然指令和数据都是以0、1代码形式存在存储器,但CPU可以判断出取指阶段访存取出的0、1代码是指令;执行阶段访存取出的0、1代码是数据。 计算机区分指令和数据有以下2种方法:  通过不同的时间段来...
  • 作为一个计算机领域的工程师,这里有一个问题:有一个10米深的水池需要测量其水深,并计算机(或者微机)上显示测量结果,保留小数点后一位。请概要的设计这个系统。 分析如下: 10米深的水池,需要保留一位小数...
  • documentlinux内存机制CPU内存虚拟内存硬盘物理内存内存和虚拟内存跟 Windows 完全不同的 Linux 内存机制Swap配置对性能的影响 linux内存机制 Linux支持虚拟内存(Virtual Mmemory),虚拟内存是指使用磁盘当作RAM的...
  • 内存cpu工作原理

    千次阅读 2017-05-03 22:25:47
    内存:通电状态下进行数据存储   cpu内部大致结构 程序控制器(CPU的控制中心) 职责: 1 分析或解释 指令 2 根据或析与解释结果向其他组件发出命令 3 控制cpu的工作进度和工作方式   当一条指令进入...
  • 数据在计算机存储方式

    千次阅读 2014-09-30 17:17:34
     ...这些数据在计算机的存储设备是如何进行组织存储的?  数据单位  位(bit)  位(bit),音译为"比特",是计算机存储设备的最小单位,由数字0或1组成。  字节(Byte)  字节(Byte),
  • DMA(direct memory access)直接内存访问

    千次阅读 2017-07-26 19:21:54
    这里的关键词 Direct (直接),与传统的相对低效的,需要通过 CPU访问内存(此为 indirect,间接)的方式相对。 1. 基本概念 辅存狭义上是平时讲的硬盘,准确地说,是外部存储器(需要通过 I/O 系统与之交换...
  • CPU缓存与Java内存模型

    千次阅读 2018-09-19 20:45:47
    CPU多级缓存 局部性原理: 1)时间局部性:如果某个数据访问,那么不久的将来它很可能再次被访问;...这行数据有效,数据被修改了,和内存中数据不一致,数据只存在于本Cache。 E(Exclus...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 328,681
精华内容 131,472
关键字:

cpu直接访问存储在内存中的数据