计系2复习(4)存储:磁盘存储与cache

目录

  • 前言
  • 磁盘存储
    • 磁盘容量
    • 磁盘读取速度
  • cache
    • 连续内存访问
  • SRAM与DRAM
  • 题目
    • 1
    • 2
    • 3
    • 4

前言

这一章节主要介绍两种存储器,磁盘和cache,其中磁盘用以存储大量静态数据,而cache是高速缓存,用于cpu快速读取数据。

复习完了 摸了

磁盘存储

懂的都懂

在这里插入图片描述
磁盘由多个盘片组成,而一个盘片往往有两个盘面,每个盘面又分为很多个磁道,每个磁道又分为很多个扇区。

计系2复习(4)存储:磁盘存储与cache_第1张图片

磁盘容量

因为磁盘的最小划分就是扇区,知晓了每个扇区的字节个数,就知晓了磁盘的容量了。公式如下:

容量 = 每扇区字节数目 * 每磁道扇区数目 * 每盘面磁道数目 * 每盘片盘面数目 * 磁盘盘片数目

注:一般的话, 每盘片盘面数目 = 2

计系2复习(4)存储:磁盘存储与cache_第2张图片

磁盘读取速度

磁盘读取速度主要由三个因素影响:

  1. 寻道时间:磁头由一个盘片移动到另一个盘片的时间
  2. 旋转时间:要读的扇区旋转到磁头下面所花费的时间
  3. 数据传输时间:传输每个扇区需要的时间

假设以ms为单位,那么有:

计系2复习(4)存储:磁盘存储与cache_第3张图片

cache

更加详细的版本【cache高速缓存 简单讲解与验证】

cache又名高速缓存,是因为数据局部性原理(即程序倾向于使用最近一段时间,地址和离最近一次寻址地址相近的数据)

因为相近地址的数据容易被使用,所以使用高速缓存,一次性缓存一块内存区域,下次cpu再请求数据的时候,先去缓存中找数据,有则hit,无则miss,读内存。

为什么内存不使用cache高速缓存?因为不同层次的缓存具有不同的造价和速度:

计系2复习(4)存储:磁盘存储与cache_第4张图片

连续内存访问

通常情况下,因为cache的存在,连续的内存访问(比如二维数组按先列后行访问)要比不连续的内存访问(比如二维数组按先行后列访问)来的要快。

SRAM与DRAM

SRAM只要有电就可以保持,而DRAM只能维持10-100ms,因此DRAM需要不断刷新以保持信息。

注:刷新DRAM即内存系统周期性的读取数据并且写回去。

计系2复习(4)存储:磁盘存储与cache_第5张图片

题目

1

假定一个磁盘存储器有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

2

以下不属于利用空间局部性的是 ?

A、连续以步长为1的引用模式访问数组元素。
B、连续1000次执行一段代码。
C、程序顺序执行。
D、依次访问结构体内的100个成员变量。

答:连续访问数组,顺序执行程序,顺序访问结构体变量,本质都是顺序读取内存。而执行1000次代码,不一定能够按照顺序读取内存指令或者数据,因为存在跳转语句或者是链表。所以选B

3

计系2复习(4)存储:磁盘存储与cache_第6张图片
答:

寻道时间 = 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

4

请分析以下代码是否局部性良好,并给出你的优化设计。请写出详细的分析过程。

#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顺序即可。

你可能感兴趣的:(计算机系统,缓存,cache,磁盘)