计算机系统体系结构实验
计算机组织与体系结构实验报告

《计算机组织与体系结构》实验报告学号: XXX姓名:XXX班级:XXX指导教师:XXX时间: 2013年01月中国矿业大学计算机学院目录一基本运算器实验 (2)1、实验目的 (2)2、实验设备 (2)3、实验原理 (2)4、实验步骤 (3)5、实验结果 (5)5、实验体会 (5)二微程序控制实验 (6)1、实验目的 (6)2、实验设备 (6)3、实验原理 (6)4、实验步骤 (12)5、实验体会 (13)三CPU与简单模型机设计实验 (13)1、实验目的 (13)2、实验设备 (13)3、实验原理 (13)4、实验步骤 (18)5、实验流图 (21)6、实验体会 (25)实验一基本运算器实验1. 实验目的(1) 了解运算器的组成结构。
(2) 掌握运算器的工作原理。
2. 实验设备PC机一台,TD-CMA实验系统一套。
3.实验原理本实验的原理如下图所示:运算器内部含有三个独立运算部件,分别为算术、逻辑和移位运算部件,要处理的数据存于暂存器A和暂存器B,三个部件同时接受来自A和B的数据(有些处理器体系结构把移位运算器放于算术和逻辑运算部件之前,如ARM),各部件对操作数进行何种运算由控制信号S3…S0和CN来决定,任何时候,多路选择开关只选择三部件中一个部件的结果作为ALU的输出。
如果是影响进位的运算,还将置进位标志FC,在运算结果输出前,置ALU零标志。
ALU中所有模块集成在一片FPGA中。
逻辑运算部件由逻辑门构成,较为简单,而后面又有专门的算术运算部件设计实验,在此对这两个部件不再赘述。
移位运算采用的是桶形移位器,一般采用交叉开关矩阵来实现,交叉开关的原理如图1-1-2所示。
图中显示的是一个4X4的矩阵(系统中是一个8X8的矩阵)。
每一个输入都通过开关与一个输出相连,把沿对角线的开关导通,就可实现移位功能,即:(1) 对于逻辑左移或逻辑右移功能,将一条对角线的开关导通,这将所有的输入位与所使用的输出分别相连,而没有同任何输入相连的则输出连接0。
计算机系统结构实验报告

计算机系统结构实验报告实验目的:掌握计算机系统的基本结构和工作原理,了解计算机系统的组成部分及其相互关系。
实验仪器和材料:计算机硬件设备(主机、硬盘、内存、显卡等)、操作系统、实验指导书、实验报告模板。
实验原理:实验步骤:1.搭建计算机硬件设备,将主机、硬盘、内存、显卡等组装连接好。
2. 安装操作系统,如Windows、Linux等。
3.启动计算机,进入操作系统界面。
4.打开任务管理器,查看CPU的使用情况。
5.打开任务管理器,查看内存的使用情况。
6.运行一些应用程序,观察CPU和内存的使用情况。
7.尝试使用输入输出设备,如键盘、鼠标等。
实验结果:通过实验,我们可以观察到计算机系统的硬件部分和软件部分的工作情况。
通过任务管理器,我们可以查看到CPU的使用情况和内存的使用情况。
在运行应用程序时,我们可以观察到CPU和内存的使用情况的变化。
通过使用输入输出设备,我们可以与计算机进行交互操作。
实验分析:从实验结果可以看出,计算机系统的硬件部分和软件部分都是相互关联的。
CPU作为计算机的核心部件,负责执行各种指令,通过数据传输和计算来完成各种操作。
而内存则用于存储数据和程序,通过读写操作来完成对数据的处理。
硬盘则用于长期存储数据。
操作系统则是计算机系统的管理者,通过调度CPU和内存的使用来实现对计算机资源的分配。
结论:计算机系统是由硬件和软件部分组成的,其中硬件部分包括CPU、内存、硬盘等,软件部分包括操作系统、应用程序等。
计算机系统通过CPU 的运算和数据传输来实现各种操作。
通过实验,我们可以观察到计算机系统的工作情况,并深入了解计算机系统的组成和工作原理。
实验总结:通过本次实验,我们对计算机系统的基本结构和工作原理有了更深入的了解。
实验中,我们搭建了计算机硬件设备,安装了操作系统,并通过观察和分析实验结果,进一步认识到计算机系统的组成部分和各部分之间的相互关系。
通过操作输入输出设备,我们还实践了与计算机进行交互操作的过程。
计算机组成与体系结构实验

计算机组成与体系结构实验计算机组成与体系结构是计算机科学与技术中的重要基础课程,旨在让学生深入了解计算机内部的工作原理和组成结构。
通过实验的方式,学生可以亲自动手操作和观察,加深对计算机组成与体系结构的理解与认识。
本文将就计算机组成与体系结构实验的重要性、实验的设计与操作、实验结果与分析等方面进行探讨,希望能对读者有所启发。
1. 实验的重要性计算机组成与体系结构实验作为一门重要的实践课程,具有以下几个方面的重要性。
1.1 增强理论知识的实践运用通过实验,学生能够将书本上的理论知识应用于实际操作中,增强对计算机组成与体系结构的认识和理解。
只有亲身操作和实践,才能真正理解计算机内部的工作原理。
1.2 培养问题解决能力在实验中,学生常常会遇到各种问题和挑战,需要通过分析和解决来完成实验任务。
这不仅能够培养学生的问题解决能力,还可以提高他们的创新思维和实践能力。
1.3 提升实验技能实验的设计与操作需要学生掌握一定的实验技能,例如使用计算机硬件设备、调试程序等。
通过实验,学生可以提升自己的实验技能,为以后的学习和工作打下坚实的基础。
2. 实验的设计与操作在进行计算机组成与体系结构实验时,需要根据实验目的和要求,合理设计实验方案,并按照以下步骤进行实验操作。
2.1 实验前的准备工作在开始实验之前,需要进行充分的准备工作。
首先,确认实验所需的硬件和软件设备是否齐备,并检查它们的工作状态。
其次,了解实验的背景和目的,明确实验要求和操作步骤。
最后,阅读相关的实验指导书或教材,熟悉实验的理论知识和实验的操作要点。
2.2 实验过程的操作按照实验指导书或教师的要求,进行实验的操作。
在实验过程中,要注意以下几个方面。
2.2.1 实验环境的设置根据实验要求,设置好实验环境和实验参数。
例如,可以使用特定的软件模拟实验环境,或连接相应的硬件设备来进行实验操作。
2.2.2 实验步骤的执行按照实验指导书或教师的要求,按照实验步骤进行操作。
北航计算机体系结构方向实验介绍

综合实验:主要完成各种控制电路和一些实用数字系统的设计,包括8
位16进制频率计、电子秒表电路、数码管扫描显示电路、全自动洗衣机控制 器 交通灯控制器 电子抢答器 乐曲演奏电路 卡式电话计费器的设计等, 器、交通灯控制器、电子抢答器、乐曲演奏电路、卡式电话计费器的设计等, 共10个。
设计创新实验:主要训练学生综合应用各种EDA工具完成一个大型实际
16
北航计算机体系结构方向实验ห้องสมุดไป่ตู้绍
数字逻辑实验 部分实验大纲 数字逻辑实验-部分实验大纲
课程实验(实验2-3)-选作实验 实验名称:数码管扫描显示电路(2学时,设 计型) 实验目的:了解数码管扫描显示电路的原理。 掌握数码管扫描显示电路的设计方法。 实验内容:利用人眼的视觉暂留效应,设计数 码管扫描显示电路,使6个数码管完成小时、分 钟 秒的扫描显示 要求有启动计时和异步清 钟、秒的扫描显示。要求有启动计时和异步清 零的功能
9
北航计算机体系结构方向实验介绍
MIPS-C核心介绍 MIPS C核心介绍 MIPS-C多周期数据通路
10
北航计算机体系结构方向实验介绍
MIPS-C核心介绍 MIPS C核心介绍 MIPS-C外部接口 UART接口 支持9600 115200波特率 支持9600~115200波特率 UART内部包括6个寄存器:数据寄存器、 中断允许寄存器 中断识别寄存器 线路控 中断允许寄存器、中断识别寄存器、线路控 制寄存器、线路状态寄存器和除数寄存器 支持 级中断 支持3级中断
11
北航计算机体系结构方向实验介绍
MIPS-C核心介绍 MIPS C核心介绍 MIPS-C外部接口 存储器接口 CPU外部可以连接FLASH和SDRAM FLASH为 8位 16M SDRAM为 32位 128M
计算机体系结构课程教学改革实践

计算机体系结构课程教学改革实践计算机体系结构是计算机科学与技术专业中的一门基础课程,其教学内容主要涵盖计算机硬件和软件之间的相互关系以及计算机系统的组成和工作原理。
近年来,随着计算机技术的不断发展和应用的广泛推广,计算机体系结构的教学也面临着许多新的挑战和问题。
为了更好地适应计算机行业的需求和培养高素质的计算机专业人才,需要对计算机体系结构课程的教学进行改革实践。
计算机体系结构教学应该注重理论与实践相结合。
传统的计算机体系结构课程主要侧重于理论知识的传授,对于学生的动手能力和实际操作能力培养较少关注。
实际上,计算机体系结构的学习需要通过实际操作和实验来加深理解和巩固知识。
在教学中应加大对实践环节的重视,通过实验操作、案例分析和项目实践等方式,引导学生将理论知识运用到实际问题中,增强学生的动手能力和实际操作能力。
计算机体系结构教学应注重培养学生的创新能力和问题解决能力。
计算机体系结构的学习需要学生具备良好的分析问题和解决问题的能力。
传统的计算机体系结构课程注重的是教授学生硬件设计和指令集结构等基本概念和知识,对于学生的创新能力和问题解决能力培养较少关注。
在教学中应引入一些实际问题和案例,鼓励学生进行讨论和思考,培养学生的创新能力和问题解决能力。
计算机体系结构教学应注重培养学生的团队合作精神和实际操作能力。
计算机体系结构的学习需要学生具备较强的团队合作能力,因为计算机体系结构的设计和实现往往需要多个人共同合作完成。
传统的计算机体系结构课程往往以个人为单位进行学习和评估,对于学生的团队合作能力培养较少关注。
在教学中应引入一些团队项目和实践活动,鼓励学生进行团队合作,培养学生的团队合作精神和实际操作能力。
计算机体系结构教学应注重实际应用和跨学科的融合。
计算机体系结构不仅仅是一个理论性的学科,更是与其他学科密切相关的工程学科。
在教学中应注重计算机体系结构与其他学科的融合,在教学内容和实践活动中引入一些实际应用和案例,使学生能够将所学知识应用到实际工程中,并能够与其他学科进行跨学科合作,提高学生的综合素质和创新能力。
《计算机体系结构》第五次实验 WARWAWBTB实验

WAR\WAW\BTB实验姓名:王宇航学号:09283020WAR\WAW\BTB实验一、实验目的:通过本实验,理解读后写、写后写数据相关以及转移目标缓冲方法。
二、实验内容:1、用WinMIPS64模拟器执行一段循环程序(习题3.4),采用BTB转移控制策略。
指出程序每次迭代所需的时钟周期数和程序执行所需的总时钟周期数。
2、设计产生WAR、WAW数据相关的程序段,并在WinMIPS64模拟器上执行。
三、实验环境操作系统:Windows 7 旗舰版处理器:Intel(R) Core(TM) i5 双核内存:2.00GB软件:winmips64模拟器四、实验过程:1、分析BTB转移控制策略(1)BTB转移控制策略BTB即分支目标缓冲区转移控制策略处理分支指令的作用是为了最大限度地减少分支指令造成的延迟。
其思想及实现方法为:BTB可以看成是用专门的硬件实现的一张表,表中的每一项至少有两个字段:执行过的成功分支指令的地址和预测的分支目标地址。
在每次取指令的同时,将指令地址与BTB中的所有项的第一个字段进行顺次比较。
若在BTB中存在和该指令地址匹配的项,则可以确定该指令确实是分支指令且上一次分支成功,据此预测这次执行也将分支成功,将该匹配项中的第二个字段中的地址送给PC寄存器,从分支目标处开始取指令。
若在BTB中不存在和该指令地址匹配的项,则把该指令当做普通的指令来执行。
若预测正确,则不会有任何分支延迟;若预测错误或者在BTB中不存在匹配的项,则会有至少两个时钟周期的延迟,因为需要花费一个时钟周期停止取指令来更新BTB中的项,再花费一个时钟周期来取新的指令。
(2)修改习题3.4的循环指令序列,使之可以在WinMIPS64模拟器上执行,修改后的指令序列如下:.data.textDADDI R2,R0,0DADDI R3,R0,396LOOP: LW R1,0(R2)DADDI R1,R1,1SW R1,0(R2)DADDI R2,R2,4DSUB R4,R3,R2BNEZ R4,LOOPNOP(3)将该程序导入WinMIPS64模拟器,在模拟器菜单栏的Configure下,选中“Enable Branch Target Buffer”选项,即采用BTB转移控制策略。
计算机系统体系结构层次的设计和研究

计算机系统体系结构层次的设计和研究1. 引言1.1 概述计算机系统体系结构的设计和研究是计算机科学领域中的一个重要研究方向。
随着计算机技术的不断发展,对于计算机系统体系结构的需求也日益增多。
计算机系统体系结构是指计算机硬件与软件之间的接口和组织方式,它决定了计算机系统的性能、功耗、可扩展性等关键方面。
1.2 文章结构本文将分为六个部分来探讨计算机系统体系结构层次的设计和研究。
首先在引言部分进行概述并介绍文章结构。
其后将首先解释什么是计算机系统体系结构,并讨论其层次结构以及设计和研究的重要性。
接下来,我们将深入探讨计算机系统体系结构中的三个关键层次:硬件层级、指令集架构(ISA)以及微体系结构(Microarchitecture)。
最后,文章将给出总结,并对未来计算机系统体系结构设计进行展望。
1.3 目的本文旨在阐述计算机系统体系结构层次设计和研究的重要性,帮助读者了解计算机系统体系结构在计算机领域中的作用和意义。
通过对每个层次的详细讨论,读者将了解到计算机系统体系结构设计所面临的挑战以及解决方案。
同时,本文也将展望未来计算机系统体系结构设计的可能发展方向,为读者提供对相关领域进行深入研究的启示。
2. 计算机系统体系结构层次的设计和研究2.1 什么是计算机系统体系结构计算机系统体系结构是指计算机硬件和软件之间相互关联的方式和规则,它定义了计算机系统的组织、功能、性能以及各个组成部分之间的交互方式。
它包括了硬件层级、指令集架构层级以及微体系结构层级。
2.2 计算机系统体系结构的层次结构计算机系统体系结构可以被分为三个主要的层次:硬件层级、指令集架构(ISA)层级和微体系结构层级。
- 硬件层级:在硬件层级中,我们关注计算机系统的物理组成部分,包括处理器、内存、输入输出设备等。
这一层次主要涉及底层技术和电子工程。
- 指令集架构(ISA)层级:在ISA层级中,我们定义了每个指令及其操作码,并规定了指令与对应硬件之间的接口。
计算机系统结构实验一MIPS指令系统和MIPS体系结构

计算机系统结构实验报告班级计算机2班实验日期2016.2.24实验成绩姓名殷凤学号22920132203917实验名称MIPS指令系统和MIPS体系结构实验目的要求实验目的及要求:了解和熟悉指令级模拟器;熟练掌握MIPSsim模拟器的操作和使用方法;熟悉MIPS指令系统及其特点,加深对MIPS指令操作语义的理解;熟悉MIPS体系结构。
实验器材:实验平台采用指令级和流水线操作级模拟器MIPSsim;计算机一台。
实验内容、步骤及结果1. 阅读MIPSsim模拟器的使用方法,然后了解MIPSsim的指令系统和汇编语言;2. 对照实验教程启动、配置MIPSsim.exe,参照使用说明,载入程序,多种执行方式查看结果;3. 补充实验的完成:a.求阶乘问题:解决方法:在代码最后加一句指令TEQ r0,r0思路:将自定义的整数存入一个整数寄存器r1,r2,“1”的值存入寄存器r3作为求阶乘时减一的用处,r2减一,与原值r1相乘结果存入r1,判断r2值是否已经减到0,是就运行结束,否则跳转继续r2减一与r1相乘,最后r1的内容就是最终结果。
结果截图:b.ALU运算求(X-Y)*2-(X+Y)/8问题:无思路:题目要求不可以使用乘除指令,则利用逻辑左移(SLL)一位实现乘2,利用逻辑右移(SRL)3实现除以8。
r1 r2中存放自定义的x y,r3中存放x-y的值,r4存放x+y的值,最后结果放在r5中。
结果截图:c.求补码问题:解决方法:把高32位和低32位之间base的差值4个字节事先存进寄存器r6问题:解决方法:改成LABLE1问题:如果是正数的话结果总是错误的解决方法:刚开始忘记判断正负了,如果是正数就直接存回存储器原来的位置,判断正负通过高32位(存在r2中)和十六进制数0x00…0080000000(寄存器r9)进行AND,如果结果等于0(与$r0比较),就为正数,否则就是负数。
思路:r1中放取字指令LW的base值,根据内存中的数据来决定,存储器中高32位数据取出来放进r2,低32位数据放进r3。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中南大学计算机系统体系结构题目:计算机系统体系结构姓名:班级:学号:日期:2014年11月20日1、实验一:对指令操作码进行霍夫曼编码一、实验目的1、了解和掌握指令编码的基本要求和基本原理。
二、实验内容1、使用编程工具编写一个程序,对一组指令进行霍夫曼编码,并输出最后的编码结果以及对指令码的长度进行评价。
与扩展操作码和等长编码进行比较。
问题描述以及问题分析:我们举例说明此问题,例如:最短编码长度为:H=0.45*1+0.30*2+0.15*3+0.05*4+0.03*5+0.01*6+0.01*6=-1.95.要对指令的操作码进行 HUFFMAN 编码,只要根据指令的各类操作码的出现概率构造HUFFMAN 树再进行 HUFFAM 编码。
此过程的难点构造 HUFFMAN 树,进行 HUFFAM 编码只要对你所生成的 HUFFMAN 树进行中序遍历即可完成编码工作。
三、关键代码及部分注释哈夫曼树重点在于如何排列权值大小不同的结点的顺序private int leafNum; //叶子结点个数private HaffmanNode[] hnodes; //哈夫曼树的结点数组public HaffManCode(double[] weight) //构造指定权值集合的哈夫曼树{ int n = weight.length; //n个叶子结点this.leafNum = n;this.hnodes = new HaffmanNode[2*n-1]; //n个叶子结点的哈夫曼树共有2n-1个结点for(int i=0; i<n; i++) //结点数组初始化有n个叶子结点this.hnodes[i] = new HaffmanNode(weight[i]);for(int i=0; i<n-1; i++) //构造n-1个2度结点,每循环一次,构造一个2度结点{double min1, min2;int x1, x2;min1 = min2 = Integer.MAX_VALUE; //选择最小和次最小权值,初值为最大权值 x1 = x2 = -1; //记录两个无父母的最小权值结点下标for(int j=0;j<n+i; j++) //查找两个无父母的最小权值结点{ if(hnodes[j].weight<min1 && hnodes[j].parent==-1){ min2 = min1;x2 = x1;min1 = hnodes[j].weight; //min1记下最小权值x1 = j; //x1记下最小权值结点的下标}else if(hnodes[j].weight<min2 && hnodes[j].parent==-1){min2 = hnodes[j].weight;x2 = j; //x2记下次最小权值结点的下标}}四、实验结果五、实验源代码1、HaffmanNode.javapackage feng;class HaffmanNode //哈夫曼树的结点类{ double weight; //权值int parent,left,right; //父母结点和左右孩子下标public HaffmanNode(double weight){this.weight = weight;this.parent=-1;this.left=-1;this.right=-1;}public HaffmanNode(){this(0);}public String toString(){return this.weight+" "+this.parent+" "+this.left+" "+this.right; }}2、HaffManCode.javapackage feng;public class HaffManCode{private int leafNum; //叶子结点个数private HaffmanNode[] hnodes; //哈夫曼树的结点数组public HaffManCode(double[] weight) //构造指定权值集合的哈夫曼树{int n = weight.length; //n个叶子结点this.leafNum = n;this.hnodes = new HaffmanNode[2*n-1]; //n个叶子结点的哈夫曼树共有2n-1个结点for(int i=0; i<n; i++) //结点数组初始化有n个叶子结点this.hnodes[i] = new HaffmanNode(weight[i]);for(int i=0; i<n-1; i++) //构造n-1个2度结点,每循环一次,构造一个2度结点 {double min1, min2;int x1, x2;min1 = min2 = Integer.MAX_VALUE; //选择最小和次最小权值,初值为最大权值x1 = x2 = -1; //记录两个无父母的最小权值结点下标for(int j=0; j<n+i; j++) //查找两个无父母的最小权值结点{if(hnodes[j].weight<min1 && hnodes[j].parent==-1){min2 = min1;x2 = x1;min1 = hnodes[j].weight; //min1记下最小权值x1 = j; //x1记下最小权值结点的下标}else if(hnodes[j].weight<min2 && hnodes[j].parent==-1){min2 = hnodes[j].weight;x2 = j; //x2记下次最小权值结点的下标}}hnodes[x1].parent = n+i; //将找出的两棵权值最小的子树合并为一棵子树hnodes[x2].parent = n+i;this.hnodes[n+i] = new HaffmanNode();hnodes[n+i].weight = hnodes[x1].weight+hnodes[x2].weight;hnodes[n+i].left = x1;hnodes[n+i].right = x2;}}public String toString(){String str="";for (int i=0; i<this.hnodes.length && hnodes[i]!=null; i++)str += " "+i+" "+this.hnodes[i].toString()+"\n";return str;}String[] code1 = null;public String[] haffmanCode() //返回当前哈夫曼树的哈夫曼编码{code1 = new String[this.leafNum];String[] code = new String[this.leafNum];for(int i=0; i<this.leafNum; i++) //求n个叶子结点的哈夫曼编码{code[i]="";int child = i;int parent = hnodes[child].parent;while (parent!=-1) //由叶结点向上直到根结点循环{if(hnodes[parent].left==child) {code[i]="0"+code[i]; //左孩子结点编码为0code1[i] = code[i];}else {code[i]="1"+code[i]; //右孩子结点编码为1code1[i] = code[i];}child = parent;parent = hnodes[child].parent;}}return code;}public double shortestLong() {int lng;double weight, shortestlong = 0;for(int i=0; i<this.leafNum; i++) {lng = code1[i].length();weight = hnodes[i].weight;shortestlong = shortestlong + lng*weight;}return shortestlong;}public static void main(String[] args){//int[] weight={186, 64, 13, 22, 32, 103, 21, 15, 47, 57, 1, 5, 32, 20}; //指定权值集合double[] weight={0.1, 0.2, 0.1, 0.3, 0.1, 0.2};HaffManCode htree = new HaffManCode(weight);System.out.println("指令权值父指左子右子\n"+htree.toString());String[] code = htree.haffmanCode();System.out.println("哈夫曼编码:");for (int i=0; i<code.length; i++) {System.out.println(code[i]);}System.out.println("最短编码长度为:" + htree.shortestLong());}}2、实验二:使用LRU方法更新Cache一.实验目的:1、了解和掌握寄存器分配和内存分配的有关技术。
二、实验内容:1、结合数据结构的相关知识,使用LRU的策略,对一组访问序列进行内部的Cache更新。
LRU置换算法是选择最近最久未使用的页面予以置换。
该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来经历的时间T,当须淘汰一个页面时,选择现有页面中T 值最大的,即最近最久没有访问的页面。
这是一个比较合理的置换算法。
举例说明此问题,例如:有一个CACHE采用组相连映象方式。
每组有四块,为了实现LRU置换算法,在快表中为每块设置一个2位计数器。
我们假设访问序列为“1,1,2,4,3,5,2,1,6,7,1,3”。
在访问CACHE的过程中,块的装入,置换及命中时,具体情况如下表所示:三、关键代码1、程序分情况讨论了,当一个cache装满的情况下,2个,3个4个装满的情况下,当输入访问序列的时候,自动进行识别,并进行相应的处理,这个就是当四个块都被装满的情况else {//四个cache块都装满的情况if(jtf2.getText().equals(jt.getValueAt(list-3, 1))) {//要访问的页面刚好在cache0中dtm.addRow(new Object[]{jtf2.getText(),jt.getValueAt(list-3, 1),jt.getValueAt(list-3, 2),jt.getValueAt(list-3, 3),jt.getValueAt(list-3, 4), "命中"});System.out.println(1);time1 = 0;time2++;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");}四、实验结果:如果按照访问序列你“1,2,3,4,5,4,3,2,1”输入,结果如图:五、源代码及LRU算法1、源代码及注释:package keshe;import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.table.*;import jdk.nashorn.internal.scripts.JO;public class LRUCache extends Frame {public static void main(String[] args) {JFrame.setDefaultLookAndFeelDecorated(true);LRUCache lruc = new LRUCache();uchFrame();}JLabel jlabel2;JTextField jtf2;JButton jb_input;JScrollPane jsp;JTable jt;DefaultTableModel dtm;static int list = 1, count = list - 1;int time1 = 0;int time2 = 0;int time3 = 0;int time4 = 0;public void lauchFrame() {this.setLayout(null);this.setBounds(100, 100, 540, 320);this.setBackground(Color.cyan);this.setVisible(true);jlabel2 = new JLabel("请输入第" + list + "个访问页面:");jtf2 = new JTextField();jb_input = new JButton("输入");jlabel2.setBounds(20, 50, 140, 20);jtf2.setBounds(155, 50, 50, 20);jb_input.setBounds(240, 50, 60, 20);this.add(jlabel2);this.add(jtf2);this.add(jb_input);this.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}});jb_input.addActionListener(new InputActionListener());Object[] title = {"访问序列","Cache块0", "Cache块1", "Cache块2", "Cache块3", "状态"};dtm = new DefaultTableModel(title, 0);jt = new JTable(dtm);jsp = new JScrollPane(jt);jsp.setBounds(50, 80, 440, 197);jsp.setBackground(Color.black);this.add(jsp);}class InputActionListener implements ActionListener {public void actionPerformed(ActionEvent e) {if(jtf2.getText().equals("")) {Object[] options = { "OK" };JOptionPane.showOptionDialog(null, "你的输入存在“”,请按提示输入!", "警告",JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,null, options, options[0]);}list++;if(count < 4) {//count记录装入cache块的页面数switch(count) {case 0://cache块中没有装入页面的情况dtm.addRow(new Object[]{jtf2.getText(), jtf2.getText(), "", "", "", "装入"});time2++;time3++;time4++;count++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");break;case 1://cache块中装入一个页面的情况if(jtf2.getText().equals(jt.getValueAt(list-3, 1))) {//要访问的页面刚好在cache0中dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1), "", "", "", "命中"});time2++;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else {//要访问的页面不在cache块中dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1), jtf2.getText(), "", "", "装入"});time1++;time2 = 0;time3++;time4++;count++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");}break;case 2://cache块中装入两个页面的情况if(jtf2.getText().equals(jt.getValueAt(list-3, 1))) {//要访问的页面刚好在cache0中dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1),jt.getValueAt(list-3, 2), "", "", "命中"});time1 =0;time2++;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(jtf2.getText().equals(jt.getValueAt(list-3, 2))) {//要访问的页面刚好在cache1中dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1),jt.getValueAt(list-3, 2), "", "", "命中"});time1++;time2 = 0;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else {//要访问的页面不在cache块中dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1),jt.getValueAt(list-3, 2), jtf2.getText(), "", "装入"});time1++;time2++;time3 =0;time4++;count++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");}break;case 3://cache块中装入三个页面的情况if(jtf2.getText().equals(jt.getValueAt(list-3, 1))) {//要访问的页面刚好在cache0中dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1),jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3), "", "命中"});time1 = 0;time2++;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(jtf2.getText().equals(jt.getValueAt(list-3, 2))) {//要访问的页面刚好在cache1中dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1),jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3), "", "命中"});time1++;time2 =0;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(jtf2.getText().equals(jt.getValueAt(list-3, 3))) {//要访问的页面刚好在cache2中dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1),jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3), "", "命中"});time1++;time2++;time3 = 0;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");}else {//要访问的页面不在cache块中dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1),jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3), jtf2.getText(), "装入"});time1++;time2++;time3++;time4 = 0;count++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");}break;}} else {//四个cache块都装满的情况if(jtf2.getText().equals(jt.getValueAt(list-3, 1))) {//要访问的页面刚好在cache0中dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1), jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3), jt.getValueAt(list-3, 4), "命中"});System.out.println(1);time1 = 0;time2++;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(jtf2.getText().equals(jt.getValueAt(list-3, 2))) {//要访问的页面刚好在cache1中dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1), jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3), jt.getValueAt(list-3, 4), "命中"});System.out.println(2);time1++;time2 = 0;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(jtf2.getText().equals(jt.getValueAt(list-3, 3))) {//要访问的页面刚好在cache2中dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1), jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3), jt.getValueAt(list-3, 4), "命中"});System.out.println(3);time1++;time2++;time3 = 0;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(jtf2.getText().equals(jt.getValueAt(list-3, 4))) {//要访问的页面刚好在cache3中dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1), jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3), jt.getValueAt(list-3, 4), "命中"});System.out.println(4);time1++;time2++;time3++;time4 = 0;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");}else {//要访问的页面不在cache块中if(time1>time2 && time1>time3 && time1>time4) {//如果cache0的页面最长时间没有被访问,新页面置换cache0中页面dtm.addRow(new Object[]{jtf2.getText(), jtf2.getText(), jt.getValueAt(list-3, 2), jt.getValueAt(list-3, 3), jt.getValueAt(list-3, 4), "置换"});time1 = 0;time2++;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(time2>time1 && time2>time3 && time2>time4) {//如果cache1的页面最长时间没有被访问,新页面置换cache1中页面dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1), jtf2.getText(), jt.getValueAt(list-3, 3), jt.getValueAt(list-3, 4), "置换"});time1++;time2 = 0;time3++;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(time3>time1 && time3>time2 && time3>time4) {//如果cache2的页面最长时间没有被访问,新页面置换cache2中页面dtm.addRow(new Object[]{jtf2.getText(), jt.getValueAt(list-3, 1),jt.getValueAt(list-3, 2), jtf2.getText(), jt.getValueAt(list-3, 4), "置换"});time1++;time2++;time3 = 0;time4++;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");} else if(time4>time1 && time4>time2 && time4>time3) {//如果cache3的页面最长时间没有被访问,新页面置换cache3中页面dtm.addRow(new Object[]{jtf2.getText(), JO.getValueAt(list-3, 1),JO.getValueAt(list-3, 2), JO.getValueAt(list-3, 3), jtf2.getText(), "置换"});time1++;time2++;time3++;time4 = 0;jtf2.setText("");jlabel2.setText("请输入第" + list + "个访问页面:");}}}}}}2、LRU算法:// cache 更新算法,LRUvoid up_cache(){int i=0;while(i<n){ int j=0;//满么?while(j<m){if((cache[j].state==false)&&(walk_sort[i]!=cache[j].value)){cout<<"cache 有空闲块,不考虑是否要置换."<<endl;cout<<walk_sort[i]<<"被调入 cache...."<<endl;cache[j].value=walk_sort[i++];cache[j].state=true;cache[j].count=0;int kk=0;for (x=0;x<m;x++)cout<<"cache 块"<<x<<": "<<cache[x].value<<endl;cout<<endl;//更新其它 cache 块没使用时间while(kk<m){if(kk!=j&&cache[kk].value!=(-1))cache[kk].count++;kk++;}delay();break;}if(cache[j].value==walk_sort[i]){cout<<endl;cout<<walk_sort[i]<<"命中!!!"<<endl;for (x=0;x<m;x++)cout<<"cache 块"<<x<<": "<<cache[x].value<<endl;cout<<endl;int kk=0;i++;cache[j].count=0;//更新其它 cache 块没使用时间while(kk<m){if(kk!=j&&cache[kk].value!=(-1))cache[kk].count++;kk++;}}j++;}if(j==m){cout<<"cache 已经满了,考虑是否置换."<<endl;cout<<endl;int k=0;while(k<m){if(cache[k].value==walk_sort[i]){cout<<endl;cout<<walk_sort[i]<<"命中!!!"<<endl;for (x=0;x<m;x++)cout<<"cache 块"<<x<<": "<<cache[x].value<<endl;i++;cache[k].count=0;int kk=0;//更新其它 cache 块没使用时间while(kk<m){if(kk!=k)cache[kk].count++;kk++;}break;}k++;}if(k==m)//考虑置换那一块.{int ii=0;int t=0;//要替换的 cache 块号.int max=cache[ii].count;ii++;while(ii<m){if(cache[ii].count>max){max=cache[ii].count;t=ii;}ii++;}//置换cout<<cache[t].value<<"被"<<walk_sort[i]<<"在 cache 的"<<t<<"号块置换..."<<endl;cache[t].value=walk_sort[i++];cache[t].count=0;for (x=0;x<m;x++)cout<<"cache 块"<<x<<": "<<cache[x].value<<endl;int kk=0;//更新其它 cache 块没使用时间while(kk<m){if(kk!=t)cache[kk].count++;kk++;}delay();}}}}3、实验四:单功能流水线调度机构模拟一、实验目的:1、结合数据结构的相关知识,编写流水线调度模拟程序。