前两者之间通过系统总线连接;后两者通过存储器主线连接。在读写事务中,均是分三步完成。
目的是为了向操作系统隐蔽磁盘的结构复杂性。磁盘将其呈现为一个有B个扇区的逻辑块的序列;磁盘中有一个固件设备——磁盘控制器,维护者逻辑酷爱号和实际磁盘扇区之间的映射关系。操作系统是以逻辑块号为单位进行寻址操作的。
在每一层上,某种形式的逻辑必须管理缓存;可以是硬件也可以是硬件、软件的结合。
【理解:从高向低来看,M=2^m个地址平均分给S=2^s个组,每组获得2^(m-s)个地址,即(m-s)位;减去t位用于标记块,还有2^(m-t-s)个地址可以表示一个块,也就是说,一个块可以有2^(m-t-s)个字节的信息】 - 高速缓存的大小为C=SEB
【计算这样一个磁盘的容量。它有2个盘片,10 000个柱面,每条磁道平均有400个扇区,每个扇区平均有512个字节】 磁盘容量 = 512字节/扇区400扇区/磁道10 000磁道/表面2表面/盘片2盘片/磁盘 = 8 192 000 000 字节 = 8.192GB
【估计访问下面的一个磁盘上的一个扇区需要的时间(以ms为单位)。旋转速率:15000RPM;Taveseek = 8ms;每条磁道的平均扇区数:500】 访问时间 = Taveseek+Taverotation+Tavetransfer = 8ms+0.51/15000RPM60secs.min1000ms/s+1/15000RPM1/50060secs/min1000ms/s=8ms+2ms+0.008ms=10.008ms
【假设1MB的文件由512字节的逻辑块组成,存储在有如下特性的磁盘驱动器上(旋转速率:10 000RPM,Taveseek=5ms,平均扇区/磁道 = 1000)。
(1)最好的情况:给定逻辑块到磁盘扇区的最好的可能的映射(即,顺序的),估计读这个文件需要的最优时间
(2)随机的情况:如果块是随机地映射到磁盘扇区的,估计读这个文件需要的时间】
首先明确:1MB=2^20字节,即数据存储在2000个逻辑块中;对于磁盘,Taverotation=0.51/10000RPM60secs/1min*1000ms/s=3ms
则:(1)T=Taveseek+Taverotation+2Tmaxrotation=5ms+3ms+26ms=20ms
(2)在这种情况下,块被随机的映射到扇区上,读2000块的每一块都需要Taveseek+Tavgrotation=8ms。所以读这个文件的总时间为T = 8ms*2000=16000ms=16s
【改变下面函数中的循环顺序,使得它以步长为1的引用模式扫描三维数组a】
int sumarray3d(int a[N][N][N])
{
int i,j,k,sum=0;
for(i=0;i<N;i++)
{
for(j =0;j<N;j++)
{
for(k=0;k<N;k++)
{
sum+=a[k][i][j];
}
}
}
return sum;
}
只需要对三层嵌套循环体的顺序进行调整即可:
int sumarray3d(int a[N][N][N])
{
int i,j,k,sum=0;
for(i=0;k<N;i++)
{
for(j =0;i<N;j++)
{
for(k=0;j<N;k++)
{
sum+=a[k][i][j];
}
}
}
return sum;
}
【在前面dotprod的例子中,在我们对数组x做了填充之后,所有对x和y的引用的命中率是多少?】 在填充了之后,对于x和y数组,只有在引用第0个和第4个元素的时候发生不命中。因而命中率为75%
【一般而言,如果一个地址的高s位被用作组索引,那么存储块连续的片会映射到同一个高速缓存组。
1.每个这样连续的数组有片多少个块?
2.考虑下面的代码;它运行在一个高速缓存形式为(S,E,B,m)=(512,1,32,32)的系统上
int array[4096]
for(i=0;i<4096;i++)
sum+=array[i];
在任意时刻,存储在高速缓存中的数组块的最大数量是多少?】 1.2^t个块
【这道题揭示了我们为什么不用高s位做组索引;这样的话,前2^t个地址都映射到一个组中(详细解释见下)】
2.如果地址的前s=9位做组索引,那么之后的t=18位做标记位;高速缓存容量是512个32字节的块。数组只需要(4096*4)/32=512个块;这些块均会被映射到组0中(数组是连续存放的),因此,在任何时刻,高速缓存中只能保存一个数组块(尽管它的容量可以存放数组)。这样极大降低了高速缓存利用率。
有些系统也使用纠错码,其中计算机的字会被多编码几个位(例如,32位的字可能用38位来编码),这样一来,电路可以发现并纠正一个字中任何单个的错误位。 并不明白,这样前后有什么因果关系?
另一方面,因为sum是标量,对于sum来说,没有空间局部性。 为什么标量没有空间局部性(如果一个存储位置被引用了一次,那么程序很可能在不远的将来被引用附近的一个存储器位置)
图6-20中
int sumaraycols(int a[M][N])
{
……
for(i=0;i<N;j++)
for(j=0;j<M;j++)
sum+=a[i][j];
……
}
这里,为什么是"i<N","j<M"?是不是应该对调一下变成"i<M","j<N"?
原文:http://www.cnblogs.com/lwr-/p/4908540.html