透过内存读写看计算机体系结构(二)

前面简单介绍了下,操作系统层面是如何处理内存访问的,其中跳过了很多细节,比如在x86下的段管理等东西.我也不打算很详细的写那些东西一个是因为历史包袱,绝大部分处理器都没有这么奇怪的内存管理模式了,另外一个是,那些东西,不是我们考虑的重点

下面简单介绍下,通常cpu是如何读写内存的.
为了简化问题,我们暂时只考虑单核的场景.

首先,我们看下cpu是如何和内存交互的. 在讨论这个问题前,我们需要先看下,cpu的结构是如何的

[cpu] [L1 cache] [L2 cache] [LLC cache] ------bus------> [main memory]
注意,cache都是很小的,我们可以可以简单看下

首先解释点前置知识:

  • 虚拟地址
    cpu为了支持多任务管理,特别引入了虚拟地址的概念.对于cpu来说,叫做多任务,对于操作系统而言,这就是所谓的多进程.虚拟地址体现在,不同进程看到的都是虚拟地址了,包括cpu的指令集,看到的也是虚拟地址,cpu在执行的过程中,通过MMU把虚拟地址翻译成物理地址.对于不同的进程而言,同一个虚拟地址可以映射到不同物理地址上去,这就给进程造成了一种假象,他拥有了整个内存的使用权同时,cpu也通过这种机制,隔离了不同进程之间的内存访问权限

  • instruction和data的区别
    instruction和data在内存层面,似乎是没有区别的,我们完全可以把一段数据当作指令(比如jit就是这么做的).但是,在cpu层面,数据和指令是严格分开存储的.从数据存储单元取出来的数据,就一定是被cpu当作数据看待,从指令存储单元里面取出来的数据,就一定是被cpu当作指令来看待

  • cache
    这里需要注意的是, L1和L2是区分icache和dcache的, LLC一般来说是数据和指令混合存储的所谓icache就是instruction cache, dcache就是data cache

  • TLB
    instruction和data在内存中的地址,都是用虚拟地址来描述的,数据最终是在物理地址的,因此cpu需要有把虚拟地址翻译成物理地址的能力操作系统实现的页表功能,就是用来做虚拟地址和物理地址转换的,但是,查询页表太慢了,因此,cpu设计的时候,在cpu上留了一小块独立的cache叫做TLB他里面存储的是虚拟地址和物理地址的映射关系,如果一个地址,在这里被找到了,他就不用去查页表了,加快了地址翻译的速度同样,对于TLB而言,他会区分ITLB和DTLB, 同样也分成L1 TLB和L2 TLB

  • 流水线
    cpu在执行指令的时候,是分成N个步骤做完的,最简单的,是一个四级流水线(当然实际的cpu会远比这个复杂)
    取指 -> 译码 -> 发射 -> 回写
    流水线是为了提高吞吐量设计的,通过这种方式,可以简单的提高加速比,当然实际的流水线,会比这个更加复杂(更长,然后每个步骤,有多个执行单元,超线程就是流水线冗余执行单元的副产品)

然后,cpu内存访问过程是,先去L1中,看数据是否命中,没有命中,去L2中查询,然后LLC,然后才是内存这里需要特别提的是,
L1的访问速度 > L2的访问速度 > LLC的访问速度
不是因为他们的存储介质不同,而是因为他们离cpu的远近不同,信号的传输是需要时间的.然后呢,这个过程中,查找的其实是物理地址,所以,cpu在此之前,他还得通过TLB把地址翻译成物理地址,如果L1 TLB没找到,那么L2 TLB, 然后L3 TLB,还没找到, 去操作系统提供的页表中查询(注意,页表在内存里,但是这个地址是固定的,操作系统的运行过程中,这个地址一直是确定的)

下面简单看下一条指令的被cpu执行的过程比如一条指令 mov eax, dword ptr [0x1234], 我们假设这条指令存储在虚拟地址0x10000的内存地址, 他对应的物理地址假设是0x20000, 0x1234的虚拟地址对应的物理地址是0x2234那么上一条指令还没执行完成的时候, ip指向了0x10000

  • cpu先去ITLB中查询0x10000这个地址对应的物理地址,0x20000
  • cpu从0x20000的物理内存中,取出这条指令,放到icache中
  • cpu开始解析,这条指令到底代表啥意思
  • cpu开始执行这条指令,发现,他要读虚拟内存0x1234, 于是cpu再去DTLB中查询,0x1234这个虚拟地址在0x2234
  • cpu把数据从0x2234中读取出来,写入eax这个寄存器
  • cpu把ip寄存器指向下一条指令的位置,顺带完成清理工作

看完了整体流程,接下来,我们看下一些比较细节的东西

  1. cache什么时候回失效
  2. cache失效的成本是多少

下一篇,我们具体探讨下cache,顺带扩展到多核cpu下cache的基本工作原理

3 responses to “透过内存读写看计算机体系结构(二)

  1. 英文标点建议换成中文的。
    另“instruction和data的区别”一段里“数据和指令是严格分开存储的从数据存储单元取出来的数据”这句话少了个标点。

    GJ,等着看更新

    1. Done,写的时候不是细心。标点回头统一改下,懒得处理了。周日写了4个小时,憋了300个字的cache有关的东西,太累了,想写对的话…等着吧

发表评论

电子邮件地址不会被公开。