【计算机组成原理】:存储系统学习(上)

摘要:
因此,存储系统引入了缓存。早期的L2Cache位于主板上或与同一电路板上的CPU集成。Int为4字节,short为2字节,double为8字节,char为1字节。丢失将导致访问速度急剧下降。下图说明了组关联和其他两种方法之间的关系。加载16时,缓存已满。

一、程序的运行

冯诺依曼机的运行大致可分为两个步骤,存储程序和程序控制。具体而言,可分为以下步骤:

(1)输入设备将程序与数据写入内存;

(2)CPU取指令;

(3)CPU执行指令期间读数据;

(4)CPU写回运算结果;

(5)输出设备输出结果。


二、存储系统层次结构

由于CPU和主存的运行速度相差较大,程序运行的速度就会受制于内存的速度。于是,存储系统引入了高速缓存(Cache)。Cache的引入使得CPU访问到的存储系统具有Cache的速度,赋存的容量和价格。

image

同时,Cache又可以划分为L1 Cache和L2 Cache。其中L1 Cache集成在CPU中,分数据分数据Cache(D-Cache)和指令Cache(I-Cache)。早期L2 Cache在主板上或与CPU集成在同一电路板上。随着工艺的提高L2 Cache被集成在CPU内核中,不分D-Cache和I-Cache。

image


三、主存中的数据

数据存放在内存中,分为按边界存放和未按边界存放。

(1)按边界存放

按边界存放的方式,在32位系统中,存储单元为4个字节。int占4个字节,short占两个字节,double占8个字节,char占1个字节。会产生空间空余。

image

(2)未按边界存放

未按边界存放充分利用了空间,但是增加了内存的访问次数。如double类型的x,占了三个存储单元,需要访问三次。因此,这种方式虽然节省了空间,但增加了访问内存的次数。

image


四、主存中的数据组织

知道了数据在内存中的存放方式,具体到代码层面有什么影响呢?

如下两种结构体的写法:

struct S1{
    int i;
    char c;
    int j
}
struct S2{
    int i;
    int j
    char c;
}

在边界对齐的情况下,这些数据在内存中的存储如下图所示。可以看到S1的结构体写法占了12个字节,S2的结构体占了9个字节。但就一个结构体的数据而言,代码的写法确实可以节省空间。

image


五、Cache的基本原理

Cache主要是用来解决CPU与慢速的主存之间的速度差异。Cache的工作原理分为读操作和写操作。

(1)读操作

image

如果Cache中已经有了该数据,就直接读入,这个过程称为命中(HIT)。如果Cache中没有这个数据,就会从内存中读取一个数据块缓存到Cache中,接着从Cache中读取到CPU,这个过程称为缺失(MISS)。缺失会造成访问速度急剧下降。

(2)写操作

image

写操作有两种策略,写穿策略(WriteThrough)和写回策略(WriteBack)。写穿策略是CPU向Cache中写数据后,将Cache中的数据写入到主存。写回策略是CPU向Cache中写数据后,不向主存写入数据。写回策略速度很快,但是数据的更新没有刷新到主存。


六、Cache的地址映射机制

主存地址通常按照块地址进行划分,Cache地址通常按照行进行划分,主存块大小和Cache中的行大小相等。主存地址通常划分为三个部分,Tag用来判断该数据是否在Cache中,Index用来找Cache中对于的数据位,块内偏移用来查找对应数据。Cache的结构如下图所示,Tag与主存Tag一致,Data用来存储一行数据,Valid表示Cache中的数据是否有效,Dirty表示主存中的数据是否是最新的。

image

image

主存与Cache地址映射通常有三种方式,全相联(fully-associated)、直接相联(direct mapped)和组相联(set-associated)。

(1)全映射

主存地址变成二维(块号 块内地址),如地址61,二进制是00111101,将它划分为两部分 001111和01,其中001111是块号,01是块内地址。全映射的映射算法是主存的数据库可以映射到Cache的任意行,同时将该数据块地址对应行的标记存储体中保存。

image

全映射的过程如上图所示,若CPU的访问序列顺序为1F 20 24 1E。首先,对于1F地址,二进制为0001 1111,划分为二维后tag=000111,offset=11即第四哥单元。首先回判断tag为000111是否命中,一开始是缺失的,因此添加tag为000111的单元,并把有效位置为1,同时从主存中读取一个数据块1C 1D 1E 1F到Cache中。其中偏移地址为11的1F即可访问。20和24的访问同理可得。当访问到1E的时候,tag为000111的单元已经存在,此时是命中的状态,可以直接去除偏移为10的数据。

可以看到,全相联的映射Cache率很高,主存可以映射到Cache任意位置。同时,块冲突率低,淘汰算法复杂。因此,全映射算法适用于小容量Cache。

(2)直接映射

直接映射将主存地址从一维变成三维(区号、区内块号、块内地址),如地址61二进制为00111101,划分为000011 11 01。直接映射的映射算法是,假设Cache有n行,主存第j块号映射到Cache的行号为i=j mod n ,即内存的数据块映射到Cache的特定行。

image

直接映射的过程如上图所示,若访问顺序为1F 20 24 1E 44。首先对于1F,地址划分为tag=0000,index=111,offset=11。因此,1F这个数据块只能映射到第7行。 如果某一行中,已经有了数据,且tag不一致,那么就会发生碰撞。这种情况下就会覆盖掉原来的数据。

直接映射的特点是Cache的利用率低,只能映射到特定行中。块冲突率高,淘汰算法简单,适用于大容量的Cache。

(3)组相联映射

组相连映射把地址从一维变成三维(组号、组内块号、块内地址)。如地址61划分为0000111 1 01。组内映射算法是Cache共n组,主存第j块号映射到Cache 的组号为: i=j mod n 即主存的数据块映射到Cache特定组的任意行。

image

组相联映射会把数据映射到对应组的任意行,接着根据tag进行判断是否命中,如果该组已经满了,就会发生碰撞。组相联映射相当于全相联映射和直接映射的折中。下图说明了组相联与其它两种方式的关系。若Cache有8行,当组相联数k=8时,组相联就变成了全相联。当k=1时,就变成了直接相联。

image


七、替换算法

当程序运行一段时间后,Cache存储空间被占满,当再有新数据要调入时,就需要通过某种机制决定替换的对象。因此,就需要替换算法。常见的替换算法有:先进先出法(FIFO,First in First out),最不经常使用法(LFU,Least Frequently Used),近期最少使用法(LRU,Least recently Used),随机替换法。

(1)先进先出法(FIFO)

image

先进先出法,顾名思义就是当需要替换时,先被访问的最先被替换。如上图,22载入添加一个标记0,后面没载入一次标记+1,依次载入到22 11 19 7,其中22命中一次。当载入16时,Cache已经满了。这时候需要采用先进先出的替换算法,其中22是最先被载入的,因此替换22。

(2)最不经常使用法(LFU)

image

最不经常使用法,就是优先替换掉命中次数最少的行,如果命中次数相同,可以搭配其它替换策略,如FIFO。如上图,当载入4时,22的次数为2,11的次数为1,19和16的次数为0。因此替换掉先进来的19。同理,当载入3时,优先替换掉次数少且先进来的16。

(3)近期最少使用法(LRU)

image

近期最少使用法,就是优先替换掉很长一段时间没有命中的单元。每次载入,如果命中则标记清0,否则标记+1。如上图所示,当载入16时,优先替换标记最大的11,载入4时,优先替换最大的22。

免责声明:文章转载自《【计算机组成原理】:存储系统学习(上)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇linux下编译原理分析delphi 自我删除和线程池(1000行代码,需要仔细研究)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySQL学习随笔--通过实例理解merge ,temptable算法的差异

实例1 使用视图的两种算法merge和temptable分别统计 表tb_phone中market_price大于4000的手机,然后查询视图查找出小于6000的手机 简单总结最终获取的结果:查询出market_price大于4000且小于6000的手机 表数据: merge合并算法 合并的执行方式,每当执行的时候,先将视图的sql语句与外...

机器视觉与边缘计算:听课笔记

OpenVINO工具强大,使用有一定难度,需要一定基础:Python、机器学习基本算法等  云计算 与 边缘计算 边缘计算起源于传媒领域,是指在靠近物或数据源头的一侧,采用网络、计算、存储、应用核心能力为一体的开放平台,就近提供最近端服务。 其应用程序在边缘侧发起,产生更快的网络服务响应,满足行业在实时业务、应用智能、安全与隐私保护等方面的基本需求。 边...

数据阵列Raid5磁盘阵列知识

题记:写这篇博客要主是加深自己对数据阵列的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢。     盘磁阵列RAID5理原RAID5是用利奇偶验校算法对盘磁阵列数据行进冗余,许允在一块盘现出障故的情况下保障数据安全。即保障了阵列的读写效率,又可以勤俭企业本钱。奇偶验校算法理原:A值 B值 Xor结果 0 0 0 1 0 1 0 1 1 1...

算法概念、大O记号

算法定义:基于特定的计算类型,旨在解决某一信息处理问题而设计的一个指令序列算法需具备以下要素 输入与输出输入(input):对所求解问题特定实例的描述 输出(output):经计算和处理之后得到的信息,即针对输入问题实例的答案 确定性和可行性:算法应可描述为由若干语义明确的基本操作组成的指令序列,且每一基本操作在对应的计算模型中均可兑现。 有穷性...

Linux PCI网卡驱动的详细分析

学习应该是一个先把问题简单化,在把问题复杂化的过程。一开始就着手处理复杂的问题,难免让人有心惊胆颤,捉襟见肘的感觉。读Linux网卡驱动也是一 样。那长长的源码夹杂着那些我们陌生的变量和符号,望而生畏便是理所当然的了。不要担心,事情总有解决的办法,先把一些我们管不着的代码切割出去,留下必 须的部分,把框架掌握了,哪其他的事情自然就水到渠成了,这是笔者的心得...

逆向映射的演进

在此向郭大侠致敬。 一、前言 数学大师陈省身有一句话是这样说的:了解历史的变化是了解这门学科的一个步骤。今天,我把这句话应用到一个具体的Linux模块:了解逆向映射的最好的方法是了解它的历史。本文介绍了Linux内核中的逆向映射机制如何从无到有,如何从笨重到轻盈的历史过程,通过这些历史的演进过程,希望能对逆向映射有更加深入的理解。 二、基础知识 在切入逆向...