精华内容
下载资源
问答
  • 层次结构存储系统一、存储器概述1、存储器分类2、主存储器组成和主存访问操作过程3、存储器主要性能指标4、各类存储元件特点5、存储器的层次结构二、主存和CPU连接和读写操作1、主存芯片技术2、主存与CPU...

    前言:
      大家都知道计算机程序的运行采用的是“存储程序”的方式,也就是程序执行时必须将指令和数据放入主存,然后计算机会自动执行。这个过程中会牵扯到很多存储器。
      既然有那么多不同的存储器,必然也有一定的体系结构。那么所谓的层次结构存储系统,就是各类存储器按照层次化方式,构成的计算机的存储器整体结构。

    一、存储器概述

    1、存储器分类

    (1)按存储元件分类
    (2)按存取方式分类
    (3)按功能方式分类
    (4)按信息可改性分类
    (5)按断电后信息可保存性分类

    2、主存储器组成和主存访问操作过程

    (1)记忆单元:即存储元、位元,存储0或1,构成存储阵列。
    (2)存储阵列:即存储体、存储矩阵,是存储器的核心部分。
    (3)编址单位:存储器内每一个位元都会被编号,相同地址的位元构成一个编址单位,即一个存储单元。
    (4)编址方式:指对存储单元进行编号的方式,如按字节编址(指存储阵列内一个地址中有一个字节的空间)、按字编址。

    (5)访问主存的方式与过程:
    在这里插入图片描述

    1. CPU将访问目的主存单元的地址送到主存地址寄存器MAR(Memory Address Register)。
    2. CPU通过地址线主存地址送到主存中的地址寄存器,然后地址译码器译码后可去选择相应单元 。
    3. CPU通过控制线读/写控制信号送到主存中的读写控制电路以进一步读or写。
    4. 在读写控制电路控制下,通过数据线主存数据寄存器MDR(Memory Data register)的数据传到主存内选中单元,或者将主存中选中单元的数据传到MDR中。

    这里强调一下,
    1、地址线的位数决定了主存地址空间的最大可寻址范围,如36位地址线的最大可寻址范围是0~236-1。
    (同时MAR宽度与地址线宽度一致)
    2、数据线的位数决定了每次最多存取数据的大小,如在字节编址方式下,64位数据线每次最多存取8个字节的内容。
    (同时MDR宽度与数据线宽度一致)

    3、存储器的主要性能指标

    (1)存储器容量

    (2)存储器速度:访问时间、存储周期、存储器带宽等等

    • 访问时间之读出时间T(A):存储器接到命令道信息送到数据线的时间。
    • 访问时间之写入时间T(W):存储器接到命令道信息被写入存储器的时间。
    • 存储周期:存储器进行一次读写操作所需要的全部时间。
    • 存储器带宽B:存储器被连续访问时可以提供的数据传送速率(信息位数或字节数/时间)

    (3)价格:这个就不用多说了,不看商业只看技术的话,那肯定是越贵越好。

    4、各类存储元件的特点

    这里主要介绍半导体存储器。

    (1)随机存取存储器RAM(Random Access Memory)

    • 静态RAM(SRAM)
      1.一个二进位需要6个晶体管;
      2.读写速度更快,信息能一直保存无需刷新;
      3.功耗大,集成度低,价格贵;
      4.一般用于高速小容量的存储器,如高速缓存cache。
    • 动态RAM(DRAM)
      1.一个二进位只需1个晶体管;
      2.读写速度较慢,需要定时刷新;
      3.功耗小,集成度高,价格便宜;
      4.一般用于慢速大容量存储器,如主存储器(内存条)。

    (2)只读存储器ROM(Read-Only Memory)

    • MROM、PROM、EPROM、EEPROM:都是随机存取方式工作。
    • 闪存 Flash ROM :高密度非易失性读写存储器;一般用于如U盘、存储卡、BIOS等。

    5、存储器的层次结构

      前言里讲过,存储器的层次结构就是各类存储器按照层次化方式,构成的计算机的存储器整体结构。
      那么为什么要有层次结构呢,这是因为不同的存储器有其不同的特性和优点,如果有一种存储器既便宜、又容量大、又速度快、还能满足各种特殊需求,那么我们或许就不需要层次结构了,直接把这种存储器往里面塞就行,但这显然是不大可能的。
      所以我们需要一种层次结构以协调组织各种存储器,使其能在一定成本范围内完成我们预期的存储与读写效果。

    在这里插入图片描述

    二、主存和CPU的连接和读写操作

    1、主存芯片技术

      第一节讲各类存储器的特点时提到过动态RAM(DRAM)主要用作主存,那么现在讲讲DRAM作为内存时的主存芯片技术。目前主要使用的是基于SDRAM的芯片技术的内存条,称为同步DRAM

    (1)DRAM芯片技术

    • 目前DRAM芯片主要是采用双译码结构位片式芯片。(其实DRAM芯片都是位片式)
    • 前面讲到要访问主存的话,CPU会通过地址线将主存地址送到主存中的地址寄存器,然后地址译码器译码后可去选择相应单元 。而双译码结构中地址译码器就会分为行地址译码器和列地址译码器,分别指示存储阵列中的行号和列号。
    • 如果是单纯的二维双译码结构芯片,那么存储阵列的行列交接处的单元只有一位,称之为位片式芯片。
    • 而有时候也会有三维双译码芯片,即有多个位平面,行列交叉点上不再是一位,而是多位构成的一个存储字,会被同时读写

    (2)基本SDRAM芯片技术:DDR SDRAM、DDR2 SDRAM、DDR3 SDRAM等等,其技术工作过程略显复杂,这里不多介绍。

    2、主存与CPU的连接与存储器拓展技术

    (1)主存与CPU连接关系如下:

    CPU内部总线接口–处理器总线–I/O桥接器–存储器总线–主存

    (2)存储器拓展技术:

    • 主存可以由多个内存条(内存模块)构成,内存条插槽就是存储器总线,而一个内存条是由多个存储器芯片拓展合成的。
    • 多个存储器芯片构成一个存储器时,需要进行字拓展位拓展字拓展是单个芯片容量的拓展,位数不变;而位拓展则是将多个存储器芯片构成给定字长的存储器。
    • 多个芯片构成的内存条采用交叉编址,芯片内地址是不连续的,即同一行列位置处会同时读写。比如8个8位芯片会在行列交叉点(i,j)处同时读取64位地址。而这读取的片内地址在8片中是相同的,都是指i,j),具体的选片工作会在主存地址的低位地址完成。
    • 对于具体存储阵列,设行数r,列数c,那我们设计时一般要使r<=c,并且|r-c|最小。

      如一个8片16M×8位芯片构成的128MB内存条,该芯片有8个位平面,行地址和列地址可以是各占12位。则:

    • 128MB=212×212×8位(1B)×8片。
    • 如果主存只有这一个内存条,则主存地址低3位用于选片,
    • 高12+12位分别用于指示片内行地址、列地址。

    3、装入指令和存储指令过程

    load 和 store

    三、硬盘存储器

    1、磁盘存储器结构

    (1)磁盘存储器的基本组成:

    • 磁记录介质:保存信息。
    • 磁盘驱动器:读写电路,读/写转换开关、读/写磁头与磁头定位伺服系统。
    • 磁盘控制器:控制逻辑、时序电路、并->串转换电路、串->并转换电路用于连接主机和磁盘驱动器。

    (2)磁盘驱动器:

    • 磁头–盘面:每个盘片的俩面各有一个磁头,磁头号=盘面号
    • 磁道–柱面:多个盘片上的相同磁道形成一个柱面,磁道号=柱面号.
    • 扇区:即扇段,每个磁道被分成若干扇区,磁盘读写时是以扇区为单位的,每一个扇区都有一个编号。而对于每一个扇区,有多个间隙、ID域、数据域组成,数据域一般都是512B(现在有趋势至4KB)。
    • 磁道编号:读写磁盘时是一次读写一个柱面,然后移到下一个柱面。磁道最外面编址0,是自外向内编址的。

    在这里插入图片描述

    (3)磁盘读写过程逻辑

    • 盘地址:

    是磁盘读写的根据,由柱面号(磁道号)、磁头号(盘面号)、扇面号(扇段号)组成。有了盘地址,就可以读写目标磁道中的指定扇区。

    • 操作过程:
    1. 寻道:磁盘控制器将盘地址送到磁盘驱动器的磁盘地址寄存器,产生寻道命令;启动磁头定位伺服系统,根据盘地址选择对应磁头到对应柱面;寻道结束,磁盘控制器收到信号,进入下一阶段----旋转等待。
    2. 旋转等待:扇区计数器清零,接下来每一个扇区标志脉冲都会使扇区计数器+1;当计数与磁盘地址寄存器的扇区地址符合时输出符合信号。
    3. 读写:此时已经确定读写信息就在磁头下,进行写操作或者读操作。

    2、磁盘存储器性能

    (1)记录密度:

    • 道密度:径向单位长度内的磁道数目。
    • 位密度:弧向单位长度内的二进制信息数目。
    • 有高密度存储和低密度存储之分,高密度存储的外道扇区数多,低密度存储则内外道扇区数都一样。

    (2)存储容量

    (注:格式化的记录面数约为盘片数的两倍,此时容量为格式化容量)

    • 存储容量=记录面数×柱面数×扇区数×扇区字节数
    • 如果是低密度存储方式,则:存储容量=记录面数×柱面数×内圆长度×最内道位密度(如果只给出位密度,一般是最内圈位密度,且是低密度存储方式)

    (3)数据传输速率(内部传输速率、持续传输速率)

    • 概念:这里指的是内部传输,指真正进入读写阶段后单位时间读写的二进制信息。
    • 计算:转速(每秒)×弧长×位密度

    (4)平均存取时间

    • 存取时间=寻道时间+旋转等待时间+数据传输时间,而数据传输时间相对很小可以近似忽略。
    • 平均存取时间=平均寻道时间+平均等待时间 其中寻道时间一般为5-10ms,可以根据道数和道间移动时间计算; 其中一般为4-6ms平均等待时间就取磁盘旋转半周的时间.

    3、磁盘存储器连接

    第二节讲到了到了主存域CPU的连接,提到了连接结构:

    CPU内部总线接口–处理器总线–I/O桥接器–存储器总线–主存

    而磁盘存储器的磁盘控制器就连接在I/O总线上,从而与I/O桥接器乃至整个CPU和主存连接。

    4、固态硬盘SSD

    用闪存颗粒代替了磁盘作为存储介质。

    四、高速缓冲存储器Cache

      前面提到过存储器的层次结构,可以看到主存和CPU之间会有一个高速缓存Cache。根据层次结构原理,Cache里存放最可能被频繁访问的程序和数据。
      这能大大提高CPU访问内存,而在这一节我们主要介绍Cache的相关性原理和自身性工作原理。

    1、程序访问局部性

      程序指令、数据很多时候都是连续存放的。而在较短的时间间隔内,程序产生的地址往往集中在存储空间的一个很小范围内。通过分析可以得到以下俩个程序访问局部性:

    (1)时间局部性:被访问的某个存储单元在一个较短的时间间隔内很可能又被访问。
    (2)空间局部性:被访问的某个存储单元的邻近单元在一个较段的时间间隔内很可能又被访问。

    2、cache工作原理

    (1)主存块与cache行的结构

    • 主存块:cache是能和主存互相交换信息的,这就要保证cache和主存空间都被划分为等大的若干区域,以便按区域大小直接信息交换。其中主存中的区域称为主存块(简称块),信息交换以此为单位。
    • cache行:cache的信息来自主存块,其中存放一个主存块的区域称为cache行(槽)。

    以下为cache行的结构:

    • cache有效位:无信息时cache行是空的,具体标记形式是设立一个有效位(valid bit),有效位清0则意味着该cache行内信息无效、已被淘汰,置1则表示有效主存块装入。
    • cache行标记:cache行内除了有效位,还有标记位,与接下来要讲的映射里的主存地址的标记位对应,用作映射匹配。
    • 修改位(脏位):在采用回写法时设立一位修改位,1表示主存块被修改过。(cache行不一定会有修改位,与一致性写法有关)
    • LRU位,2路组相联时占1位,4路时占2位(与修改位一样,cache行不一定有LRU位,与具体替换算法有关)
    • 数据

    (2)Cache访问过程

    1. 地址搜寻:CPU给出主存地址addr,检查cache中有无addr所在块。
    2. cache访问:如果cache内addr所在块(cache hit),则从cache内区信息送CPU,。
    3. 主存访问:如果cache内addr所在块(cache miss),则从主存内取对应块复制到cache,同时送CPU。

    (3)Cache-主存的平均访问时间

    相关概念:

    • cache命中-命中率p
    • cache不命中-缺失率
    • 命中时的访问时间:即命中时间cache访问时间Tcc
    • 不命中时的访问时间:读取主存块到cache的时间 主存访问时间Tmm+cache访问时间Tcc,其中Tmm称为缺失损失

    最后得到平均访问时间:

    Taa = p×Tcc + (1-p)×(Tmm+Tcc) = Tcc + (1-p)×Tmm

    3、cache行和主存块的映射

      前面讲了cache访问的一些过程和相关时间概念。但现在有一个问题:
      当我们要去访问某个主存单位时,要去哪个cache里面搜寻呢?或者说当我们要将某个主存块复制到cache中时,要怎么选择cache行呢?
      这里就要讲到cache行和主存块的映射方式,而映射方式的具体体现在 主存地址的结构 中:

    (1)直接映射(模映射):

    • 主要思想:把主存的每一块映射到一个固定的cache行中
    • cache行号: 主存块号 mod cache行数
    • 主存地址:t位标记+c位cache行号+b位块内地址
    • 其中主存块号被分为标记和cache行号 ,根据t+c位直接推出主存块号(第几个块群的第几个块)。
      在这里插入图片描述

    如果无命中,则将主存块复制至对应cache行,设置有效位和标记位(此时标记指示在哪一个快群)

    (2)全相联映射:

    • 主要思想:主存的每一块可映射到任意cache行
    • 主存地址:t位标记+b位块内地址。由于时任意cache行,所以无需在主存地址中指出cache行号,只需比较所有cache行的标记,只要与主存地址中标记一致就可以了。
      在这里插入图片描述
      如果无命中,就直接将主存块复制到任意空闲行,然后设置cache行标记位和有效位。

    (3)组相联映射:
      直接映射和全相联映射都各有其优缺点,前者容易过多的调进调出,而后者的搜寻开销大。两者结合取长补短就产生了组相联映射:

    • 主要思想:将cache分成大小相等的组,每个主存块映射到cache固定组任意一行,即组间模映射(直接映射),组内全映射,妙啊。
    • cache组号:主存块号 mod cache组数,同时组号
    • 主存地址:t位标记+q位cache组号+b位块内地址,
    • 其中主存块号被分为标记+cache组号,标记指示主存块在哪一个主存组群里,cache组号指示主存块在该主存组群的第几个从而指定组号去进行组内全映射搜索。也就是说cache有多少组,主存中每个组群中就有多少主存块。
      在这里插入图片描述
    • N路组相联:设共有2ccache行,其中2q个组号,则每个组内有2c-q行,令s=c-q,则有每组有2scache行,称为2s路组相联,一般为2路或者4路比较常用。

    如图2路组相联映射:1块、9块、17块等等都直接映射到cache1组,然后这些块在cache组内采用全相联映射
    在这里插入图片描述

    4、cache中主存块的替换算法

    (1)先进先出算法(FIFO算法):

    • 替换掉最早装入cache的主存块。

    (2)最近最少用算法(LRU算法):

    • 替换掉近期最少使用的主存块。
    • 每一个cache行有一个计数器,计数值称为LRU位,越小越常用,被访问时置0。
    • 此时LRU位也是cache行的组成部分,2路组相联映射时LRU位占1位,4路组相联时占2位。

    (3)最不经常用算法(LFU算法)

    • 替换掉cache行中引用次数最少的块。
    • 与LRU类似但不完全相同。

    (4)随机替换算法

    • 随机替换,事实证明性能还可以,主要是代价很低。

    5、cache一致性

      cache行中的内容时来自主存块的副本,我们在写操作时也得更新cache,这里涉及到cache–主存一致性的问题。(当然,一致性问题在其他的一些情况也会涉及到,比如共享主存)。
      总之,为了处理好cache一致性问题,那么关键在于处理好写操作。

    (1)全写法

    • 写命中时,即要写的内容就在cache内,则同时写cache和主存。
    • 写不命中,则进行写分配法(更新主存并分配cache行装入)或者非写分配法(即通写法和直写法,仅更新主存单元而不把主存块装入cache行)。

    (2)回写法

    • 只写cache不写主存,若缺失则将主存块调入cache中并更新cache。
    • cache行内此时会有一位修改位,cache被替换时才将主存块内容一次写回。
    • 会出现cache和主存不同步,通常由其他同步机制进行保证。

    6、cache和程序性能

      程序的性能指程序执行所用的时间,很大程度上体现在指令数据的访问时间上,而这几乎由cache命中率决定。这就要求我们的程序有良好的访问局部性。

    五、虚拟存储器

    1、虚拟存储器基本概念

      计算机系统在运行程序时不是单纯地拿着主存的物理地址去进行指令、数据操作的。每一个程序通常会有一个独立的巨大虚拟存储空间,这样编写程序时就不会有物理内存的大小约束了。
      可以理解为程序员在虚拟地址空间内编程,而程序实际运行时会有一套机制去到真正的内存内操作。
      就好像cache与主存间的关系一样,虚拟存储空间也会有交换块大小、映射、替换、写一致性等等问题需要考虑。

    2、虚拟地址空间

    每个进程都会对应一个结构相同,空间一样的虚拟地址空间映像。

    (1)内核空间:用以存放操作系统内核代码和数据等,内核代码区和数据区在每个进程的地址空间中都一样。用户没有权限访问内核空间

    (2)用户空间:用以给用户存放进程的代码和数据等。

    • 用户栈
    • 共享库
    • 可读写数据区
    • 只读数据和代码区

    3、虚拟存储器的实现

    主要介绍分页式虚拟存储器

    (1)分页:

    • 虚拟地址空间被划分为大小相等的页面,硬盘和主存之间按页面为单位交换信息。虚拟地址空间中的页称为虚拟页、逻辑页、虚页
    • 主存空间也被划分为大小相等的页框,即页帧、物理页、实帧
    • 每一个进程生成一个页表,页表联系了虚拟地址空间和主存空间。通过页表实现程序中指令所用的逻辑地址(虚)向存放指令或数据的实际物理地址(实)转换。

    (2)页表:
      页表是一张存放在主存中的虚页号和实页号的对照表,记录着程序的虚页调入主存时被安排在主存中的位置,且页表一般长久的保存在内存中。
      进程的每一个虚拟页都在页表里有一个对应的页表项,有如下内容:

    • 装入位:即有效位和存在位,“1”表示对应页面在主存,该虚拟页已从外存调入主存,是一个“缓冲位”。
    • 修改位:即脏位,说明页面是否被修改过。修改过的话被替换时会写回磁盘。
    • 使用位:说明使用情况,用来配合替换策略。
    • 访问权限位:说明权限,用于存储保护。
    • 禁止缓存位:说明是否可以装入cache,保证存储器一致性。
    • 虚拟页的存放位置:若装入位为“1”,表示 主存物理页号(页框号)
      若装入位为“0”:则该字段要么是虚拟页在磁盘上的地址,表示虚拟页面是一个未缓存页
      要么是null,表示虚拟页面是一个未分配页

    (3)地址转换:
      这里的地址转换指将虚拟地址转换为主存物理地址,由CPU内的存储器管理部件MMU完成。
      地址构成结构:虚拟地址和主存物理地址都由页号页内偏移地址组成,
      其中,页内偏移地址俩者一样,页号根据页表项关联,当我们知道了虚拟地址后,作如下转换过程:

    • 根据页表基址寄存器找到主存中对应的页表位置。
    • 找到页表后,根据虚页号找到对应页表项。
    • 如果装入位为1,则找到物理页号并且得到完整的物理地址。
    • 如果装入位为0,则说明缺页,进行缺页处理。

    (4)快表:

      上述过程都需要从主存中查页表并且做各种后续操作,访存次数会变多,相对于主存中的页表(可以称为慢表),我们可以将活跃页表项复制到高速缓存内,形成快表TLB(后备转换缓冲器)。
      TLB很小,表项是TLB标记+慢表项,标记表示该表项来自哪一个虚拟页。

    • 全相联时虚拟页号:直接对应TLB标记。
    • 组相联时虚拟页号:高位对应TLB标记,低位对应TLB组号。

    (5)最后po一张老师ppt里的CPU访存过程图:
    在这里插入图片描述


    ----完结撒花 :: 2021/1/3,01:37

    展开全文
  • Ceph结构工作原理

    2017-11-15 16:41:00
    Ceph是统一分布式存储系统,具有优异性能、可靠、可扩展。Ceph底层是RADOS(可靠、自动、分布式对象存储),可以通过LIBRADOS直接访问到RADOS对象存储系统。...Ceph存储系统逻辑层次结构如...

    Ceph是统一分布式存储系统,具有优异的性能、可靠性、可扩展性。Ceph的底层是RADOS(可靠、自动、分布式对象存储),可以通过 LIBRADOS直接访问到RADOS的对象存储系统。RBD(块设备接口)RADOS Gateway(对象存储接口)Ceph File System(POSIX接口)都是基于RADOS的。

    Ceph存储系统的逻辑层次结构如下图所示:

    wKiom1ddFEyT4Ot9AACQJ11Le_Q848.png

    自下向上,可以将Ceph系统分为四个层次:

    1)基础存储系统RADOSReliable, Autonomic,Distributed Object Store,即可靠的、自动化的、分布式的对象存储)

       顾名思义,这一层本身就是一个完整的对象存储系统,所有存储在Ceph系统中的用户数据事实上最终都是由这一层来存储的。而Ceph的高可靠、高可扩展、高性能、高自动化等等特性本质上也是由这一层所提供的。因此,理解RADOS是理解Ceph的基础与关键。物理上,RADOS由大量的存储设备节点组层,每个节点拥有自己的硬件资源(CPU、内存、硬盘、网络),并运行着操作系统和文件系统。

    2)基础库librados

       这一层的功能是对RADOS进行抽象和封装,并向上层提供API,以便直接基于RADOS(而不是整个Ceph)进行应用开发。特别要注意的是,RADOS是一个对象存储系统,因此,librados实现的API也只是针对对象存储功能的。RADOS采用C++开发,所提供的原生librados API包括CC++两种。物理上,librados和基于其上开发的应用位于同一台机器,因而也被称为本地API。应用调用本机上的librados API,再由后者通过socketRADOS集群中的节点通信并完成各种操作。

    3)高层应用接口

       这一层包括了三个部分:RADOS GWRADOS Gateway)、 RBDReliable Block Device)和Ceph FSCeph File System),其作用是在librados库的基础上提供抽象层次更高、更便于应用或客户端使用的上层接口。其中,RADOS GW是一个提供与Amazon S3Swift兼容的RESTful APIgateway,以供相应的对象存储应用开发使用。RADOS GW提供的API抽象层次更高,但功能则不如librados强大。因此,开发者应针对自己的需求选择使用。RBD则提供了一个标准的块设备接口,常用于在虚拟化的场景下为虚拟机创建volume目前,Red Hat已经将RBD驱动集成在KVM/QEMU中,以提高虚拟机访问性能。Ceph FS是一个POSIX兼容的分布式文件系统。由于还处在开发状态,因而Ceph官网并不推荐将其用于生产环境中。

    4)应用层

       这一层就是不同场景下对于Ceph各个应用接口的各种应用方式,例如基于librados直接开发的对象存储应用,基于RADOS GW开发的对象存储应用,基于RBD实现的云硬盘等等。在上文的介绍中,有一个地方可能容易引起困惑:RADOS自身既然已经是一个对象存储系统,并且也可以提供librados API,为何还要再单独开发一个RADOS GW

    理解这个问题,事实上有助于理解RADOS的本质,因此有必要在此加以分析。粗看起来,libradosRADOS GW的区别在于,librados提供的是本地API,而RADOS GW提供的则是RESTfulAPI,二者的编程模型和实际性能不同。而更进一步说,则和这两个不同抽象层次的目标应用场景差异有关。换言之,虽然RADOSS3Swift同属分布式对象存储系统,但RADOS提供的功能更为基础、也更为丰富。这一点可以通过对比看出。

    由于SwiftS3支持的API功能近似,这里以Swift举例说明。Swift提供的API功能主要包括:

    • 用户管理操作:用户认证、获取账户信息、列出容器列表等;

    • 容器管理操作:创建/删除容器、读取容器信息、列出容器内对象列表等;

    • 对象管理操作:对象的写入、读取、复制、更新、删除、访问许可设置、元数据读取或更新等。

    由此可见,Swift(以及S3)提供的API所操作的对象只有三个:用户账户、用户存储数据对象的容器、数据对象。并且,所有的操作均不涉及存储系统的底层硬件或系统信息。不难看出,这样的API设计完全是针对对象存储应用开发者和对象存储应用用户的,并且假定其开发者和用户关心的内容更偏重于账户和数据的管理,而对底层存储系统细节不感兴趣,更不关心效率、性能等方面的深入优化。

    librados API的设计思想则与此完全不同。一方面,librados中没有账户、容器这样的高层概念;另一方面,librados API向开发者开放了大量的RADOS状态信息与配置参数,允许开发者对RADOS系统以及其中存储的对象的状态进行观察,并强有力地对系统存储策略进行控制。换言之,通过调用librados API,应用不仅能够实现对数据对象的操作,还能够实现对RADOS系统的管理和配置。这对于S3SwiftRESTfulAPI设计是不可想像的,也是没有必要的。

    基于上述分析对比,不难看出,librados事实上更适合对于系统有着深刻理解,同时对于功能定制扩展和性能深度优化有着强烈需求的高级用户。基于librados的开发可能更适合于在私有Ceph系统上开发专用应用,或者为基于Ceph的公有存储系统开发后台数据管理、处理应用。而RADOS GW则更适合于常见的基于web的对象存储应用开发,例如公有云上的对象存储服务。

    ########################################################################################################################

    RADOS的系统逻辑结构如下图所示

    wKioL1ddFY2ChmK3AABoRunbpzI131.jpg


       在使用RADOS系统时,大量的客户端程序通过与OSD或者monitor的交互获取clustermap,然后直接在本地进行计算,得出对象的存储位置后,便直接与对应的OSD通信,完成数据的各种操作。可见,在此过程中,只要保证clustermap不频繁更新,则客户端显然可以不依赖于任何元数据服务器,不进行任何查表操作,便完成数据访问流程。在RADOS的运行过程中,cluster map的更新完全取决于系统的状态变化,而导致这一变化的常见事件只有两种:OSD出现故障,或者RADOS规模扩大。而正常应用场景下,这两种事件发生的频率显然远远低于客户端对数据进行访问的频率。

    OSD的逻辑结构

       根据定义,OSD可以被抽象为两个组成部分,即系统部分和守护进程(OSDdeamon)部分。

    OSD的系统部分本质上就是一台安装了操作系统和文件系统的计算机,其硬件部分至少包括一个单核的处理器、一定数量的内存、一块硬盘以及一张网卡。

    由于这么小规模的x86架构服务器并不实用(事实上也见不到),因而实际应用中通常将多个OSD集中部署在一台更大规模的服务器上。在选择系统配置时,应当能够保证每个OSD占用一定的计算能力、一定量的内存和一块硬盘。同时,应当保证该服务器具备足够的网络带宽。具体的硬件配置选择可以参考。

       在上述系统平台上,每个OSD拥有一个自己的OSD deamon。这个deamon负责完成OSD的所有逻辑功能,包括与monitor和其他OSD(事实上是其他OSDdeamon)通信以维护更新系统状态,与其他OSD共同完成数据的存储和维护,与client通信完成各种数据对象操作等等。

        Ceph系统的逻辑结构就介绍到这里。下篇文章将着重说明Ceph(主要是RADOS)的工作原理和操作流程。

    如图所示,RADOS集群主要由两种节点组成。一种是为数众多的、负责完成数据存储和维护功能的OSDObject Storage Device),另一种则是若干个负责完成系统状态检测和维护的monitorOSDmonitor之间相互传输节点状态信息,共同得出系统的总体工作状态,并形成一个全局系统状态记录数据结构,即所谓的cluster map。这个数据结构与RADOS提供的特定算法相配合,便实现了Ceph“无需查表,算算就好的核心机制以及若干优秀特性。

    Ceph的工作原理及流程

       本节将对Ceph的工作原理和若干关键工作流程进行扼要介绍。如前所述,由于Ceph的功能实现本质上依托于RADOS,因而,此处的介绍事实上也是针对RADOS进行。对于上层的部分,特别是RADOS GWRBD,由于现有的文档中(包括Sage的论文中)并未详细介绍,还请读者多多包涵。

       首先介绍RADOS中最为核心的、基于计算的对象寻址机制,然后说明对象存取的工作流程,之后介绍RADOS集群维护的工作过程,最后结合Ceph的结构和原理对其技术优势加以回顾和剖析。

    Ceph系统中的寻址流程如下图所示:

    wKioL1ddFayyR7WjAABGDU_wFPM713.jpg

    上图左侧的几个概念说明如下:

    1. File —— 此处的file就是用户需要存储或者访问的文件。对于一个基于Ceph开发的对象存储应用而言,这个file也就对应于应用中的对象,也就是用户直接操作的对象

    2. Ojbect —— 此处的objectRADOS所看到的对象Object与上面提到的file的区别是,object的最大sizeRADOS限定(通常为2MB4MB),以便实现底层存储的组织管理。因此,当上层应用向RADOS存入size很大的file时,需要将file切分成统一大小的一系列object(最后一个的大小可以不同)进行存储。为避免混淆,在本文中将尽量避免使用中文的对象这一名词,而直接使用fileobject进行说明。

    3. PGPlacement Group—— 顾名思义,PG的用途是对object的存储进行组织和位置映射。具体而言,一个PG负责组织若干个object(可以为数千个甚至更多),但一个object只能被映射到一个PG中,即,PGobject之间是一对多映射关系。同时,一个PG会被映射到nOSD上,而每个OSD上都会承载大量的PG,即,PGOSD之间是多对多映射关系。在实践当中,n至少为2,如果用于生产环境,则至少为3一个OSD上的PG则可达到数百个。事实上,PG数量的设置牵扯到数据分布的均匀性问题。关于这一点,下文还将有所展开。

    4. OSD —— object storage device,前文已经详细介绍,此处不再展开。唯一需要说明的是,OSD的数量事实上也关系到系统的数据分布均匀性,因此其数量不应太少。在实践当中,至少也应该是数十上百个的量级才有助于Ceph系统的设计发挥其应有的优势。


    基于上述定义,便可以对寻址流程进行解释了。具体而言,Ceph中的寻址至少要经历以下三次映射:

    1. File -> object映射

       这次映射的目的是,将用户要操作的file,映射为RADOS能够处理的object。其映射十分简单,本质上就是按照object的最大sizefile进行切分,相当于RAID中的条带化过程。这种切分的好处有二:一是让大小不限的file变成最大size一致、可以被RADOS高效管理的object;二是让对单一file实施的串行处理变为对多个object实施的并行化处理。

       每一个切分后产生的object将获得唯一的oid,即object id。其产生方式也是线性映射,极其简单。图中,ino是待操作file的元数据,可以简单理解为该file的唯一idono则是由该file切分产生的某个object的序号。而oid就是将这个序号简单连缀在该file id之后得到的。举例而言,如果一个idfilenamefile被切分成了三个object,则其object序号依次为012,而最终得到的oid就依次为filename0filename1filename2

    这里隐含的问题是,ino的唯一性必须得到保证,否则后续映射无法正确进行。

    2. Object -> PG映射

       在file被映射为一个或多个object之后,就需要将每个object独立地映射到一个PG中去。这个映射过程也很简单,如图中所示,其计算公式是:

    hash(oid) & mask ->pgid

       由此可见,其计算由两步组成。首先是使用Ceph系统指定的一个静态哈希函数计算oid的哈希值,将oid映射成为一个近似均匀分布的伪随机值。然后,将这个伪随机值和mask按位相与,得到最终的PG序号(pgid)。根据RADOS的设计,给定PG的总数为mm应该为2的整数幂),则mask的值为m-1。因此,哈希值计算和按位与操作的整体结果事实上是从所有mPG中近似均匀地随机选择一个。基于这一机制,当有大量object和大量PG时,RADOS能够保证objectPG之间的近似均匀映射。又因为object是由file切分而来,大部分objectsize相同,因而,这一映射最终保证了,各个PG中存储的object的总数据量近似均匀。

    从介绍不难看出,这里反复强调了大量。只有当objectPG的数量较多时,这种伪随机关系的近似均匀性才能成立,Ceph的数据存储均匀性才有保证。为保证大量的成立,一方面,object的最大size应该被合理配置,以使得同样数量的file能够被切分成更多的object;另一方面,Ceph也推荐PG总数应该为OSD总数的数百倍,以保证有足够数量的PG可供映射。

    3. PG -> OSD映射

       第三次映射就是将作为object的逻辑组织单元的PG映射到数据的实际存储单元OSD。如图所示,RADOS采用一个名为CRUSH的算法,将pgid代入其中,然后得到一组共nOSD。这nOSD即共同负责存储和维护一个PG中的所有object前已述及,n的数值可以根据实际应用中对于可靠性的需求而配置,在生产环境下通常为3。具体到每个OSD,则由其上运行的OSD deamon负责执行映射到本地的object在本地文件系统中的存储、访问、元数据维护等操作。

    “object -> PG”映射中采用的哈希算法不同,这个CRUSH算法的结果不是绝对不变的,而是受到其他因素的影响。其影响因素主要有二:

    一是当前系统状态,也就是上文逻辑结构中曾经提及的clustermap。当系统中的OSD状态、数量发生变化时,cluster map可能发生变化,而这种变化将会影响到PGOSD之间的映射。

    二是存储策略配置。这里的策略主要与安全相关。利用策略配置,系统管理员可以指定承载同一个PG3OSD分别位于数据中心的不同服务器乃至机架上,从而进一步改善存储的可靠性。

    因此,只有在系统状态(cluster map)和存储策略都不发生变化的时候,PGOSD之间的映射关系才是固定不变的。在实际使用当中,策略一经配置通常不会改变。而系统状态的改变或者是由于设备损坏,或者是因为存储集群规模扩大。好在Ceph本身提供了对于这种变化的自动化支持,因而,即便PGOSD之间的映射关系发生了变化,也并不会对应用造成困扰。事实上,Ceph正是需要有目的的利用这种动态映射关系。正是利用了CRUSH的动态特性,Ceph可以将一个PG根据需要动态迁移到不同的OSD组合上,从而自动化地实现高可靠性、数据分布re-blancing等特性。

    之所以在此次映射中使用CRUSH算法,而不是其他哈希算法,原因之一正是CRUSH具有上述可配置特性,可以根据管理员的配置参数决定OSD的物理位置映射策略;另一方面是因为CRUSH具有特殊的稳定性,也即,当系统中加入新的OSD,导致系统规模增大时,大部分PGOSD之间的映射关系不会发生改变,只有少部分PG的映射关系会发生变化并引发数据迁移。这种可配置性和稳定性都不是普通哈希算法所能提供的。因此,CRUSH算法的设计也是Ceph的核心内容之一,具体介绍可以参考。

    至此为止,Ceph通过三次映射,完成了从fileobjectPGOSD整个映射过程。通观整个过程,可以看到,这里没有任何的全局性查表操作需求。至于唯一的全局性数据结构cluster map,在后文中将加以介绍。可以在这里指明的是,cluster map的维护和操作都是轻量级的,不会对系统的可扩展性、性能等因素造成不良影响。

    一个可能出现的困惑是:为什么需要同时设计第二次和第三次映射?难道不重复么?关于这一点,Sage在其论文中解说不多,而笔者个人的分析如下:

    我们可以反过来想像一下,如果没有PG这一层映射,又会怎么样呢?在这种情况下,一定需要采用某种算法,将object直接映射到一组OSD上。如果这种算法是某种固定映射的哈希算法,则意味着一个object将被固定映射在一组OSD上,当其中一个或多个OSD损坏时,object无法被自动迁移至其他OSD上(因为映射函数不允许),当系统为了扩容新增了OSD时,object也无法被re-balance到新的OSD上(同样因为映射函数不允许)。这些限制都违背了Ceph系统高可靠性、高自动化的设计初衷。

    如果采用一个动态算法(例如仍然采用CRUSH算法)来完成这一映射,似乎是可以避免静态映射导致的问题。但是,其结果将是各个OSD所处理的本地元数据量爆增,由此带来的计算复杂度和维护工作量也是难以承受的。

    例如,在Ceph的现有机制中,一个OSD平时需要和与其共同承载同一个PG的其他OSD交换信息,以确定各自是否工作正常,是否需要进行维护操作。由于一个OSD上大约承载数百个PG,每个PG内通常有3OSD,因此,一段时间内,一个OSD大约需要进行数百至数千次OSD信息交换。

    然而,如果没有PG的存在,则一个OSD需要和与其共同承载同一个object的其他OSD交换信息。由于每个OSD上承载的object很可能高达数百万个,因此,同样长度的一段时间内,一个OSD大约需要进行的OSD间信息交换将暴涨至数百万乃至数千万次。而这种状态维护成本显然过高。

    综上所述,笔者认为,引入PG的好处至少有二:一方面实现了objectOSD之间的动态映射,从而为Ceph的可靠性、自动化等特性的实现留下了空间;另一方面也有效简化了数据的存储组织,大大降低了系统的维护管理开销。理解这一点,对于彻底理解Ceph的对象寻址机制,是十分重要的。


    数据操作流程

    此处将首先以file写入过程为例,对数据操作流程进行说明。

    为简化说明,便于理解,此处进行若干假定。首先,假定待写入的file较小,无需切分,仅被映射为一个object。其次,假定系统中一个PG被映射到3OSD上。

    基于上述假定,则file写入流程可以被下图表示:

    wKioL1ddFdPBsC9eAAAyy8pwuWk184.png

    如图所示,当某个client需要向Ceph集群写入一个file时,首先需要在本地完成5.1节中所叙述的寻址流程,将file变为一个object,然后找出存储该object的一组三个OSD。这三个OSD具有各自不同的序号,序号最靠前的那个OSD就是这一组中的Primary OSD,而后两个则依次是Secondary OSDTertiary OSD

    找出三个OSD后,client将直接和Primary OSD通信,发起写入操作(步骤1)。Primary OSD收到请求后,分别向Secondary OSDTertiary OSD发起写入操作(步骤23)。当Secondary OSDTertiary OSD各自完成写入操作后,将分别向Primary OSD发送确认信息(步骤45)。当Primary OSD确信其他两个OSD的写入完成后,则自己也完成数据写入,并向client确认object写入操作完成(步骤6

    之所以采用这样的写入流程,本质上是为了保证写入过程中的可靠性,尽可能避免造成数据丢失。同时,由于client只需要向Primary OSD发送数据,因此,在Internet使用场景下的外网带宽和整体访问延迟又得到了一定程度的优化。

    当然,这种可靠性机制必然导致较长的延迟,特别是,如果等到所有的OSD都将数据写入磁盘后再向client发送确认信号,则整体延迟可能难以忍受。因此,Ceph可以分两次向client进行确认。当各个OSD都将数据写入内存缓冲区后,就先向client发送一次确认,此时client即可以向下执行。待各个OSD都将数据写入磁盘后,会向client发送一个最终确认信号,此时client可以根据需要删除本地数据。

    分析上述流程可以看出,在正常情况下,client可以独立完成OSD寻址操作,而不必依赖于其他系统模块。因此,大量的client可以同时和大量的OSD进行并行操作。同时,如果一个file被切分成多个object,这多个object也可被并行发送至多个OSD

    OSD的角度来看,由于同一个OSD在不同的PG中的角色不同,因此,其工作压力也可以被尽可能均匀地分担,从而避免单个OSD变成性能瓶颈。

    如果需要读取数据,client只需完成同样的寻址过程,并直接和Primary OSD联系。目前的Ceph设计中,被读取的数据仅由Primary OSD提供。但目前也有分散读取压力以提高性能的讨论。


    集群维护

    前面的介绍中已经提到,由若干个monitor共同负责整个Ceph集群中所有OSD状态的发现与记录,并且共同形成clustermapmaster版本,然后扩散至全体OSD以及clientOSD使用cluster map进行数据的维护,而client使用cluster map进行数据的寻址。

    在集群中,各个monitor的功能总体上是一样的,其相互间的关系可以被简单理解为主从备份关系。因此,在下面的讨论中不对各个monitor加以区分。

    略显出乎意料的是,monitor并不主动轮询各个OSD的当前状态。正相反,OSD需要向monitor上报状态信息。常见的上报有两种情况:一是新的OSD被加入集群,二是某个OSD发现自身或者其他OSD发生异常。在收到这些上报信息后,monitor将更新cluster map信息并加以扩散。其细节将在下文中加以介绍。

    Cluster map的实际内容包括:

    1 Epoch,即版本号。Cluster mapepoch是一个单调递增序列。Epoch越大,则cluster map版本越新。因此,持有不同版本cluster mapOSDclient可以简单地通过比较epoch决定应该遵从谁手中的版本。而monitor手中必定有epoch最大、版本最新的cluster map。当任意两方在通信时发现彼此epoch值不同时,将默认先将cluster map同步至高版本一方的状态,再进行后续操作。

    2)各个OSD的网络地址。

    3)各个OSD的状态。OSD状态的描述分为两个维度:up或者down(表明OSD是否正常工作),in或者out(表明OSD是否在至少一个PG中)。因此,对于任意一个OSD,共有四种可能的状态:

    —— Upin:说明该OSD正常运行,且已经承载至少一个PG的数据。这是一个OSD的标准工作状态;

    —— Upout:说明该OSD正常运行,但并未承载任何PG,其中也没有数据。一个新的OSD刚刚被加入Ceph集群后,便会处于这一状态。而一个出现故障的OSD被修复后,重新加入Ceph集群时,也是处于这一状态;

    —— Downin:说明该OSD发生异常,但仍然承载着至少一个PG,其中仍然存储着数据。这种状态下的OSD刚刚被发现存在异常,可能仍能恢复正常,也可能会彻底无法工作;

    —— Downout:说明该OSD已经彻底发生故障,且已经不再承载任何PG

    4CRUSH算法配置参数。表明了Ceph集群的物理层级关系(cluster hierarchy),位置映射规则(placement rules)。

    根据cluster map的定义可以看出,其版本变化通常只会由(3)和(4)两项信息的变化触发。而这两者相比,(3)发生变化的概率更高一些。这可以通过下面对OSD工作状态变化过程的介绍加以反映。

    一个新的OSD上线后,首先根据配置信息与monitor通信。Monitor将其加入cluster map,并设置为upout状态,再将最新版本的cluster map发给这个新OSD

    收到monitor发来的clustermap之后,这个新OSD计算出自己所承载的PG(为简化讨论,此处我们假定这个新的OSD开始只承载一个PG),以及和自己承载同一个PG的其他OSD。然后,新OSD将与这些OSD取得联系。如果这个PG目前处于降级状态(即承载该PGOSD个数少于正常值,如正常应该是3个,此时只有2个或1个。这种情况通常是OSD故障所致),则其他OSD将把这个PG内的所有对象和元数据复制给新OSD。数据复制完成后,新OSD被置为upin状态。而cluster map内容也将据此更新。这事实上是一个自动化的failure recovery过程。当然,即便没有新的OSD加入,降级的PG也将计算出其他OSD实现failure recovery

    如果该PG目前一切正常,则这个新OSD将替换掉现有OSD中的一个(PG内将重新选出Primary OSD),并承担其数据。在数据复制完成后,新OSD被置为upin状态,而被替换的OSD将退出该PG(但状态通常仍然为upin,因为还要承载其他PG)。而cluster map内容也将据此更新。这事实上是一个自动化的数据re-balancing过程。

    如果一个OSD发现和自己共同承载一个PG的另一个OSD无法联通,则会将这一情况上报monitor。此外,如果一个OSD deamon发现自身工作状态异常,也将把异常情况主动上报给monitor。在上述情况下,monitor将把出现问题的OSD的状态设为downin。如果超过某一预订时间期限,该OSD仍然无法恢复正常,则其状态将被设置为downout。反之,如果该OSD能够恢复正常,则其状态会恢复为upin。在上述这些状态变化发生之后,monitor都将更新cluster map并进行扩散。这事实上是自动化的failure detection过程。

    由之前介绍可以看出,对于一个Ceph集群而言,即便由数千个甚至更多OSD组成,cluster map的数据结构大小也并不惊人。同时,cluster map的状态更新并不会频繁发生。即便如此,Ceph依然对cluster map信息的扩散机制进行了优化,以便减轻相关计算和通信压力。

    首先,cluster map信息是以增量形式扩散的。如果任意一次通信的双方发现其epoch不一致,则版本更新的一方将把二者所拥有的cluster map的差异发送给另外一方。

    其次,cluster map信息是以异步且lazy的形式扩散的。也即,monitor并不会在每一次clustermap版本更新后都将新版本广播至全体OSD,而是在有OSD向自己上报信息时,将更新回复给对方。类似的,各个OSD也是在和其他OSD通信时,将更新发送给版本低于自己的对方。

    基于上述机制,Ceph避免了由于cluster map版本更新而引起的广播风暴。这虽然是一种异步且lazy的机制,但根据Sage论文中的结论,对于一个由nOSD组成的Ceph集群,任何一次版本更新能够在O(log(n))时间复杂度内扩散到集群中的任何一个OSD上。

    一个可能被问到的问题是:既然这是一种异步和lazy的扩散机制,则在版本扩散过程中,系统必定出现各个OSD看到的cluster map不一致的情况,这是否会导致问题?答案是:不会。事实上,如果一个client和它要访问的PG内部的各个OSD看到的cluster map状态一致,则访问操作就可以正确进行。而如果这个client或者PG中的某个OSD和其他几方的cluster map不一致,则根据Ceph的机制设计,这几方将首先同步cluster map至最新状态,并进行必要的数据re-balancing操作,然后即可继续正常访问。

    通过上述介绍,我们可以简要了解Ceph究竟是如果基于cluster map机制,并由monitorOSDclient共同配合完成集群状态的维护与数据访问的。特别的,基于这个机制,事实上可以自然而然的完成自动化的数据备份、数据re-balancing、故障探测和故障恢复,并不需要复杂的特殊设计。这一点确实让人印象深刻。



    本文转自Jacken_yang 51CTO博客,原文链接:http://blog.51cto.com/linuxnote/1788294,如需转载请自行联系原作者

    展开全文
  • 文章目录1. 存储器层次结构1.1 CPU1.1.1 算术逻辑单元1.1.2 控制单元1.2 存储...      在正式进入存储层次结构话题之前,我们先粗略地对CPU的工作原理做一个简述,这样有助于对存储层次结构模型的理解和认识。 1.1

    1. 存储器层次结构

          在正式进入存储层次结构话题之前,我们先粗略地对CPU的工作原理做一个简述,这样有助于对存储层次结构模型的理解和认识。

    1.1 CPU

         CPU(Central Processing Unit)通常也称为“中央处理器”,或简称“处理器”,是一个高度复杂、广泛的电子电路集,负责执行存储的程序指令。在CPU的内部,有两个主要集成部件,分别是算术逻辑单元控制单元如下图所示:

    在这里插入图片描述

    1.1.1 算术逻辑单元

         · 算术逻辑单元(Arithmetic Logic Unit)

         它是计算机系统中CPU的主要部件,它执行CPU可能需要的所有计算,如算术元素、逻辑运算、以及位移操作。通常执行以下操作:

         逻辑运算:包括AND(与)、OR(或)、NOT(取反)、XOR(异或)等。

         位移操作:<<(左移)、>>(右移),即乘法操作。

         算术运算:即位的加法、减法。有时也会使用乘法和除法,但是这两种运算对于硬件制造工艺和执行成本较高,乘法可用加法来替代实现,除法可以用减法来实现。

    1.1.2 控制单元

         · 控制单元(Control Unit,CU)

          它是计算机CPU中的主要部件,其主要功能是从计算机的内存(主存)中提取指令到CPU的寄存器,解析并执行指令。它接收来自用户的输入指令或信息并根据提取到CPU寄存器中的内容来将其转换为控制信号(控制信号通常由整个系统总线中被称为控制总线的部分传输),并将控制信息递交给CPU以供进一步的执行。控制单元(CU)负责提供定时信号、控制信息,并指导CPU执行程序。下图为控制单元的内部框架图。

    在这里插入图片描述

    1.2 存储类型

    1.2.1 主存储器和辅助存储器

         计算机使用两种存储类型,分别是:主存储器(Primary storage)和辅助存储器(secondary storage)。CPU与主存储器(Main Memory)密切交互,同时引用它来获取指令与数据。从技术上讲,内存不属于CPU的一部分。虽然它(内存)与CPU密切相连,但和CPU是分开的。内存只在与之相关的程序运行时才存储程序指令或数据。

    1.2.2 揭秘内存这个混淆概念

         提起内存,或许让人产生困惑,有些教科书中,前文使用“内存”,下文又焕然一新地使用了“主存”,但是全文却对“内存和主存”之间的联系只字未提。没有读之前,概念模糊;读完之后,更加模糊,甚至开始怀疑人生。

         对于内存,有下面的这样一段说明:

    Memory is also known as primary storage, primary memory, main storage, internal storage, main memory, and RAM (Random Access Memory).

         简译过来就是说内存被称为主存或RAM(随机访问存储器)。因此文中提到的内存和主存都是指的同一个概念。

    1.2.3 CPU执行程序指令

         CPU只能操作内存上的数据。因此,在一条指令被执行之前,程序指令和数据必须从输入设备或辅助存储器设备上面复制到内存中。一旦需要的程序指令和数据被加载到内存中,CPU将对每条指令执行以下4个步骤:

         (1)控制单元(CU)从内存中获取指令;

         (2)控制单元(CU)对指令进行解码(决定其含义),并指示将需要的数据从内存转移到算术逻辑单元(ALU)中。步骤(1)和步骤(2)称为“指令时间(或L-Time)。”

         (3)算术逻辑单元指向算术或逻辑运算指令。即ALU被赋予控制权,对数据进行实际操作。

         (4)算术逻辑单元(ALU)将运算结果存储在内存或是寄存器中。步骤(3)和步骤(4)称为“执行时间(或E-Time)。”

         CPU继续获取下一条指令,周而复始,该过程将一直持续到程序完成并使用输出设备输出结果为止。

         下图是CPU执行程序指令逻辑图。

    在这里插入图片描述
         控制单元最终指示内存将结果发送到输出设备或是辅助存储器。L-Time和E-Time的组合称为机器周期,通常指令周期也称为机器周期。
         

    1.3 存储层次结构的引入

         在《编译原理》第二版的7.4.2小节中,有过这样一段话:

         程序的效率不仅取决于被执行的指令的数量,还取决于执行其中每条指令所花费的时间。不同情况下执行一条指令所花费的时间可能会有明显的不同,因为访问不同的存储区域所花费的时间从几纳秒到几毫秒不等。

         用户启动程序时,操作系统将可执行程序的副本(指令和数据)加载到内存(CPU只能操作内存)上,并且通过从内存中逐个提取指令来执行程序。通常CPU的执行速度非常快,而内存中的数据访问数据远不能与CPU的执行速度相匹配。快速、强大的CPU需要迅速、容易地去访问大量数据,若CPU不能立刻得到它需要的数据,则CPU会停下来等待。比如一个以1兆赫(MHz)时钟周期运行的CPU,每秒大约可运行100多万次,即处理上百万的字节;而一个以2千兆赫(GHz)时钟周期运行的CPU约每秒可运行至少20亿次,即处理数十亿的字节。那么,现在面临的一个严峻的问题是,需要一个速度能够跟上CPU或是能够与之相匹配的内存。基于硬件技术的局限性,我们可以制造出一个小而快的存储器件,但是无法做到制造出一个访问速度又快、存储空间又大的存储器件。

         对于每一种处理器体系结构(比如ARM、MIPS、PowerPC等),其寄存器的数量均有限,通常寄存器的存储空间大小在几百字节左右,无法将内存中的全部指令和数据加载到寄存器中作映射、快速响应。因此,在尽量满足既要访问、获取速度快,又要存储空间容量大这两个需求下,计算机设计者(Computer designers)找到了一种均衡的方式来来安排它们的存储。在数量小时,使用昂贵的存储器,较小较快的元素更加接近CPU;而在数量大时使用使用便宜的存储器进行备份,较大且速度慢的元素则离CPU位置比较远,这便是“存储层次结构(Memory Hierarchy)。”
         
         一个典型的“存储层次结构”如下图所示。

    在这里插入图片描述
                                   图片来自 learncomputerscienceonline

         · 寄存器(Register)

         一个处理器(CPU)通常具备有少量寄存器,这些寄存器能够存储几百字节,对于寄存器中的内容,将由软件控制。一个CPU拥有的寄存器的数量和每个寄存器的大小(位的数量)有助于确定一个CPU的功率和速度,比如对于一个32位的CPU,它是一个每个寄存器均为32位宽的CPU,如MIPS,有32个寄存器,因此,每条CPU指令均可操作32位数据。寄存器是CPU中的一个特殊的高速存储区。所有数据必须在寄存器中表示,然后才能进行处理。比如,若指向两个数相加,则这两个数都必须在寄存器中,并且相加的结果也要放在寄存器中。

         · L1高速缓存

         L1(一级)和L2(一级)是计算机中的两个缓存级别。若CPU能够在高速缓存中找到下一步将要执行的指令(也称为缓存命中),那么它将直接从缓存中获取该指令以节省时间。高速缓存通常由静态随机访问存储器(Static Random Access Memory,SRAM)制造,其大小从几千字节到几兆字节不等。若L1缓存没有找到(也称为缓存未命中)要执行的指令,那么继续去下一级缓存(即L2)寻找。L1缓存是最快速的高级缓存,因为它已经内置在芯片内部,具有零等待状态接口,这使它成为CPU高速缓存中最昂贵的高速缓存。

         · L2高速缓存

         L2是二级缓存,它使用了和L1相同的控制逻辑、相同的技术和晶体材料(SRAM)制造,读写、访问速度上比L1满一些,但是存储容量上要略大于L。记住,距离CPU越近,读写速度越快,造价也越高;反之,则读写、访问速度越慢,造价也越便宜。

         · 内存(DRAM)

         动态随机存取存储器(Dynamic random-access memory, DRAM)是一种内存,通常用于计算机CPU运行所需要的数据和程序代码。 它允许CPU直接访问内存的任何部分,而不必从一个开始位置按照顺序去执行。这里的内存是指物理(主)内存,它由数百兆到几千兆的动态RAM构造。RAM位于靠近计算机处理器的位置,能够比硬盘驱动器和固态驱动器等存储介质更快地访问数据。

         · 辅助存储器

         这一层的主要目的是以低成本提供巨大的存储容量。通常,第四级存储是使用可移动介质构建的,并且位于内存层次结构的底部。可移动介质的常见示例是软盘和CD-ROM、USB、磁带、固态硬盘SSD等等。

         数据是以连续块的方式来进行传输。为了分摊访问的开销,在存储层次结构中,较慢内存层次间通过使用较大的块交互,而较快的层次间使用较小的块。比如在主存和高速缓存之间的数据交互是按照称为高速缓存线(Cache Line)的块进行传输,高速缓存线的长度通常在32~256字节之间;而在虚拟内存(硬盘)和主存/内存之间的数据传输被称为“页(page)。” 页大小在4~64KB间。这涉及到内存管理单元、分页技术等领域,后面将专门用一篇博文来讲解。
         

    1.3.1 内存管理单元(MMU)

         内存管理单元(Memory Management Unit,MMU)是一个计算机硬件组件,它处理与CPU相关的所有内存和缓存,在内存地址被加载到系统总线上之前,它们被MMU转换成物理地址。它有两个特殊寄存器,分别是“内存数据寄存器(Memory Data Register, MDR)”和“内存地址寄存器(Memory Address Register,MAR)。”它们由CPU的控制单元(CU)进行访问。更多关于MMU的内容请阅读 内存管理单元

    在这里插入图片描述
                                   图片来自 learncomputerscienceonline

    1.4 关于局部性

         通常情况下,一个程序中,包含着一些或许从来不会被CPU指向的指令或数据;又或者某些情况下,程序往往将大部分的时间花在内部循环或是嵌套递归环上;又或者程序的一次执行中,真正被CPU获取执行的指令仅占用代码的一小部分。基于以上种种原因和现象,我们可以看到程序表现出高度的局限性。通常的局限性可分为:时间局限性和空间局限性。

    1.4.1 时间局部性

         时间局部性是指最近执行的指令有很大的机会再次执行。因此,该指令被保存在高速缓存中,这样就可以很容易地获取它,并且无需花费时间去寻找相同的指令。
         

    1.4.2 空间局部性

         空间局域性意味着所有存储在最近执行的指令附近的指令都有很高的执行几率。它是指在存储位置上相对靠近的数据元素(指令)的使用。

    1.4.3 局部性应用场景

         局部性原则几乎被所有操作系统、数据库、架构设计师普遍采用,其使用范围越来越广泛:

         · Web浏览器保存最近的web页面
         · 搜索引擎中查找最相关的回答
         · CPU高速缓存,会将最常使用的指令放到高速缓存
         · 在虚拟内存中组织缓存以进行地址转换并设计替换算法

         这里进列举常见的场景,除了这些,还有非常多的地方应用到了局部性原则。

    展开全文
  • 存储系统层级结构①知识导图存储器分类按存储器功能分类按存取方式分类按存取介质分类按信息可保存分类存储系统的层次结构存储系统追求目标存储器金字塔层次结构存储层次结构多级存储层次三级存储系统...

    存储器分类&存储系统的层级结构

    /*

    开始时间:2021-04-03

    结束时间:2021-04-07

    字数:1.3k

    修改日志:

    ​   暂无

    */

    知识导图

    存储器01知识导图

    存储器的分类

    存储器是计算机的重要组成部分,在计算机工作时起着重要的作用,根据不同的分类方式,可以将存储器分为以下几类:

    按存储器的功能分类

    • 主存储器:即内存,与CPU直接交换数据。
    • 辅助存储器:即外存,电脑硬盘,一般存储长期保存的数据。
    • 高速缓冲存储器(Cache):内存和外存之间数据交换的媒介,弥补了内存的存储容量小和外存存储速度慢的缺点。

    按存取方式分类

    • 随机存储器(Random Access Memory ,RAM

      CPU可以对存储器内的数据随机的随去,不受其存储位置的影响。主要作主存或高速缓冲存储器使用。

    • 只读存储器(Read Only Memory,ROM

      与随机存储器类似,但是只能从中读取数据,而不能修改其中的信息。断电后其中的数据也不会丢失。

    • 顺序存储器(Sequential Access Memory,SAM

      只能按照一定顺序读取其中的信息,代表为磁带。

    • 直接存储器(Direct Access Memory,DAM

      介于随机存储器和顺序存储器之间,对其进行信息读写时,先是直接定位至某一大范围内(类似RAM),再在其中进行顺序检索,确定准确的地址(类似SAM),进行信息的读写。

    按存取介质分类

    (主要是存储材料不同,了解即可。)

    • 磁芯存储器
    • 半导体存储器
    • 磁表面存储器
    • 光存储器

    按信息的可保存性分类

    • 易失性存储器:断电后存储信息即消失的存储器,内存,半导体RAM
    • 非易失性存储器:断电后存储信息仍然保留的存储器,外存,ROM,磁芯存储器,磁表面存储器,光盘

    存储系统的层次结构

    存储器是存储系统的组成单元,由于各种存储器的存储容量、存储速度和成本不同,为了提高利用率,适应不同的使用环境,通常将不同的存储器组合起来使用,形成一个统一的存储系统。

    存储系统的追求目标

    1. 尽快的存储速度
    2. 尽大的存储空间
    3. 尽低的存储成本

    存储器的金字塔层次结构

    金字塔存储器结构

    在上述金字塔形存储器结构中,越靠近顶层,存储器的存储速度越快,存储容量越小,存储单位成本越大。反之,越靠近底层,存储器的存储速度越慢,存储容量越大,存储单位成本越小。

    存储层次结构

    根据上面所要求的存储系统所追求的目标和存储器的金字塔模型,可以构成几种存储层次。

    多级存储层次

    多级缓冲存储类似于金字塔模型,CPU位于金字塔模型的顶部,层次结构图为:

    多级缓冲层次图:

    其中,Mn 的存储容量最大,存储速度最慢,单位存储成本最低,一直到M1 存储容量减小,存储速度增大,单位存储成本增大。整个存储系统中,存储速度接近M1,存储容量接近或等于Mn,单位存储成本接近Mn ;其中最常用的数据存储在M1 中,最少使用的在Mn 中。

    三级存储系统

    由高速缓冲存储器,主存储器,辅助存储器构成的三级存储系统。

    可以分为两个层次

    1. 高速缓存和主存间:Cache-主存存储层次(Cache存储系统)

      Cache存储系统

    2. 主存和辅存之间:主存-辅存存储层次(虚拟存储系统)
      虚拟存储系统

    Cache存储系统解决了主存存储速度不足的问题。增加Cache后,对于CPU来说,主存的数据传输速度已经达到了CPU的运算速度。

    虚拟存储系统解决了主存储器存储空间不足的问题。增加辅存,即外存或硬盘,增加了主存的存储容量,数据的传输速度不会降低,单位存储成本接近于辅存的成本。

    注释

    ① 对于这部分内容主要是对存储系统的概括,基于存储器的综合性描述。

    ② 主存即内存,其速度相对于外存已经很快了,但是还赶不上CPU的运算速度,所以这里的速度不足是相对而言的。

    ③ 图示摘自参考书 P126-图5-2

    参考资料

    [1]蒋本珊.计算机组成原理.4版.北京:清华大学,2019.

    展开全文
  • 文章目录存储系统存储器的层次结构存储器分类按作用分类按存储介质分类按存取方式分类按信息可保存分类存储器性能指标存储器的层次结构多级存储系统半导体随机存储器半导体存储芯片半导体存储芯片基本...
  • 2、静态随机存储器和动态随机存储器的工作原理是什么? 3、动态随机存储器的刷新方式有哪些? 4、存储器的位扩展、字扩展、字位扩展技术 5、提高存储器性能的技术有哪些方案? 6、存储器的层次结构是要解决什么...
  • Region Region 是表格可用和分布基本元素,由列族...对象的层次结构如下: - Table - Region - Store (由每个 Region 中列族组成的存储块) - MemStore (每个 Region 中存储在内存中 Store) ...
  • Region Region 是表格可用和分布基本元素,由列族(Column Family)构成 Store 组成。对象的层次结构如下: - Table - Region - Store (由每个 Region 中列族组成的存储块) - ...
  • 存储系统 计算机系统五大基础部件之一:存储器 局部性原理 说明:是指CPU访问存储器时,无论是存取指令还是...层次存储结构 CUP:寄存器,存储最快,但容量小,成本高 Cache:按内容存取,是CUP之后,最快存储
  • 建立起如何用不同的存储器组成具有层次结构的存储系统的概念。 存储器是计算机系统中的记忆设备,用来存放程序和数据。随着计算机发展,存储器在系统中的地位越来越重要。 存储器分类 存储器的种类繁多,从不同的角度对...
  • 第四章 存储系统

    千次阅读 2020-05-31 21:11:50
    SRAM静态MOS存储单元静态MOS存储器的结构动态MOS存储器 DRAM四管动态MOS存储的工作原理单管动态MOS存储单元的工作原理动态MOS存储的刷新只读存储器闪存 FLASH主存的组织与CPU的连接存储器的拓展
  • 第六章 存储系统

    2020-11-21 11:58:22
    文章目录存储系统的层次结构技术指标层次结构局部原理主存储器读写存储器只读存储器存储器地址译码主存空间分配高速缓冲存储器工作原理地址映射替换算法写入策略80486L1 CachePentiumL1 Cache存储管理段式存储...
  • 计组第四章-存储系统

    2017-12-11 23:18:32
    1 工作原理 2 地址映射 3 替换算法 4 主存与cache内容一致问题 5 Cache性能分析 虚拟存储器 外部存储器辅助存储器 1 存储系统概述1.1 层次结构速度由快到满,容量由大到小: CPU内部通用寄存器↓Cache...
  • ①“Cache+主存”的存储结构:主要目的是解决主存的工作速度问题; ②“主存+辅存”的虚拟存储结构:主要是解决主存的存储容量问题(可编程空间问题)。 ③在虚拟存储系统中,主存未命中的性能损失要远大于Cache系统...
  • 用户在对这两种数据库进行存取时,仍然需要明确数据的存储结构,指出存取路径。而后来出现关系数据库较好地解决了这些问题。  1970年,IBM研究员E.F.Codd博士在刊物《Communication of the ACM》上发表了一篇名...
  • 1.6.3 为程序对象提供持久性存储 13 1.6.4 提供高效查询处理的存储结构 13 1.6.5 提供备份与恢复 14 1.6.6 提供多用户界面 14 1.6.7 表示数据间复杂联系 14 1.6.8 确保完整性约束 14 ...
  • 事务处理原理 第2版

    热门讨论 2012-12-30 10:49:38
    可帮助读者理解事务处理系统的内部情况,并描述了它们的工作原理以及如何最佳地使用它们。包括应用服务器的体系结构、事务通信范式,以及事务故障和系统故障的恢复机制。  《事务处理原理(第2版)》第1版发行以来的...
  • 9.流水线周期及流水线执行时间计算...12.计算机层次存储结构 13.Cache基本概念 14.时间局部与空间局部(解决方案) 15.随机存储器与只读存储器 主存----编址 16.磁盘工作原理 17.计算...
  • 数据库系统基础:高级篇(第5版)(讲述数据库系统原理的经典教材) 基本信息 原书名: Fundamentals of Database Systems (5th Edition) 原出版社: Addison Wesley 作者: (美)Ramez Elmasri Shamkant B. Navathe [作...
  • 计算机体系结构试题及答案

    热门讨论 2009-11-18 14:15:01
    6.3.2 总线基本工作原理 6.3.3 总线使用 6.3.4 总线标准和实例 6.3.5 设备的连接 6.3.6 CPU与I/O处理的匹配 6.4 通道处理机 6.4.1 通道的作用和功能 6.4.2 通道的工作过程 6.4.3 通道种类 ...
  •  为了写好Windows操作系统的实现部分,《Windows操作系统原理》编写组对Windows2000/XT操作系统的体系结构的各个组成部分进行了近半年时间的分析和研讨。在微软美国总部,他们与该操作系统的多位主要开发人员就...
  • 10.2.3 分程序结构的存储管理 10.3 参数传递 10.3.1 传值 10.3.2 传地址 10.3.3 过程参数 10.4 过程调用、过程进入和过程返回 练习 第11章 代码优化 11.1 优化技术简介 11.2 局部优化 11.2.1 基本块的划分...
  • 相似搜索的工作原理:相似搜索工具可用于识别哪些候选要素与要匹配的一个或多个输入要素最相似(或最相异)。相似的基础是数值属性(感兴趣属性)的指定列表。如果指定了一个以上的要匹配的输入要素,相似将...
  • 计算机组成原理(2)-存储器

    千次阅读 2018-08-20 17:27:11
    存储器层次结构: 小结: (1)存储信息的最小单位是位。 (2)计算机中基本的数据单位是字节。 (3)计算机中最小的数据单位是位。 (4)计算机中最小的存储单元是字节(地址)。 位:有两个稳定的工作状态,...
  •  数据的独立包括数据库中数据库的逻辑结构和应用程序相互独立,也包括数据物理结构的变化不影响数据的逻辑结构。  (4)数据实现集中控制。  文件管理方式中,数据处于一种分散的状态,不同的用户或同一用户在...
  • 编译原理(第2版)课件

    热门讨论 2009-03-28 15:27:49
    10.2.3 分程序结构的存储管理 10.3 参数传递 10.3.1 传值 10.3.2 传地址 10.3.3 过程参数 10.4 过程调用、过程进入和过程返回 练习 第11章 代码优化 11.1 优化技术简介 11.2 局部优化 11.2.1 基本块的划分 11.2.2 ...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 215
精华内容 86
关键字:

层次性存储结构的工作原理