### 存贮层次模拟器(命中率的实验原代码) #### 概述 该段代码主要实现了一个简单的缓存模拟器,用以演示在给定的一组数据访问序列(即地址流)下,如何计算Cache-主存层级结构中的命中率。其中采用的是FIFO(First In First Out)替换策略,即当缓存块已满时,最先加入缓存的块将被替换出去。 #### 代码解析 1. **头文件与宏定义**:首先引入了必要的标准库`stdio.h`与`stdlib.h`,接着通过宏定义设定了内存大小`mSIZE`为3以及进程请求序列长度`pSIZE`为12。 ```c #include<stdio.h> #include<stdlib.h> #definemSIZE3 #definepSIZE12 ``` 2. **静态数组初始化**:接着定义了一个大小为`mSIZE`的静态数组`memery`用于模拟缓存,并且初始化为空;另一个静态数组`process`则代表了一组连续的进程请求序列,包含了一系列需要访问的数据块编号。 ```c staticintmemery[mSIZE]={0}; staticintprocess[pSIZE]={1,2,3,4,1,2,5,1,2,3,4,5}; ``` 3. **主函数与FIFO函数**:`main()`函数作为程序入口,调用了`FIFO()`函数来执行FIFO算法。`FIFO()`函数是核心逻辑所在,它通过循环遍历所有进程请求并更新缓存状态,以此来模拟实际的缓存命中情况。 ```c intmain() { getchar(); printf("\n(FIFO)\tcount\n"); FIFO(); system("PAUSE"); return0; } voidFIFO() { //...FIFO算法实现... } ``` 4. **FIFO算法实现**:FIFO()函数内部实现主要包括: - 使用两个数组`time`和`memery`分别记录每个缓存块的时间戳(即最近被访问的时间)和存储的数据块编号。 - 遍历所有进程请求序列`process`,对于每一个请求: - 如果请求的数据块不在缓存中,需要替换缓存中的一个数据块以放入新的数据块; - 如果请求的数据块已经在缓存中,则更新其时间戳并统计命中次数。 ```c voidFIFO() { inttime[mSIZE]={0}; inti=0,j=0; intm=-1,n=-1; intmax=-1,maxtime=0; intcount=0; for(i=0;i<pSIZE;i++) { for(j=0;j<mSIZE;j++) { if(memery[j]==0) { m=j; break; } } for(j=0;j<mSIZE;j++) { if(memery[j]==process[i]) { n=j; } } for(j=0;j<mSIZE;j++) { if(time[j]>maxtime) { maxtime=time[j]; max=j; } } if(n==-1) // 缓存未命中 { if(m!=-1) { memery[m]=process[i]; // 找到空闲位置 time[m]=0; for(j=0;j<=m;j++) { time[j]++; } m=-1; } else { memery[max]=process[i]; // 替换最老的数据块 time[max]=0; for(j=0;j<mSIZE;j++) { time[j]++; } max=-1; maxtime=0; count++; // 更新未命中的计数 } } else // 缓存命中 { memery[n]=process[i]; for(j=0;j<mSIZE;j++) { time[j]++; } n=-1; } for(j=0;j<mSIZE;j++) { printf("%d",memery[j]); } printf("\t%d\n",count); } } ``` 5. **其他函数**:除了`FIFO()`外,还定义了一个`get()`函数,但并未在`main()`函数中调用,因此可以认为是调试或测试用途。 ```c get() { intw[12]={1,2,3,4,1,2,5,1,2,3,4,5}; inti,n; for(i=0;i<12;i++) { printf("%d",w[i]); } } ``` #### 结论 本实验代码通过模拟简单的FIFO缓存替换策略,展示了如何在给定一组数据访问序列的情况下,计算缓存命中率的过程。通过对代码的分析可知,当请求序列中出现的数据块不在缓存中时,系统会根据FIFO原则替换掉缓存中的某个数据块以存放新数据,从而保持缓存的有效性。此过程有助于理解计算机体系结构中缓存管理的基本原理和实现机制。
#include <stdlib.h>
#define mSIZE 3//分配三个内存页块
#define pSIZE 12//总共12个进程
static int memery[mSIZE] = {0};
static int process[pSIZE] = {1,2,3,4,1,2,5,1,2,3,4,5};//页面访问序列
void FIFO();
int main()
{
getchar();
printf("\n(FIFO)\tcount\n");
FIFO();
system("PAUSE");
return 0;
}
get()
{
int w[12]={1,2,3,4,1,2,5,1,2,3,4,5};
int i,n;
for(i=0;i<12;i++)
{
printf("%d ",w[i]);
}
}
void FIFO()
{
int time[mSIZE] = {0};
int i = 0, j = 0;
int m = -1, n = -1;
- 粉丝: 1
- 资源: 2
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助