实验五指令调度和延迟分支
实验5 进程调度

实验
实验目的
通过本实验可以加深理解有关进程控制块、进程队列的概念,并体会和了解优先数和时间片轮转调度算法的具体实施办法。
预习1.实验指导书 Nhomakorabea实验内容及要求
用高级语言模拟实现进程调度,完成下列指标:
③在优先数算法中,优先数可以先取值为98,进程每执行一次,优先数减3,CPU时间片数加1,进程还需要的时间片数减1。在轮转算法中,采用固定时间片。
④对于遇到优先数一致的情况,采用FIFO策略解决。
实验结果(可续页)
(续前页)
后记
①设计进程控制块PCB表结构,分别适用于优先数调度算法和循环轮转调度算法。
②建立进程就绪队列。对两种不同算法编制入链子程序。
③编制两种进程调度算法:1)优先数调度;2)循环轮转调度
实验提示
①本程序用两种算法对五个进程进行调度,每个进程可有三个状态(如就绪、执行、结束),并假设初始状态为就绪状态。
②为了便于处理,程序中的某进程运行时间以时间片为单位计算。各进程的优先数或轮转时间数以及进程需运行的时间片数的初始值均由用户给定。
操作系统实验5-调度

实验五调度一、基本信息二、实验内容在设计一个按优先级进行调度的算法(1(2的进程(3)调度时,总是选择优先级最高的执行,并采用动态调度:每运行一次优先级减1,估计运行时间减1(4)进程运行一次后,若剩余的运行时间不为0,且优先级低于就绪队列中的进程,则状态变为ready,并选择一个进程使用CPU;若剩余的运行时间为0,则状态变为完成(5)如就绪队列不空,则重复(3)(4)直到所有进程都结束三、实验目的通过实验,巩固和加深对进程调度的理解,以及各种调度算法的基本实现思想。
四、设计思路和流程图(1)用一个结构体构造进程块,记录进程的各个属性,优先级和估计运行时间随机产生(2)创建一个进程块链表,每个节点表示一个进程块。
用head指针表示链表头部,用curPCB表示当前CPU调度的进程块(3)遍历链表,找到优先级最高的进程“运行”(4)重复调度进直到就绪队列中没有进程时,程序运行结束五、主要数据结构及其说明#include <cstdio>#include <random>#include <time.h>struct PCB{int id;int priority;//数值越大,优先级越高PCB* nextPCB;//指向就绪队列中下一个进程的PCB首址int probTime;//估计运行时间int state;//0: ready, 1: running, 2:finished};void main(){srand((unsigned)time(0));struct PCB *temp = new struct PCB;const int cnt = 3;struct PCB *head = temp;for(int i=0; i<cnt; ++i){temp->id = i;temp->priority = rand() % 10 + 1;temp->probTime = rand() % 10 + 1;temp->state = 0;temp->nextPCB = (i == (cnt-1))?0:new struct PCB;temp = temp->nextPCB;}int max = 0;//最高优先级struct PCB *curPCB;//正在执行的进程int countOfPro = cnt;//记录当前剩余进程数while(countOfPro != 0){for(struct PCB *p = head; p != 0; p = p->nextPCB) {if(p->state != 2 && p->priority > max){max = p->priority;curPCB = p;}}curPCB->priority--;curPCB->probTime--;if(curPCB->probTime <= 0){curPCB->state = 2;countOfPro--;}max = -99999;//打印运行后的进程属性内容printf("current proccess is %d ",curPCB->id);printf("priority is %d ", curPCB->priority);printf("rest time is %d\n", curPCB->probTime);}system("pause");return;}六、程序运行时的初值和运行结果七、实验体会此次实验模拟了系统进程调度,进一步学习了进程调度的机制,加深了对调度的理解。
操作系统实验5 进程调度模拟程序设计

一、实验内容进程调度算法:采用最高优先数优先的调度算法(即把处理机分配给优先数最高的进程)或者时间片轮转法。
每个进程有一个进程控制块(PCB)表示。
进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。
进程的到达时间为进程输入的时间。
进程的运行时间以时间片为单位进行计算。
等待I/O的时间以时间片为单位进行计算,可随机产生,也可事先指定。
每个进程的状态可以是就绪R(Ready)、运行R(Run)、等待(Wait)或完成F(Finish)四种状态之一。
就绪进程获得CPU后都只能运行一个时间片。
用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1(即降低一级),然后把它插入就绪队列等待CPU。
每进行一次调度程序都打印一次运行进程、就绪队列、等待进程以及各个进程的PCB,以便进行检查。
重复以上过程,直到所要进程都完成为止。
用C或C++二、实验目的与要求在采用多道程序设计的设计中的系统中,往往有若干个进程同时处于就绪状态。
当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度工作。
三、实验环境Visual+C++6.0四、实验步骤1、实验准备知识处理器调度总是选对首进程运行。
采用动态改变优先数的办法,进程每运行一次优先数就减“1”。
由于本次实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:优先数—1要求运行时间—1来模拟进程的一次运行。
进程运行一次后,若要求运行时间≠0,则再将它加入队列(按优先数大小插入,且置队首标志);若要求运行时间≠0,则把它的状态修改成“结束”,且结束队列。
操作系统实验报告——调度算法

操作系统实验报告——调度算法1. 实验目的本实验旨在探究操作系统中常用的调度算法,通过编写代码模拟不同的调度算法,了解它们的特点和应用场景。
2. 实验环境本次实验使用的操作系统环境为Linux,并采用C语言进行编码。
3. 实验内容3.1 调度算法1:先来先服务(FCFS)FCFS调度算法是一种简单且常见的调度算法。
该算法按照进程到达的先后顺序进行调度。
在本实验中,我们使用C语言编写代码模拟FCFS算法的调度过程,并记录每个进程的等待时间、周转时间和响应时间。
3.2 调度算法2:最短作业优先(SJF)SJF调度算法是一种非抢占式的调度算法,根据进程的执行时间来选择下一个要执行的进程。
在本实验中,我们使用C语言编写代码模拟SJF算法的调度过程,并计算每个进程的等待时间、周转时间和响应时间。
3.3 调度算法3:轮转调度(Round Robin)Round Robin调度算法是一种经典的时间片轮转算法,每个进程在给定的时间片内依次执行一定数量的时间。
如果进程的执行时间超过时间片,进程将被暂时挂起,等待下一次轮转。
在本实验中,我们使用C语言编写代码模拟Round Robin算法的调度过程,并计算每个进程的等待时间、周转时间和响应时间。
4. 实验结果分析通过对不同调度算法的模拟实验结果进行分析,可以得出以下结论:- FCFS算法适用于任务到达的先后顺序不重要的场景,但对于执行时间较长的进程可能会导致下一个进程需要等待较久。
- SJF算法适用于任务的执行时间差异较大的场景,能够提高整体执行效率。
- Round Robin算法适用于时间片相对较小的情况,能够公平地为每个进程提供执行时间。
5. 实验总结本次实验通过模拟不同调度算法的实际执行过程,深入了解了各种调度算法的原理、特点和适用场景。
通过对实验结果的分析,我们可以更好地选择合适的调度算法来满足实际应用的需求。
在后续的学习中,我们将进一步探索更多操作系统相关的实验和算法。
实验五 Linux页面调度

可见,最高命中率已经由原来的0.9000增加到0.9500。
经过多组实验,我发现当分配页面增加时,最高命中率下降;反之,最高命中率增加。但遇到的问题是始终未找到合适的分配方式使命中率可以达到1,希望老师能给出指导意见。
3)五种算法中,最少访问页面算法较其他四种命中率较低;
4)随着页面序号的上升,五种算法的命中率趋于一致;
5)我认为由于此次实验用到了随机函数,所以要得到更科学合理的结果,应进行多次实验取平均值。
4、关于思考题:要求修改程序,分析各算法在用户内存容量达到多大时命中率为1。经过思考,我发现需要对页数进行修改,从而达到修改页地址流长度的目的,进而改变各算法命中率:
实验报告
姓名
学号
专业班级
课程名称
操作系统实验
实验日期
成绩
指导教师
批改日期
实验名称
实验五Linux页面调度
一、实验目的:
1、理解虚拟存储管理技术的管理原理和特点
2、掌握基本的内存管理知识,能够实时查看内存、回收内存3、掌握请求也是存储管理页面调度算法二、实验要求:
Time参数为页面在内存中的时间;
经过对代码中各种页面置换算法的分析,我得到如下流程图:
三、实验内容与步骤:
1、用free命令健康内存使用情况
2、用vmstat命令件事虚拟内存的使用情况
3、经过对mm_test.c的编译与运行后,我对产生的结果进行了分析,表格如下:
经分析我得出一下几点结论:
1)五种算法在页面序号升高的情况下,命中率也基本呈上升趋势;
2)五种算法中,最佳淘汰算法较其他四种有较高的命中率;
调度的调度算法实验报告

调度的调度算法实验报告调度的调度算法实验报告引言:调度是计算机科学中一个重要的概念,它涉及到任务分配、资源管理和优化等方面。
调度算法则是实现调度的关键,它决定了任务的执行顺序和资源的分配方式。
在本次实验中,我们将探讨几种常见的调度算法,并通过实验对其性能进行评估和比较。
一、先来先服务算法(FCFS)先来先服务算法是最简单的调度算法之一,它按照任务到达的先后顺序进行处理。
实验中,我们模拟了一个任务队列,每个任务有不同的执行时间。
通过实验结果可以看出,FCFS算法的优点是简单易懂,但当任务的执行时间差异较大时,会导致平均等待时间较长。
二、最短作业优先算法(SJF)最短作业优先算法是一种非抢占式调度算法,它根据任务的执行时间来进行排序。
实验中,我们将任务按照执行时间从短到长进行排序,并进行调度。
实验结果显示,SJF算法的优点是能够最大程度地减少平均等待时间,但当任务的执行时间无法预测时,该算法可能会导致长任务等待时间过长的问题。
三、时间片轮转算法(RR)时间片轮转算法是一种抢占式调度算法,它将任务分为多个时间片,并按照顺序进行调度。
实验中,我们设置了每个时间片的长度,并将任务按照到达顺序进行调度。
实验结果表明,RR算法的优点是能够公平地分配资源,但当任务的执行时间超过一个时间片时,会导致上下文切换频繁,影响系统的性能。
四、最高响应比优先算法(HRRN)最高响应比优先算法是一种动态调度算法,它根据任务的等待时间和执行时间来计算响应比,并选择响应比最高的任务进行调度。
实验中,我们根据任务的到达时间、执行时间和等待时间计算响应比,并进行调度。
实验结果显示,HRRN算法能够在一定程度上平衡长任务和短任务的等待时间,但当任务的执行时间过长时,会导致其他任务的等待时间过长。
五、多级反馈队列算法(MFQ)多级反馈队列算法是一种综合性的调度算法,它将任务分为多个队列,并根据任务的执行情况进行调度。
实验中,我们设置了多个队列,并根据任务的执行时间和等待时间进行调度。
指令调度和延迟分支实验总结

指令调度和延迟分支实验总结指令调度和延迟分支是计算机体系结构中的两个重要概念。
指令调度是指在执行指令时,通过优化指令的顺序和调整执行时间,以提高CPU的效率。
而延迟分支则是为了避免CPU在等待分支结果时浪费时间,采用一种预测技术来减少分支对CPU效率的影响。
一、指令调度1. 指令调度的概念指令调度是一种优化技术,通过重新排列程序中的指令顺序,使得CPU能够更好地利用其硬件资源。
在执行程序时,CPU需要从内存中读取指令,并将其解码为可执行操作码。
然后,CPU根据操作码进行运算,并将结果写回内存。
2. 指令调度的优点(1)提高CPU效率:通过重新排列程序中的指令顺序,可以使得CPU更好地利用其硬件资源,从而提高效率。
(2)减少空闲时间:由于程序中存在大量独立的操作,因此可以通过将这些操作组合起来执行,从而减少空闲时间。
(3)提高缓存命中率:由于现代计算机都采用了多级缓存结构,在进行数据访问时会涉及到缓存命中率的问题。
指令调度可以通过重新排列程序中的指令顺序,使得CPU能够更好地利用缓存,从而提高命中率。
3. 指令调度的实现方法(1)静态调度:在编译程序时,对程序进行指令重排,生成新的可执行代码。
(2)动态调度:在程序运行时,根据当前CPU状态和任务负载情况,动态地调整指令执行顺序。
二、延迟分支1. 延迟分支的概念延迟分支是一种预测技术,通过预测分支结果来减少CPU在等待分支结果时浪费时间。
由于分支语句会导致程序流程的改变,因此在执行分支语句时需要等待条件判断结果。
如果条件成立,则跳转到目标地址;否则继续执行下一条指令。
2. 延迟分支的优点(1)减少CPU空闲时间:由于CPU不需要等待分支结果就可以继续执行下一条指令,因此可以减少空闲时间。
(2)提高CPU效率:通过预测分支结果来减少CPU等待时间,从而提高效率。
3. 延迟分支的实现方法(1)静态预测:在编译程序时,对程序中的分支语句进行预测,并将预测结果保存在可执行代码中。
指令调度实验报告

运行调度前的程序sch-before.s,查看Statistics窗口中的各种统计数字如下:
运行调度后的程序sch-after.s,查看Statistics窗口中的各种统计数字如下:
九、实验结论:
十、总结及心得体会:
十一、对本实验过程及方法、手段的改进建议:
报告评分:
指导教师签字:
2.将程序sch-before.s装入主存后运行。记录程序运行过程中各种相关发生的次数以及程序执行的总时钟周期数。
3.将程序sch-after.s装入主存后运行。记录程序执行过程中各种相关发生的次数以及程序执行的总时钟周期数。
4.根据记录结果,比较调度前和调度后的性能。
5.论述指令调度对于提高CPU性能的意义。
4.根据记录结果,比较调度前和调度后的性能。
5.论述指令调度对于提高CPU性能的意义(重要)。
六、实验器材(设备、元器件):
PC微机一台
七、实验步骤及操作:
1.在主窗口中点击Configuration打开菜单,然后点击Floating Point Stages菜单项,把除法单元数设置为3,把加法、乘法、除法的延迟设置为3个时钟周期。
实验报告
学生姓名:
学号:
一、实验室名称:计算机学院计算中心
二、实验项目名称:指令调度
三、实验原理:
在非线形流水线中,不能每一个时钟周期向流水线输入一个新任务,否则会发生在同一个时刻有几个任务争用同一个功能段的情况。这种情况称为流水线冲突。
为了避免冲突,一般采用延迟输入新任务的方法。应该间隔多少时钟周期向流水线输入一个新任务就是非线性流水线的调度问题。
非线性流水线调度的就是找出一个最小的循环周期,按照这周期向流水线输入新任务,流水线的各个功能段都不会发生、实验目的:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验5 指令调度和延迟分支
一.实验目的
(1)加深对指令调度技术的理解。
(2)加深对延迟分支技术的理解。
(3)熟练掌握用指令调度技术解决流水线中的数据冲突的方法。
(4)进一步理解指令调度技术对CPU性能的改进。
(5)进一步理解延迟分支技术对CPU性能的改进。
二.实验内容和步骤:
(1)、启动MIPSsim。
(2)、根据前面的相关知识中关于流水线各段操作的描述,进一步理解流水线窗口中各段的功能,掌握各流水寄存器的含义。
指令流水线有取指(IF)、译码(ID)、执行(EX)、访存(MEM)、写回寄存器堆(WB)5个过程段,共有7条指令连续输入此流水线
IF段(取指):取指令,控制器必须具备能自动地从存储器中取出指令的功能
ID段(译码):指令译码、读寄存器
EX段(执行):执行、访存有效地址字段
MEM段(访存):存储器访问
WB(写回寄存器堆):结果写回寄存器
在该窗口中,每一个矩形方块代表一个流水段,它们用不同的颜色填充。
在该窗口的左侧是IF到WB段,其右边为浮点部件。
浮点部件分有浮点加法部件(fadd)、浮点乘法部件(fmul)和浮点除法部件(fdiv)三种。
在菜单“配置” “常规配置”中修改浮点部件个数,可看到该窗口中对应类型的浮点部件个数会发生相应的变化。
(3)、选择“配置”->“流水方式”选项,使模拟器工作于流水方式下。
(4)、用指令调度技术解决流水线中的数据冲突。
1)启动MIPSsim。
2)加载schedule.s。
3)关闭定向功能。
4)执行所载入的程序。
通过查看统计数据和时钟周期图,找出并记录程序执行过程中各种冲突发生的次数、发生冲突的指令组合以及程序执行的总时钟周期数。
调度前:
RAW发生的冲突周期数:2、3、5、6、8、9、11、12、15、16、18、
19、21、22、25、26
由以上可知:
RAW数据冲突发生了16次,其中load停顿6次,自陷停顿1次,停顿周期总数17次
执行过程中各种冲突发生次数:16次
程序执行的总时钟周期数:33次
发生冲突的指令组合:
TEQ $r0,$r0
ADDIU $r1,$r0,56
LW $r2,0($r1) 与上条写后读冲突;
ADD $r4,$r0,$r2 与上条指令写后读冲突;
SW $r4,0($r1)与上条指令写后读冲突;
LW $r6,4($r1)
ADD $r8,$r6,$r1 与上条指令写后读冲突;
MUL $r12,$r10,$r1
ADD $r16,$r12,$r1 与上条指令写后读冲突;
ADD $r18,$r16,$r1 与上条指令组件冲突
SW $r18,16($r1) 与上条指令写后读冲突;
LW $r20,8($r1)
MUL $r22,$r20,$r14与上条指令写后读冲突;
5)采用指令调度技术对程序进行指令调度,消除冲突。
将调度后的程序存到after-schedule.s中。
6)载入after-schedule.s。
7)执行该程序。
观察程序在流水线中的执行情况,记录程序执行的总时钟
周期数。
调度后:
执行总时钟周期数为19,其中RAW停顿2次、load停顿0次、自陷停顿1次。
停顿总周期占总执行周期的15.78947%。
8)根据记录结果,比较调度前和调度后的性能。
论述指令调度对于提高CPU性能的作用。
根据记录结果:指令调度后时钟总周期数从33降低到19,指令调度使指令顺序重新组合,可以消除部分的数据冲突,从而通过指令调度技术显著地提高了CPU的使用率,大大减少了指令冲突的次数,提高了CPU的性能。
指令调度的优劣直接影响CPU性能的发挥好坏,好的指令调度可以让停顿周期
大幅度减少。
(5)、用延迟分支减少分支指令对性能的影响。
1)启动MIPSsim。
2)载入branch.s。
3)关闭延迟分支功能。
单击“配置” “延迟槽”,使处于关闭状态即为默认状态4)执行该程序。
观察并记录发生分支延迟的时刻。
没有采用分支延迟:
答:发生分支延迟的时刻为:第18周期。
5)记录执行该程序所用的总时钟周期数。
执行周期总数为38,其中RAW停顿16次、load停顿4次、控制停顿0次、自陷停顿1次。
总停顿周期占总执行周期的50%。
6)假设延迟槽有1个,对branch.s进行指令调度,然后保存到“delayed-branch.s”中。
7)载入delayed-branch.s。
8)打开延迟分支功能。
单击“配置” “延迟槽”,使该项前有√来实现9)执行该程序。
观察其时钟周期图。
采用分支延迟:
10)记录执行该程序所用的总时钟周期数。
总时钟周期数为26。
其中RAW停顿4次、load停顿2次、自陷停顿1次。
总停顿周期占总执行周期的19.23077%。
11)对比上述两种情况下的时钟周期图。
见上图
12)根据记录结果,比较没采用延迟分支和采用了延迟分支的性能之间的不同。
论述延迟分支对于提高CPU性能的作用。
答:没采用分支延迟的时候周期总数为38,采用分支后的周期总数为26,可知,
在使用延迟槽后,指令在运行到跳转指令时,不会出现延迟等待,则能够提高CPU的性能。
并且在使用延迟后,指令在运行到跳转指令时,不会出现延迟等待,则能够提高CPU的性能。
所以只要分支延迟槽中的指令是够用的,流水线中就没有停顿,这时延迟分支的方法就能很好的减少分支延迟。
所以放入延迟槽中的指令是很重要的,对CPU性能的影响是很显著的!
分支延迟槽(Branch delay slot),简单地说就是位于分支指令后面的一条指令,不管分支发生与否其总是被执行,而且位于分支延迟槽中的指令先于分支指令提交(commit)。
三.实验结果分析
实验结论:指令调度让指令顺序重新组织后能消除部分的数据冲突,指令调度的优劣直接影响CPU性能的发挥好坏,好的指令调度可以让停顿周期大幅度减少。
只要分支延迟槽中的指令时有用的,流水线中就没有停顿,这是延迟分支的方法就能很好的减少分支延迟,所以放入延迟槽中的指令是很重要的,对CPU 性能的影响是显著的。
1.了解了什么是指令调度以及指令调度对CPU性能的影响:
指令调度:
为了减少停顿,对于无法使用定向技术解决的问题,可以通过指令调度让指令顺序重新组织后能消除部分的数据冲突,指令调度的优劣直接影响CPU性能的发挥好坏,好的指令调度可以让指令周期大幅度减少。
指令调度对CPU性能的影响:
指令调度技术减少了指令冲突的次数,提高了CPU的性能。
2.延迟分支:
位于分支指令后面的一条指令,不管分支发生与否其总是被执行,而且位于分支延迟槽中的指令先于分支指令提交。
只要分支延迟槽中的指令时有用的,流水线中就没有停顿,这是延迟分支的方法就能很好的减少分支延迟,所以放入延迟槽中的指令是很重要的,对CPU性能的影响是显著的。
延迟分支对CPU性能的影响:
延迟分支减少分支指令能够稍微提高GPU的性能。
3.了解到执行分支指令的结果有两种:一种是分支“成功”,PC的值改变为分支转移的目标地址,另一种情况分支“不成功”,这是PC的值保持正常递增,指向顺序的下一条指令。
四.实验心得
通过本次实验锻炼了我的动手操作能力,我对指令调度和延迟分支有了进一步的了解和掌握,我学到了分支延迟调度的方法,并初步掌握了用指令调度技术解决指令流水线中的数据冲突问题的方法。
理解了指令调度技术和延迟分支技术对CPU性能的改进。
我学习到了指令调度方式以及延迟分支调度方式对CPU性能的影响,就指令调度方式来,说通过使发生冲突的指令改变顺序,或者删除其中一部分指令,或者增加一部分指令,对CPU的性能影响是不一样的,使我对该章的知识有了深入的了解并且能够运用。
这对我以后的计算机组成原理的学习打下了坚实的基础,让我不断提高,增长了我的知识。