这一章节主要介绍两种存储器,磁盘和cache,其中磁盘用以存储大量静态数据,而cache是高速缓存,用于cpu快速读取数据。
复习完了 摸了
懂的都懂
磁盘由多个盘片组成,而一个盘片往往有两个盘面,每个盘面又分为很多个磁道,每个磁道又分为很多个扇区。
因为磁盘的最小划分就是扇区,知晓了每个扇区的字节个数,就知晓了磁盘的容量了。公式如下:
容量 = 每扇区字节数目 * 每磁道扇区数目 * 每盘面磁道数目 * 每盘片盘面数目 * 磁盘盘片数目
注:一般的话, 每盘片盘面数目 = 2
磁盘读取速度主要由三个因素影响:
假设以ms为单位,那么有:
更加详细的版本【cache高速缓存 简单讲解与验证】
cache又名高速缓存,是因为数据局部性原理(即程序倾向于使用最近一段时间,地址和离最近一次寻址地址相近的数据)
因为相近地址的数据容易被使用,所以使用高速缓存,一次性缓存一块内存区域,下次cpu再请求数据的时候,先去缓存中找数据,有则hit,无则miss,读内存。
为什么内存不使用cache高速缓存?因为不同层次的缓存具有不同的造价和速度:
通常情况下,因为cache的存在,连续的内存访问(比如二维数组按先列后行访问)要比不连续的内存访问(比如二维数组按先行后列访问)来的要快。
SRAM只要有电就可以保持,而DRAM只能维持10-100ms,因此DRAM需要不断刷新以保持信息。
注:刷新DRAM即内存系统周期性的读取数据并且写回去。
假定一个磁盘存储器有4个盘片,用于记录信息的柱面数为2000,每个磁道上有3000个扇区,每个扇区512B,则该磁盘存储器的容量约为____ ?
A、12MB
B、24MB
C、12GB
D、24GB
答:
容量 = 每扇区字节数目 * 每磁道扇区数目 * 每盘面磁道数目 * 每盘片盘面数目 * 磁盘盘片数目
= 512 Byte * 3000 * 2000 * 2 * 4 = 24576000000 Byte
= 24,000,000 K Byte
= 23437.5 MB
= 22.89 GB
约等于 24 GB
选D
以下不属于利用空间局部性的是 ?
A、连续以步长为1的引用模式访问数组元素。
B、连续1000次执行一段代码。
C、程序顺序执行。
D、依次访问结构体内的100个成员变量。
答:连续访问数组,顺序执行程序,顺序访问结构体变量,本质都是顺序读取内存。而执行1000次代码,不一定能够按照顺序读取内存指令或者数据,因为存在跳转语句或者是链表。所以选B
寻道时间 = 8ms
旋转时间 = (60/每分钟旋转圈数*1000) * 0.5
= (60 / 7200 * 1000) * 0.5
= 4.167 ms
数据传输时间 = (60/每分钟旋转圈数*1000) / 每磁道扇区数目
= (60 / 7200 * 1000) / 600
= 0.01389 ms
总时间 = 8 + 4.167 + 0.01389 = 12.18089 ms
请分析以下代码是否局部性良好,并给出你的优化设计。请写出详细的分析过程。
#define N 10000
typedef struct{
int LearningInvest[5];
int FunInvest[5];
}PersonalInvest;
PersonalInvest undergraduates[N];
void UpdateInvestment (PersonalInvest *p, int n)
{
int i, j;
for (j = 0; j < 5; j++){
for (i = 0; i < n; i++)
p[i].LearningInvest[j] +=1000;
for (i=0; i<n; i++)
p[i].FunInvest[j] +=500;
}
}
答:按先列后行顺序访问二维数组,才能连续的访问内存,所以交换循环的i,j顺序即可。