计算机体系结构实验-单功能流水线调度机构模拟
计算机操作系统:处理机调度模拟实验

display2(run);
}
p = ready;
if (p != NULL)
printf("\n ****当前就绪队列中进程的状态如下:\n"); /*显示就绪队列状态*/
while (p != NULL)
{
display2(p);
p = p->next;
}
p = finish;
根据单处理机,多任务的问题特性做好软件实现的需求分析。可根据问题的实际需要,可选择进程数量。
当系统运行时,能直观地、动态地反映当前处理机状态及各进程执行的状况。
实验环境
Windows 7或以上版本+ VS2010或以上版本
实验内容
程序运行一次中,要求三个进程队列,每个优先权依次为1、2、3,即优先权为1的只分配1个时间片,优先权为2的只分配2个时间片,优先权为3的只分配3个时间片;每个进程队列命名、进程命名与进程数自定,轮转打印出各个进程名,程序结束打印退出。
run->state = 'R';
display();
}
//探测到有就绪队列时,选择一个将处理机分配给它
void priority(int T)
{
while (run != NULL)
{
run->rtime = run->rtime + T;
run->syቤተ መጻሕፍቲ ባይዱime = run->sytime - T;
实验完成后请现场演示。
实验步骤描述
1.给一系列进程创建结构体
2.写一个printready函数探测就绪队列是否为空
3.写一个display1函数,用于显示当前进程
计算机体系结构——流水线技术(Pipelining)

单功能流水线:流水线只完成一种固定功能 多功能流水线:流水线可以完成多种功能,如 TI公司的ASC机,8段流水线,能够实现:定点加减 法、定点乘法、浮点加法等功能 3.按同一时间内各段之间的连接方式分 静态多功能流水线 :同一时间内,多功能结构只能按一种功能的连接方式工作。 动态多功能流水线:在同一时间内,可以有多种功能的连接方式同时工作 4.按处理的数据类型 标量流水线 向量流水线 5.按控制方式 同步流水线 异步流水线:当Si功能段要向Si+1段传送数据时,首 先发出就绪信号,Si+1功能段收到信号后,向Si回送 一个回答信号。 6.按任务从输出端的流出顺序 顺序流水方式:指令流出顺序 = 指令流入顺序 乱序流水方式:指令流出顺序 != 指令流入顺序 7. 线性流水线——不带反馈回路的流水线
三、流水线的分类(了解)
四、流水线相关及冲突(重点) 1.流水线相关 2.流水线冲突 3.流水线冲突带来问题 4.数据冲突及其解决方案 5.结构冲突及其解决方案 6.控制冲突及其解决方案
五、流水线性能分析(含例题讲解) 1.流水线的基本参数——吞吐率 2.流水线的基本参数——加速比 3.流水线的基本参数——效率 4.结果分析 5.有关流水线性能的若干问题
整体评估、反馈、再改进
3. 指令周期
单周期处理机模型:一个周期完成一个指令(每个周期是等长的),指令长度可能不一样,会造成很大的浪费 多周期处理机模型:将一个指令的完成划分成若干个周期来实现 流水线模型
二、流水线技术 1. 什么是流水线? 计算机中的流水线是把一个重复的过程分解为若干个子过程,每个子过程与其他子过程并行进行。由于这种工作方式与工厂中的生产 流水线十分相似, 因此称为流水线技术 从本质上讲,流水线技术是一种时间并行技术。
北邮大三下 计算机系统结构实验报告 实验一到五 WINDLX模拟器

北京邮电大学实验报告课程名称计算机系统结构计算机学院 2011211311班薛玥(2011211432)目录实验一 WINDLX模拟器安装及使用 (3).实验准备 (3).实验环境 (4).实验步骤 (5).实验内容及要求 (5).实验过程 (5).实验总结 (11)实验二指令流水线相关性分析 (12).实验目的 (12).实验环境 (12).实验步骤 (12).实验过程 (12).实验总结 (19)实验三DLX处理器程序设计 (20).实验目的 (20).实验环境 (20).实验步骤 (20).实验过程 (20)A.向量加法代码及性能分析 (20)B.双精度浮点加法求和代码及结果分析 (26).实验总结 (31)实验四代码优化 (32).实验目的 (32).实验环境 (32).实验原理 (32).实验步骤 (32).实验过程 (32).实验总结+实习体会 (37)实验五循环展开 (38).实验目的 (38).实验环境 (38).实验原理 (38).实验步骤 (38).实验过程 (38)矩阵乘程序代码清单及注释说明 (38)相关性分析结果 (43)增加浮点运算部件对性能的影响 (43)增加forward部件对性能的影响 (43)转移指令在转移成功和转移不成功时候的流水线开销 (43).实验总结+实习体会+课程建议 (43)实验一 WINDLX模拟器安装及使用·实验准备1.了解DLX的基本结构和原理DLX是一种典型的Load/Store型指令集结构。
它具有一套简单的Load/Store 指令集;它注重指令流水效率;它简化指令的译码;它高效支持编译器。
2.了解DLX中的寄存器DLX中有32个通用寄存器(GPRs),分别将其命名为R0,R1...R31。
每个通用寄存器长度为32位。
另外,DLX中有32个浮点寄存器(FPRs),分别将其命名为F0,F1 (31)3.了解DLX数据类型DLX提供了多种长度的整型数据和浮点数据。
计算机体系结构 实验

系统结构实验:流水线处理机流水方式是把一个复杂的过程分解为若干个子过程,每个子过程可以与其它子过程同时进行。
由于这种工作方式与工厂中的生产流水线十分相似,因此,把它称为流水线工作方式。
1.1 流水线的原理及基本思想1.1.1 流水的基本概念流水可以看作是重叠的引申,一次重叠是一种简单的指令流水线。
一次重叠是把一条指令分解为“分析”和“执行”两个子过程,这两个子过程分别在执行分析部件和指令执行部件中完成。
如图1-1-1 所示。
由于在指令分析部件和指令执行部件的输出端各有一个锁存器,可以分别保存指令分析和指令执行的结果,因此,指令分析和指令执行部件可以完全独立并行地工作,而不必等一条指令的“分析”、“执行”子过程都完成之后才送入下一条指令。
分析部件在完成一条指令“分析”并将结果送入指令执行部件的同时,就可以开始分析下一条指令。
图1-1-1 简单的流水上图中如果指令分析部件分析一条指令所用的时间△t1 与指令执行部件执行一条指令所用的时间△t2 相等,即△t1=△t2=△t,就一条指令的解释来看还是需要2△t,但是从机器的输出来看,每过△t 就有一条指令执行完成。
因此,机器执行指令的速度提高了一倍。
如果把“分析”子过程再细分成“取指令”、“指令译码”和“取操作数”3 个子过程,并加快“执行”子过程,使 4 个子过程都能独立地工作,且经过的时间都是△t。
如图1-1-2(a)所示,则可以描述出流水的时空图如图1-1-2(b)。
在时空图中,横坐标表示时间,也就是输入到流水线中的各个任务在流水线中所经过的时间。
纵坐标表示空间,即流水线的各个子过程。
在时空图中,流水线的一个子过程通常成为“功能段”。
从时空图中,可以很清楚的看出各个任务在流水线的各段中的流动的过程。
从横坐标方向看,流水线中的各个功能部件逐个连续地完成自己的任务;从纵坐标看,在同一时间段内有多个功能段在同时工作。
在上面的流水线中,对于“取指令”、“指令译码”、“取操作数”、“执行”每个子过程都需要△t 时间完成,这样,虽然完成一条指令所需的时间还是一个T,但是每隔一个△t(T/4)时间就会一条指令结果输出,这样的执行效率比顺序方式提高了 3 倍。
计算机操作系统:处理机调度模拟实验资料

课程实验报告
在单处理机的情况下模拟用优先权的时间片轮转调度策略实现处理机调度,以加深了解处理机调度的工作过程。
要求:
可利用先来先服务、短作业优先、响应比高者优先、多级反馈队列模型、时间片轮转法等,来实现处理机的调度。
根据单处理机,多任务的问题特性做好软件实现的需求分析。
可根据问题的实际需要,可选择进程数量。
当系统运行时,能直观地、动态地反映当前处理机状态及各进程执行的状况。
描述6.create函数用于创建队列
7.insert为插入函数,用于将一个时间片运行结束的进程插入到就绪进程的
队尾
8.priority函数:如果有进程就绪,就将处理机分配给该进程让他执行。
调试过程及实验结果
总结每次运行一步,电脑将会将该时刻所有进程控制块的运行状态显示给用户。
包括进程名、要求运行时间、已经运行时间、还需要运行时间、状态等信息。
当每个进程运行一个时间片之后将它从该队列中移除,添加到就绪队列队尾中以便使每个进程可以循环执行。
当要求运行时间和已运行时间相等时,说明该进程运行结束,将该进程撤出该队列并且不再添加到就绪队列中。
直到就绪队列中没有就绪进程为止
附录#define _CRT_SECURE_NO_DEPRECATE #include"stdio.h"
#include"stdlib.h"
#include"string.h"
typedef struct node
{
char pname[10]; //进程名
int rtime; //已运行时间
int sytime; //剩余时间。
计算机体系结构实训课程学习总结指令级并行与流水线设计

计算机体系结构实训课程学习总结指令级并行与流水线设计在计算机科学与技术领域中,计算机体系结构是一门关于计算机硬件与软件的核心学科。
在我修习的计算机体系结构实训课程中,我学习了指令级并行与流水线设计,掌握了该领域的核心概念与技术,下面是我对该课程的学习总结和心得体会。
一、指令级并行概述指令级并行是指在一个周期内同时执行多条指令,以减少指令的执行时间,提高计算机的性能。
在学习指令级并行的过程中,我了解了计算机指令的基本原理及其执行过程。
通过学习指令流水线、数据前推、乱序执行等技术,我深入理解了指令级并行的优势和实现方法。
在实训过程中,我通过搭建指令级并行的实验平台,进行了仿真实验和性能分析。
通过比较顺序执行和指令级并行执行的效果,我发现指令级并行可以大幅度提高计算机的执行效率。
而在实现指令级并行时,我也面临了一些挑战,如数据相关、控制相关等问题,但通过优化代码和调整指令执行顺序,我成功地解决了这些问题。
这个过程让我深刻体会到指令级并行设计的重要性和技术难点。
二、流水线设计与优化流水线设计是指将计算机指令的执行过程划分为多个阶段,并使不同阶段的指令并行执行,从而提高计算机的吞吐量。
在学习流水线设计的过程中,我深入了解了流水线的原理、特点和结构。
通过学习流水线的组织方式、数据冒险、控制冒险等问题,我掌握了流水线设计的关键技术。
在实验中,我设计了一个基于流水线的简单计算机,并通过编写适当的指令集和流水线寄存器,实现了流水线的功能。
通过性能测试,我发现流水线设计可以显著提高计算机的执行效率和吞吐量。
然而,我也发现了一些流水线设计中的问题,比如分支预测错误、资源冲突等,这些问题对流水线的性能产生了负面影响。
通过调整分支预测策略和添加冲突检测机制,我成功地进行了优化,提高了流水线设计的性能。
三、实训过程中的收获与反思通过学习指令级并行与流水线设计,我不仅极大地提高了对计算机体系结构的理解和掌握,还培养了解决实际问题的能力。
计算机体系结构实验报告——实验二

计算机体系结构实验报告——实验二1.实验目的:通过本实验,熟练掌握WinDLX模拟器的操作和使用,清楚WinDLX五段流水线在执行具体程序时的流水情况,熟悉DLX指令集结构及其特点。
2.实验内容:(1)用WinDLX模拟器执行程序gcm.s。
该程序从标准输入读入两个整数,求他们的greatest common measure,然后将结果写到标准输出。
该程序中调用了input.s中的输入子程序。
(2).给出两组数6、3和6、1,分别在main+0x8(add r2,r1,r0)、gcm.loop(seg r3,r1,r2)和result+0xc(trap0x0)设断点,采用单步和连续混合执行的方法完成程序,注意中间过程和寄存器的变化情况,然后单击主菜单execute/display dlx-i/0,观察结果。
3.实验程序求最大公约数程序:gcm.s;***********WINDLX Ex.1:Greatest common measure*************;------------------------------------------------------------------------;Program begins at symbol main;requires module INPUT;Read two positive integer numbers from stdin,calculate the gcm;and write the result to stdout;------------------------------------------------------------------------.data;***Prompts for inputPrompt1:.asciiz“First Number:”Prompt2:.asciiz“Second Number:“;***Data for printf-TrapPrintfFormat:.asciiz“gcM=%d\n\n”.align2PrintfPar:.word PrintfFormatPrintfValue:.space4.text.global mainmain:;***Read two positive integer numbers into R1and R2 addi r1,r0,Prompt1jal InputUnsigned;read uns.-integer into R1add r2,r1,r0;R2<-R1addi r1,r0,Prompt2jal InputUnsigned;read uns.-integer into R1Loop:;***Compare R1and R2seq r3,r1,r2;R1==R2?bnez r3,Resultsgt r3,r1,r2;R1>R2?bnez r3,r1Greaterr2Greater:;***subtract r1from r2sub r2,r2,r1j Loopr1Greater:;***subtract r2from r1sub r1,r1,r2j LoopResult:;***Write the result(R1)sw PrintfValue,r1addi r14,r0,PrintfPartrap5;***endtrap0该程序中调用了input.s中的输入子程序。
体系结构 实验报告 哈工程

计算机科学与技术学院《计算机体系结构》课程实验学号:班级:专业:计算机科学与技术学生姓名:2017年5月7日实验报告1、双击WinDLX图标运行WinDLX。
装入测试程序之前,先初始化WinDLX 模拟器:点击File菜单中的Reset all菜单项,弹出一个“Reset DLX”对话框。
然后点击窗口中的“确认”按钮即可。
2、选择File / Load Code or Data,按如下步骤操作,可将distance.s和input.s 这两个程序装入主存:点击distance.s点击select按钮点击input.s点击select按钮点击load按钮3、按F7键程序顺序执行观察6个子窗口的情况。
七、实验数据及结果分析:1、先装入distance.s再转入input.s时,因为程序顺序执行,地址顺序符合程序执行顺序,程序能够正确执行;顺序相反时,因为input.s的地址高,而程序顺序执行到input.s时将没有正确的输入窗口,程序执行到输出结果时,也不会出现结果2、程序中出现三个相关图7-1如图7-1因为下面两条指令,第二条指令要读r4而执行到此操作时第一条指令仍对r4进行操作,发生了数据相关add r4,r0,2div r2,r2,r4图7-2如图7-2 程序中出现了结构相关,硬件资源满足不了指令执行的要求,发生资源冲突时,将产生结构相关。
次程序代码段因加法器发生结构相关。
add r3,r0,r1add r6,r0,0图7-3如图7-3程序中出现控制相关,当程序执行下面指令时,第二条指令出现跳转指令时,第一条指令还没有执行完,所以出现控制相关addi r1,r0,Promptjal InputUnsigned图7-43、.data ;定义数据段,默认情况下数据段$DATA 会被加载到内存0x1000地址处;***prompts for input ;提示输入语句,输入3个初始数据Prompt1: .asciiz "time:" ;时间Prompt2: .asciiz "accelerate speed:";加速度Prompt3: .asciiz "innital speed:" ;初始速度;Data for Printf-TrapPrintfFormat: .asciiz "distance=%d\n" ;输出格式,表示求出的路程按什么格式输出;PrintfFormat1: .asciiz "the result is :%d ,no convention!" .align 2 ;表示下面采用字对齐PrintPar: .word PrintfFormatPrintValue: .space 4.text;第一代码段,默认情况下代码段$CODE会加载到内存0x100地址处.global main ;定义一个全局符号main,即该代码段的首地址main:;***read two positive integer numbers into R1 and R2add r1,r0,Prompt1 ;将输入的数存入寄存器r1jal InputUnsigned ;跳转到InputUnsigned子程序处读取输入的参数,同时将一条指令的地址存与r31中,即r31<-pc+4add r3,r0,r1 ;由InputUnsigned 返回的参数赋r3寄存器,此时r3存储的是时间add r6,r0,0 ;将0赋值给r6sgt r7,r6,r3 ;比较r3 和r6大小bnez r7,error ;r7为1则结束程序add r1,r0,Prompt2 ;将输入的数存入寄存器r1jal InputUnsigned ;同上,跳转到InputUnsigned子程序add r2,r0,r1 ;由InputUnsigned 返回的参数赋r2寄存器,此时r2存储的是加速度add r1,r0,Prompt3 ;将输入的数存入寄存器r1jal InputUnsigned ;同上,跳转到InputUnsigned子程序;r3: time r2:add speed r1:innital speedmult r1,r1,r3 ;时间乘以速度,并将之存入r1中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
段中都要设置一个流水锁存器。流水线需要有“装入时间”和“排空时间”。只有流水线完
全充满时,整个流水线的效率才能得到充分发挥。
四、关键代码
//构筑主窗体大小颜色:
publicvoidlauchFrame() {
this.setLayout(null);
}
class InputActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
if(jtf2.getText().equals("")) {
Object[] options = { "OK" };
CENTRAL SOUTH UNIVERSITY
计算机体系结构实验报告
题目单功能流水线调度机构模拟
一、实验目的
结合数据结构的相关知识,编写流水线调度模拟程序。
二、实验环境
Eclipse IDE for Java Developers(Version: Kepler Release)
Win7
三、实验内容
jlabel1.setBounds(50, 50, 110, 20);
//jlabel2.setBounds(230, 50, 90, 20);
jta1.setBounds(50, 100, 500, 150);
jtf2.setBounds(170, 50, 70, 20);
//jtf3.setBounds(330, 50, 90, 20);
new Painting(150, 400, 450, 400, Color.red, "", false).draw(g);
new Painting(200, 300, 200, 430, Color.red, "", false).draw(g);
if(timeslice != null && Integer.parseInt(timeslice) <= 8) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void paint(Graphics g) {
new Painting(50, 280, 500, 180, Color.orange, "", true).draw(g);
newPainting(250, 360, 25, 20, Color.gray, "EA2",true).draw(g);
newPainting(250, 340, 25, 20, Color.gray, "MA1",true).draw(g);
}
这个程序运行的流水线的模拟,依靠的是Java对于界面的编写,流水线的时空图并不是由程序得出,而是由预先设计好的时空图通过编程输出为图像。比如这个当输入为3时,时空图中有6块,每块用new Painting输出。
五、运行截图及源代码
输入为空的时候:
输入超出规定范围的时候:
输入正常的范围,比如t=8的时候的流水线时空图:
源代码:
package waterline;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
jb_input.setBounds(450, 50, 60, 20);
//run.setBounds(450, 260, 100, 20);
this.add(jlabel1);
//this.add(jlabel2);
this.add(jta1);
this.add(jtf2);
//this.add(jtf3);
程序通过模拟单功能流水线调度过程,掌握流水线技术,学会计算流水线的吞吐率、
加速比、效率。
1流水线的表示法有三种:
连接图、时空图、预约表。对于线性流水线,主要考虑前二种。
2流水线的主要特点:
在流水线的每一个功能部件的后面都要有一个缓冲器,称为锁存器、闸门寄存器等,
它的作用是保存本流水段的执行结果。各流水段的时间应尽量相等,否则回引起阻塞、
this.x = x;
this.y = y;
this.width = width;
this.height = height;
this.color = color;
this.s = s;
this.f void draw(Graphics g) {
Color c = g.getColor();
newPainting(225, 380, 25, 20, Color.gray, "ED2",true).draw(g);
newPainting(250, 380, 25, 20, Color.gray, "ED3",true).draw(g);
newPainting(225, 360, 25, 20, Color.gray, "EA1",true).draw(g);
this.setBounds(100, 100, 600, 500);
this.setBackground(Color.cyan);
this.setVisible(true);
//当输入为3时,显示的是此时的流水线
if(Integer.parseInt(timeslice) == 3) {
newPainting(200, 380, 25, 20, Color.gray, "ED1",true).draw(g);
}
}
class Painting {
int x, y, width, height;
Color color;
String s;
Boolean flag;
public Painting(int x, int y,int width, int height, Color color, String s, Boolean flag) {
new Painting(225, 380, 25, 20, Color.gray, "ED2", true).draw(g);
new Painting(225, 360, 25, 20, Color.gray, "EA1", true).draw(g);
}
if(Integer.parseInt(timeslice) == 3) {
}
g.setColor(Color.red);
g.drawString(s, x+2, y+15);
g.setColor(c);
}
}
private class PaintThread implements Runnable {
public void run() {
while(true) {
repaint();
JOptionPane.showOptionDialog(null, "你的输入存在“”,请按提示输入!", "警告",
JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,
null, options, options[0]);
}
timeslice = jtf2.getText();
jta1.append("Here, we display all the content in the pipline:\n");
jta1.append("Please input a time slice:\n");
//jta1.append(" " + NL[0] + " " + NL[1] + " " + NL[2]);
public void lauchFrame() {
this.setLayout(null);
this.setBounds(100, 100, 600, 500);
this.setBackground(Color.cyan);
this.setVisible(true);
jlabel1 = new Label("请输入时间t:");
if(Integer.parseInt(timeslice) == 1) {
new Painting(200, 380, 25, 20, Color.gray, "ED1", true).draw(g);
}
if(Integer.parseInt(timeslice) == 2) {
new Painting(200, 380, 25, 20, Color.gray, "ED1", true).draw(g);
jb_input.addActionListener(new RunActionListener());
jta1.addKeyListener(new TextAreaThread());
g = this.getGraphics();
new Thread(new PaintThread()).start();
jta1.append("---------------------Deno the pipline for float point add.---------------------\n");