计算机系统结构课程实验报告实验一:存贮层次模拟器

合集下载

计算机体系结构实验报告

计算机体系结构实验报告

计算机体系结构实验报告实验目的:1.掌握计算机体系结构的基本概念和组成部分2.学会使用模拟器对计算机性能进行测试和优化3.理解计算机指令的执行过程和流水线工作原理4.掌握计算机性能指标的测量方法和分析技巧实验材料和工具:1.一台个人电脑2.计算机体系结构模拟器3.实验指导书和实验报告模板实验步骤:1.搭建计算机系统:根据实验指导书提供的指导,我们搭建了一个简单的计算机系统,包括中央处理器(CPU)、内存和输入输出设备。

2.编写测试程序:我们编写了一段简单的测试程序,用于测试计算机系统的性能。

3.运行测试程序:我们使用模拟器运行测试程序,并记录测试结果。

模拟器可以模拟计算机的执行过程,并提供各种性能指标的测量功能。

4.分析和优化:根据测试结果,我们对计算机系统的性能进行分析,并尝试优化系统设计和测试程序,以提高性能。

实验结果:通过测试程序的运行和性能指标的测量,我们得到了如下结果:1.计算机的时钟频率:根据模拟器显示的结果,我们得知计算机的时钟频率为1000MHz。

2. 指令执行时间:我们计算了测试程序的平均执行时间,得到了结果为5ms。

4.流水线效率:我们通过模拟器提供的流水线分析功能,得到了计算机流水线的平均效率为80%。

实验分析:根据测试结果1.提高时钟频率:通过增加时钟频率可以加快计算机的运行速度。

我们可以尝试调整计算机硬件的设计和制造工艺,提高时钟频率。

2.优化指令执行过程:我们可以通过优化指令的执行过程,减少执行时间。

例如,并行执行多个指令、增加指令缓存等。

3.提高流水线效率:流水线是提高计算机性能的关键技术,我们可以通过增加流水线级数和优化流水线结构,提高流水线效率。

4.增加并行计算能力:并行计算是提高计算机性能的重要途径,我们可以尝试增加计算机的并行计算能力,例如增加处理器核心的数量。

实验总结:通过本次实验,我们深入了解了计算机体系结构的工作原理和性能指标。

通过模拟器的使用,我们学会了对计算机性能进行测试和进行性能优化的方法。

北邮计算机系统结构实验报告-实验一到五-WINDLX模拟器

北邮计算机系统结构实验报告-实验一到五-WINDLX模拟器

北京邮电大学实验报告课程名称计算机系统结构计算机学院03班王陈(11)目录实验一WINDLX模拟器安装及使用......................................... 错误!未定义书签。

·实验准备................................................................................ 错误!未定义书签。

·实验环境................................................................................ 错误!未定义书签。

·实验步骤................................................................................ 错误!未定义书签。

·实验内容及要求.................................................................... 错误!未定义书签。

·实验过程............................................................................. 错误!未定义书签。

·实验总结............................................................................. 错误!未定义书签。

实验二指令流水线相关性分析 ............................................... 错误!未定义书签。

·实验目的............................................................................. 错误!未定义书签。

计算机组成原理实验报告_存储系统设计实验

计算机组成原理实验报告_存储系统设计实验

实验四存储系统设计实验一、实验目的本实训项目帮助大家理解计算机中重要部件—存储器,要求同学们掌握存储扩展的基本方法,能设计MIPS 寄存器堆、MIPS RAM 存储器。

能够利用所学习的cache 的基本原理设计直接相联、全相联,组相联映射的硬件cache。

二、实验原理、内容与步骤实验原理、实验内容参考:1、汉字字库存储芯片扩展设计实验1)设计原理该实验本质上是8个16K×32b 的ROM 存储系统。

现在需要把其中一个(1 号)16K×32b 的ROM 芯片用4个4K×32b 的芯片来替代,实际上就是存储器的字扩展问题。

a) 需要4 片4个4K×32b 芯片才可以扩展成16K×32b 的芯片。

b) 目标芯片16K个地址,地址线共14 条,备用芯片12 条地址线,高两位(分线器分开)用作片选,可以接到2-4 译码器的输入端。

c) 低12 位地址直接连4K×32b 的ROM 芯片的地址线。

4个芯片的32 位输出直接连到D1,因为同时只有一个芯片工作,因此不会冲突。

芯片内数据如何分配:a) 16K×32b 的ROM 的内部各自存储16K个地址,每个地址里存放4个字节数据。

地址范围都一样:0x0000~0x3FFF。

b) 4个4K×32b 的ROM,地址范围分别是也都一样:0x000~0xFFF,每个共有4K个地址,现在需要把16K×32b 的ROM 中的数据按照顺序每4个为一组分为三组,分别放到4个4K×32b 的ROM 中去。

HZK16_1 .txt 中的1~4096个数据放到0 号4K 的ROM 中,4097~8192 个数据放到 1 号4K 的ROM 中,8193~12288 个数据放到2 号4K 的ROM 中,12289~16384个数据放到3 号4K 的ROM 中。

c) 注意实际给的16K 数据,倒数第二个4K(8193~12288 个数据)中部分是0,最后4K(12289~16384 数据)全都是0。

系统结构 第一、二次试验报告

系统结构 第一、二次试验报告

实验一熟悉模拟器WinDLX的使用一、实验目的1. 熟练掌握WinDLX模拟器的操作和使用,熟悉DLX指令集结构及其特点。

2. 加深对计算机流水线基本概念的理解。

3.了解DLX基本流水线各段的功能以及基本操作。

二、实验平台WinDLX模拟器三、实验任务用WinDLX模拟器执行下列两个程序:求阶乘程序求最大公倍数程序分别以步进、连续、设置断点的方式运行程序,观察程序在流水线中的执行情况,观察CPU中寄存器和存储器的内容。

熟练掌握WinDLX的操作和使用。

1.用WinDLX模拟器执行求阶乘程序(1)用WinDLX模拟器执行求阶乘程序。

这个程序说明浮点指令的使用。

该程序从标准输入读入一个整数,求其阶乘,然后将结果输出。

该程序中调用了中的输入子程序,这个子程序用于读入正整数。

(2)输入数据“3”,采用单步执行方法,完成程序并通过使用WinDLX,总结WinDLX的特点。

(3)注意观察变量说明语句所建立的数据区,理解WinDLX指令系统。

(4)分别以步进、连续、设置断点的方式运行程序,观察程序在流水线中的执行情况,观察CPU中寄存器和存储器的内容。

熟练掌握WinDLX的操作和使用。

2.用WinDLX模拟器求最大公约数程序(1)用WinDLX模拟器执行程序。

该程序从标准输入读入两个整数,求他们的greatest common measure,然后将结果写到标准输出。

该程序中调用了中的输入子程序。

(2)给出两组数6、3和6、1,采用单步和连续混合执行的方法完成程序,注意中间过程和寄存器的变化情况,观察流水线工作情况。

然后单击主菜单上的execute/display dlx-i/o,观察结果。

(3 ) 分别以步进、连续、设置断点的方式运行程序,观察程序在流水线中的执行情况,观察CPU中寄存器和存储器的内容。

实验结果:1、(1)导入和代码(2)单步执行流水线:寄存器的值:由图可知:PC寄存器中存放下一条要执行的语句的地址,IMAR中存放当前执行的语句的地址。

模拟储存技术实验报告

模拟储存技术实验报告

一、实验目的1. 了解模拟存储技术的概念和原理;2. 掌握模拟存储器的基本结构和功能;3. 通过实验验证模拟存储技术的性能特点;4. 分析模拟存储技术在现代计算机系统中的应用。

二、实验环境1. 实验平台:PC机2. 实验软件:C++ Builder3. 实验工具:Visual Studio三、实验原理模拟存储技术是一种在计算机系统中实现存储器虚拟化的技术。

通过模拟存储器,计算机可以实现对物理存储器的高效管理和利用。

模拟存储技术主要包括以下几种:1. 虚拟存储器:通过将物理内存和硬盘存储空间结合起来,实现大容量内存的模拟;2. 页面置换算法:根据页面访问的频率和顺序,选择合适的页面进行置换,以提高内存利用率;3. 快速缓存:通过将频繁访问的数据存储在快速缓存中,减少对物理内存的访问次数。

四、实验内容1. 模拟存储器的基本结构设计(1)设计模拟存储器的基本结构,包括物理内存、硬盘存储空间、虚拟内存和页面置换算法等模块;(2)实现模拟存储器的初始化、数据读写、页面置换等功能。

2. 页面置换算法的实现(1)实现三种页面置换算法:FIFO、LRU和OPT;(2)对每种算法进行性能分析,包括缺页率和页面命中率等指标。

3. 快速缓存的设计与实现(1)设计快速缓存的结构,包括缓存大小、替换策略等;(2)实现快速缓存的数据读写、替换等功能。

4. 模拟存储技术的应用实例(1)模拟一个简单的计算机系统,包括CPU、内存、硬盘等模块;(2)在计算机系统中应用模拟存储技术,实现虚拟内存和快速缓存等功能;(3)通过实验验证模拟存储技术在计算机系统中的应用效果。

五、实验步骤1. 设计模拟存储器的基本结构,实现初始化、数据读写、页面置换等功能;2. 实现三种页面置换算法:FIFO、LRU和OPT,并分析其性能;3. 设计快速缓存的结构,实现数据读写、替换等功能;4. 模拟一个简单的计算机系统,应用模拟存储技术,实现虚拟内存和快速缓存等功能;5. 对实验结果进行分析,总结模拟存储技术的性能特点和应用效果。

存贮模型的实验报告

存贮模型的实验报告

一、实验目的1. 了解存贮模型的基本原理和类型;2. 掌握不同存贮模型的计算方法和应用;3. 分析存贮模型在实际问题中的应用效果。

二、实验内容1. 基础存贮模型2. 概率约束存贮模型3. 现金管理存贮模型4. 多重存贮模型三、实验方法1. 阅读相关理论书籍和文献,了解存贮模型的基本概念和原理;2. 利用计算机软件进行模型的构建和求解;3. 分析实验结果,验证模型的有效性。

四、实验步骤1. 基础存贮模型(1)根据实验需求,确定需求量、生产准备费、贮存费等参数;(2)利用软件构建基础存贮模型;(3)进行模型求解,计算总费用和每日平均费用;(4)分析结果,验证模型的有效性。

2. 概率约束存贮模型(1)根据实验需求,确定需求量、交货次数、交货时间等参数;(2)利用软件构建概率约束存贮模型;(3)进行模型求解,计算最优储备量;(4)分析结果,验证模型的有效性。

3. 现金管理存贮模型(1)根据实验需求,确定日净现金流、平均期限、现金兑换费用等参数;(2)利用软件构建现金管理存贮模型;(3)进行模型求解,确定最优现金储备策略;(4)分析结果,验证模型的有效性。

4. 多重存贮模型(1)根据实验需求,确定感觉记忆、短时记忆和长时记忆的参数;(2)利用软件构建多重存贮模型;(3)进行模型求解,分析信息在各个阶段的加工过程;(4)分析结果,验证模型的有效性。

五、实验结果与分析1. 基础存贮模型实验结果显示,在给定的参数条件下,模型计算出的总费用和每日平均费用与实际情况相符,验证了基础存贮模型的有效性。

2. 概率约束存贮模型实验结果显示,在给定的参数条件下,模型计算出的最优储备量与实际情况相符,验证了概率约束存贮模型的有效性。

3. 现金管理存贮模型实验结果显示,在给定的参数条件下,模型计算出的最优现金储备策略与实际情况相符,验证了现金管理存贮模型的有效性。

4. 多重存贮模型实验结果显示,模型能够较好地描述信息在感觉记忆、短时记忆和长时记忆三个阶段的加工过程,验证了多重存贮模型的有效性。

计算机网络体系结构实验报告-存储器实验

计算机网络体系结构实验报告-存储器实验

存储器实验报告一、实验箱实验部分1.实验目的:(1)理解随机静态存储的原理(2)熟悉实验箱的静态存储操作以及电路的搭建方式2.实验设备:TD-CMA实验箱3.实验过程(1)按照电路图连接好电路(2)进行实验操作:预备操作①时序与操作台单元的KK1、KK3置“运行”档,KK2置为“单步”档;②将CON单元的IOR开关置1(IN单元无输出,避免总线竞争),然后再打开电源开关,如果听到有长鸣的“嘀”声,说明总线竞争,需要立即关闭电源,检查连线;③按动CON单元CLR按钮,将运算器当前数据(例如:寄存器A、B及FC、FZ)清零;设置存储地址①关闭存储器读写数据信号:WR、RD;②设置数据送到存储器地址线:IOR置0;③IN单元D7…D0形成一个8位二进制数地址,设置地址输入控制信号LDAR,将选取一个指定的地址单元,按动ST产生T3脉冲,指定地址被放入地址寄存器(AR)中;向(从)指定的地址单元存(取)数据①存即写数据:IN单元D7…D0形成一个数据,设置数据写入控制信号IOR=1、WR=1、RD=0,按动ST产生T3脉冲,数据存入指定的存储单元中;②取即读数据:设置数据写入控制信号IOR=1、WR=0、RD=1,数据总线上的数据即为从指定的存储单元中取出的数据。

4.结果描述:(1)将8位数据存入指定的地址后,将WR置零,RD置1,可以看到数据显示。

(2)地址和数据的区别:地址和数据都为二进制数据,地址是了数据放置的位置,根据选择不同的地址可以看到存储在不同地址的不同数据。

(3)读写逻辑的转换过程:先选取地址,设定数据存入该地址,再选取地址读取数据、(4)位扩展和字扩展原理图如下:二、存储器仿真实验部分1.实验目的:(1) 理解存储器的功能。

(2) 掌握运用Proteus 软件设计ROM 和RAM 的方法。

(3) 基于Proteus 仿真工具掌握存储器与总线的连接及存储器地址空间映射的原理。

(4) 通过8 位字长的存储器电路,实现对ROM 和RAM 存储器的数据读写操作。

北邮计算机系统结构实验报告实验一到五WINDLX模拟器

北邮计算机系统结构实验报告实验一到五WINDLX模拟器

北京邮电大学实验报告课程名称计算机系统结构计算机学院 201班王陈(2016110711)目录实验一 WINDLX模拟器安装及使用 (2)·实验准备............................................................................. 错误!未定义书签。

·实验环境............................................................................. 错误!未定义书签。

·实验步骤............................................................................. 错误!未定义书签。

·实验内容及要求................................................................. 错误!未定义书签。

·实验过程............................................................................. 错误!未定义书签。

.实验总结 (6)实验二指令流水线相关性分析 (6).实验目的 (7).实验环境 (7).实验步骤 (7)·实验过程............................................................................. 错误!未定义书签。

.实验总结 (12)实验三DLX处理器程序设计 (13).实验目的 (13)·实验环境............................................................................. 错误!未定义书签。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机系统结构课程实验报告实验一:存贮层次模拟器计算机系统结构课程实验报告2012—2013 学年第 1 学期学生姓名: 学生班级: 2011179 学生学号: 2011179 指导教师: 孙全红教研室: 计算机系统结构教研室2012年 10月 23日实验一:存贮层次模拟器一、实验目的与要求使学生清楚认识虚拟存贮层次结构,熟练掌握常用的几种存储地址映象与变换方法,以及FIFO、LRU等替换算法的工作全过程。

要求用程序实现任意地址流在存储层次上的命中情况,实验结束后提交源程序和实验说明书。

二、实验内容在模拟器上实现在任意地址流下求出在cache —主存—辅存三层存贮层次上的命中率。

三、实验步骤1(Cache—主存:映像方式可以选择全相联、直接映象、组相联方式;替换算法一般使用LRU算法。

2(要求Cache大小、主存容量、块大小以及组数等可以输入修改。

3(求出命中率;显示替换的全过程;任选一种高级语言来做。

4(要有简洁、易于操作的界面。

四、程序源代码# include <stdio.h># include <iostream.h># include <stdlib.h>struct CacheStruct{int blocknum;int count;};void All_LinkLRU(CacheStruct cs[],int bottom,int stream[],int k,int result[20][20]){int j=0,m=0,max=0,location=0,hitnum=0;cout<<endl;//cout<<"主存访问块流"<<" "<<"是否替换"<<" "<<"是否命中"<<""<<"Cache块存放情况"<<endl;for(int i=0;i<k;i++){if(j<bottom)//Cache块不满{m=0;if(j==0){cs[j].blocknum=stream[i];cs[j].count=0;result[j][i]=stream[i];//result[bottom][i]=0;//result[bottom+1][i]=0;不需要/*cout<<stream[i]<<"\t\t";cout<<"块失效\t\t";cout<<"未命中\t\t";for(int t=0;t<bottom;t++){if(cs[t].blocknum!=-1)cout<<cs[t].blocknum<<' ';elsecout<<"空 ";}cout<<endl;*/j++;// continue;}else{while(m<j && cs[m].blocknum!=stream[i]) {cs[m].count++;m++;}if(m==j)//已存在的未命中{cs[j].blocknum=stream[i];cs[j].count=0;result[j][i]=stream[i];//result[bottom][i]=0;// result[bottom+1][i]=0;不需要/*cout<<stream[i]<<"\t\t"; cout<<"块失效\t\t";cout<<"未命中\t\t";for(int t=0;t<bottom;t++) {if(cs[t].blocknum!=-1)cout<<cs[t].blocknum<<' '; elsecout<<"空 ";}cout<<endl;*/j++;// continue;}else//已存在的命中了{cs[m].count=0;m++;result[bottom+1][i]=0;/*cout<<stream[i]<<"\t\t"; cout<<"无替换\t\t";cout<<"命中\t\t";for(int t=0;t<bottom;t++) {if(cs[t].blocknum!=-1) cout<<cs[t].blocknum<<' '; elsecout<<"空 ";}cout<<endl;*/if(m!=j){while(m<j){cs[m].count++;m++;}}hitnum++;// continue;}}}else//Cache块满了{m=0;max=0;location=0;while(m<bottom && cs[m].blocknum!=stream[i]) {cs[m].count++;if(cs[m].count>max){location=m;max=cs[m].count;}m++;}if(m==bottom)//未命中,所有块计数器都已加1,{result[bottom][i]=cs[location].blocknum;/*cout<<stream[i]<<"\t\t";cout<<"替换块"<<cs[location].blocknum<<"\t\t"; cout<<"未命中\t\t";*/cs[location].blocknum=stream[i];cs[location].count=0;result[location][i]=stream[i]; /* for(int t=0;t<bottom;t++) {if(cs[t].blocknum!=-1)cout<<cs[t].blocknum<<' '; elsecout<<"空 ";}cout<<endl;*/}else//命中,{result[bottom+1][i]=0;/*cout<<stream[i]<<"\t\t"; cout<<"无替换\t\t";cout<<"命中\t\t";*/cs[m].count=0;m++;if(m!=bottom){while(m!=bottom){cs[m].count++;m++;}}/*for(int t=0;t<bottom;t++) {if(cs[t].blocknum!=-1)cout<<cs[t].blocknum<<' '; elsecout<<"空 ";}cout<<endl;*/hitnum++;}}if(i<k-1){for(int r=0;r<bottom;r++) result[r][i+1]=result[r][i]; }}cout<<"块地址流 ";for(int t=0;t<k;t++)cout<<stream[t]<<"\t";cout<<endl<<"\t";for(t=0;t<(bottom+2);t++){cout<<endl<<"\t";for(int s=0;s<k;s++){if(t<bottom){if(result[t][s]==-1)cout<<"空\t";elsecout<<result[t][s]<<"\t";}else if(t==bottom){if(result[t][s]!=-1)//块替换cout<<"替换块"<<result[t][s]<<"\t"; else{if(result[t+1][s]!=-1)//块命中cout<<"无替换\t";elsecout<<"块失效\t";}}else{if(result[t][s]!=-1)//命中cout<<"命中\t";elsecout<<"未命中\t";}}cout<<endl;}cout<<endl;if(hitnum!=0){cout<<"采用全相联地址映射方式访问Cache的命中率为:"<<hitnum<<'/'<<k<<endl;}else{cout<<"采用全相联地址映射方式访问Cache的命中率为:0"<<endl;}}void Direct_link(CacheStruct cs[],int bottom,int stream[],int k,int result[20][20]){// cout<<"主存访问块流"<<" "<<"是否替换"<<" "<<"是否命中"<<" "<<"Cache块存放情况"<<endl;int location=-1,hitnum=0,m=0;for(int i=0;i<k;i++){location=stream[i]%bottom;if(cs[location].blocknum!=-1)//若产生冲突{if(cs[location].blocknum==stream[i])//若命中{result[bottom+1][i]=0;/*cout<<stream[i]<<"\t\t";cout<<"无替换\t\t";cout<<"命中\t\t";for(int t=0;t<bottom;t++){if(cs[t].blocknum!=-1)cout<<cs[t].blocknum<<' ';elsecout<<"空 ";}cout<<endl;*/hitnum++;//continue;}else{result[bottom][i]=cs[location].blocknum;/* cout<<stream[i]<<"\t\t";cout<<"替换块"<<cs[location].blocknum<<"\t\t"; cout<<"未命中\t\t";*/cs[location].blocknum=stream[i];result[location][i]=stream[i];// cs[location].count=0;/*for(int t=0;t<bottom;t++){if(cs[t].blocknum!=-1)cout<<cs[t].blocknum<<' ';elsecout<<"空 ";}cout<<endl;*/}}else//不产生冲突,仅是页面失效{cs[location].blocknum=stream[i]; result[location][i]=stream[i]; /* cout<<stream[i]<<"\t\t";cout<<"块失效\t\t";cout<<"未命中\t\t";for(int t=0;t<bottom;t++){if(cs[t].blocknum!=-1)cout<<cs[t].blocknum<<' ';elsecout<<"空 ";}cout<<endl;*/}if(i<k-1){for(int r=0;r<bottom;r++)result[r][i+1]=result[r][i];}}cout<<"块地址流 ";for(int t=0;t<k;t++)cout<<stream[t]<<"\t";cout<<endl<<"\t";for(t=0;t<(bottom+2);t++){cout<<endl<<"\t";for(int s=0;s<k;s++){if(t<bottom){if(result[t][s]==-1)cout<<"空\t";elsecout<<result[t][s]<<"\t";}else if(t==bottom){if(result[t][s]!=-1)//块替换cout<<"替换块"<<result[t][s]<<"\t"; else{if(result[t+1][s]!=-1)//块命中cout<<"无替换\t";elsecout<<"块失效\t";}}else{if(result[t][s]!=-1)//命中cout<<"命中\t";elsecout<<"未命中\t";}}cout<<endl;}cout<<endl;if(hitnum!=0){cout<<"采用直接地址映射方式访问Cache的命中率为:"<<hitnum<<'/'<<k<<endl;}else{cout<<"采用直接地址映射方式访问Cache的命中率为:0"<<endl;}}void Group_link(CacheStruct cs[],int bottom,int stream[],int k,int Gblock,int result[20][20]){// cout<<"主存访问块流"<<" "<<"是否替换"<<" "<<"是否命中"<<" "<<"Cache块存放情况"<<endl;int Cgroupnum=bottom/Gblock,Mgroupnum=0,location=-1;int start=-1,end=-1,max=0,m=-1,find=0,hitnum=0;for(int i=0;i<k;i++){Mgroupnum=stream[i]/Gblock;location=Mgroupnum%Cgroupnum;start=location*Gblock;end=start+Gblock-1;location=-1;find=0;m=-1;max=0;//以下实现组内全相联for(int j=start;j<=end;j++){if(find==0 && cs[j].blocknum==-1){location=j;find=1;}if(cs[j].blocknum!=-1)cs[j].count++;if(cs[j].count>max){max=cs[j].count;m=j;}if(cs[j].blocknum==stream[i]) break;}if(j<=end)//命中{result[bottom+1][i]=0;/*cout<<stream[i]<<"\t\t"; cout<<"无替换\t\t";cout<<"命中\t\t";*/cs[j].count=0;if(j<end){j++;while(j<=end){if(cs[j].blocknum!=-1)cs[j].count++;j++;}}/* for(int t=0;t<bottom;t++) {if(cs[t].blocknum!=-1)cout<<cs[t].blocknum<<' ';elsecout<<"空 ";}cout<<endl;*/hitnum++;}else//未命中{if(location!=-1)//Cache有空余块{result[location][i]=stream[i]; /*cout<<stream[i]<<"\t\t";cout<<"块失效\t\t";cout<<"未命中\t\t";*/cs[location].blocknum=stream[i]; cs[location].count=0;/*for(int t=0;t<bottom;t++){if(cs[t].blocknum!=-1)cout<<cs[t].blocknum<<' ';elsecout<<"空 ";}cout<<endl;*/}else//替换{result[bottom][i]=cs[m].blocknum;/* cout<<stream[i]<<"\t\t";cout<<"替换块"<<cs[m].blocknum<<"\t\t"; cout<<"未命中\t\t";*/cs[m].blocknum=stream[i];cs[m].count=0;result[m][i]=stream[i];/* for(int t=0;t<bottom;t++){if(cs[t].blocknum!=-1)cout<<cs[t].blocknum<<' ';elsecout<<"空 ";}cout<<endl;*/}}if(i<k-1){for(int r=0;r<bottom;r++) result[r][i+1]=result[r][i]; }}cout<<"块地址流 ";for(int t=0;t<k;t++)cout<<stream[t]<<"\t";cout<<endl<<"\t";for(t=0;t<(bottom+2);t++) {cout<<endl<<"\t";for(int s=0;s<k;s++){if(t<bottom){if(result[t][s]==-1)cout<<"空\t";elsecout<<result[t][s]<<"\t";}else if(t==bottom){if(result[t][s]!=-1)//块替换cout<<"替换块"<<result[t][s]<<"\t"; else{if(result[t+1][s]!=-1)//块命中cout<<"无替换\t";elsecout<<"块失效\t";}}else{if(result[t][s]!=-1)//命中cout<<"命中\t";elsecout<<"未命中\t";}}cout<<endl;}cout<<endl;if(hitnum!=0){cout<<"采用组相联地址映射方式访问Cache的命中率为:"<<hitnum<<'/'<<k<<endl;}else{cout<<"采用组相联地址映射方式访问Cache的命中率为:0"<<endl;}}void main(){CacheStruct cs[100];int result[20][20];int stream[100];intCvolumn=0,Mvolumn=0,Blockvolumn=0,Mblocknum=0,Cblocknum=0,groupnum=0 ,k=0,type=-1,t=-1;char ch='y';while(ch=='y'||ch=='Y'){system("cls");k=0;type=-1;t=-1;for(int i=0;i<100;i++){cs[i].blocknum=-1;cs[i].count=0;}cout<<"请依次输入主存空间大小(MB),Cache空间大小(KB),分块大小(KB):"; cin>>Mvolumn>>Cvolumn>>Blockvolumn;/*问题改进:1.界面输入输出方式2.容量之间的关系3.*/while((Mvolumn*1024)%Blockvolumn!=0 || Cvolumn%Blockvolumn!=0){cout<<"主存空间大小与Cache空间大小应是块大小的整数倍~";cout<<"请依次输入主存空间大小(MB),Cache空间大小(KB),分块大小(KB):"; cin>>Mvolumn>>Cvolumn>>Blockvolumn;}Mblocknum=(Mvolumn*1024)/Blockvolumn;Cblocknum=Cvolumn/Blockvolumn;cout<<"请输入CPU访问主存块流:(-1结束输入)";cin>>t;while(t!=-1){if(t<0 || t>=Mblocknum){/* cout<<"输入的主存块地址号有误~请重新输入:";cin>>t;while(t<0 || t>=Mblocknum ||t==-1){if(t==-1)break;else{cout<<"输入的主存块地址号有误~请重新输入:"; cin>>t;}}if(t!=-1){stream[k]=t;k++;cin>>t;}*/cout<<"已跳过输入错误的无效的块地址~"; cin>>t;}else{stream[k]=t;k++;cin>>t;}}//完成result数组的初始化for(i=0;i<20;i++){for(int j=0;j<20;j++){result[i][j]=-1;}}cout<<"请输入地址映射方式:(1.全相联 2.直接映射 3.组相联)";cin>>type;switch(type){case 1:All_LinkLRU(cs,Cblocknum,stream,k,result);break;case 2:Direct_link(cs,Cblocknum,stream,k,result);break;case 3:{cout<<"请输入主存分组数:";cin>>groupnum;while(Mblocknum%groupnum!=0 || Cblocknum%(Mblocknum/groupnum)!=0)//输入的组数不能被整除{cout<<"输入主存分组数有误~请依据主存与Cache分块数确定合适的分组数:";cin>>groupnum;}Group_link(cs,Cblocknum,stream,k,Mblocknum/groupnum,result);}}cout<<"还要继续输入块地址流吗,(Y or N)";cin>>ch;}// All_LinkLRU(cs,Cblocknum,stream,k);//Direct_link(cs,Cblocknum,stream,k);/* cout<<"请输入主存分组数:";cin>>groupnum;Group_link(cs,Cblocknum,stream,k,Mblocknum/groupnum);}四、实验截图采用全相联映射方式:采用组相联映射方式:采用直接相联映射方式:五、实验总结通过上机操作,我掌握了常用的几种存储地址映象与变换方法即全相联映象方式,直接映象方式和组相联映象方式,并且认识了虚拟存贮层次结构,而且了解了FIFO、LRU等替换算法的工作全过程。

相关文档
最新文档