先来先服务调度和最短作业优先调度算法实验报告

合集下载

操作系统调度算法实验报告

操作系统调度算法实验报告

操作系统调度算法实验报告
本实验旨在研究不同操作系统调度算法在实际应用中的表现和影响。

我们选择了三种常见的调度算法进行对比分析,分别是先来先服务(FCFS)、最短作业优先(SJF)和时间片轮转(RR)。

1. 实验准备
在开始实验之前,我们首先搭建了一个简单的模拟环境,包括一个CPU和多个进程。

每个进程具有不同的执行时间,以便模拟不同情况
下的调度效果。

2. 先来先服务(FCFS)
先来先服务是最简单的调度算法之一,即根据进程到达的顺序依次
执行。

实验结果显示,FCFS算法适用于处理大量长作业,但当出现短
作业时会导致平均等待时间较长。

3. 最短作业优先(SJF)
最短作业优先算法会优先执行执行时间最短的进程,以减少平均等
待时间。

在我们的实验中,SJF算法表现出色,尤其在短作业较多的情
况下,能够显著提高系统的响应速度。

4. 时间片轮转(RR)
时间片轮转算法将CPU时间分配给每个进程,每个进程执行一个
时间片后轮转到下一个进程。

然而,RR算法可能导致上下文切换频繁,
影响系统效率。

在实验中,我们发现RR算法在处理多任务时效果较好,但在处理长时间任务时表现一般。

5. 实验总结
通过对三种调度算法的实验比较,我们可以看出不同算法在不同情
况下有着不同的优势和劣势。

在实际应用中,需要根据具体情况选择
合适的调度算法,以提高系统的性能和效率。

希望本实验能为操作系
统调度算法的研究提供一定的参考价值。

操作系统实验报告——调度算法

操作系统实验报告——调度算法

操作系统实验报告——调度算法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. 实验总结本次实验通过模拟不同调度算法的实际执行过程,深入了解了各种调度算法的原理、特点和适用场景。

通过对实验结果的分析,我们可以更好地选择合适的调度算法来满足实际应用的需求。

在后续的学习中,我们将进一步探索更多操作系统相关的实验和算法。

调度的调度算法实验报告

调度的调度算法实验报告

调度的调度算法实验报告调度的调度算法实验报告引言:调度是计算机科学中一个重要的概念,它涉及到任务分配、资源管理和优化等方面。

调度算法则是实现调度的关键,它决定了任务的执行顺序和资源的分配方式。

在本次实验中,我们将探讨几种常见的调度算法,并通过实验对其性能进行评估和比较。

一、先来先服务算法(FCFS)先来先服务算法是最简单的调度算法之一,它按照任务到达的先后顺序进行处理。

实验中,我们模拟了一个任务队列,每个任务有不同的执行时间。

通过实验结果可以看出,FCFS算法的优点是简单易懂,但当任务的执行时间差异较大时,会导致平均等待时间较长。

二、最短作业优先算法(SJF)最短作业优先算法是一种非抢占式调度算法,它根据任务的执行时间来进行排序。

实验中,我们将任务按照执行时间从短到长进行排序,并进行调度。

实验结果显示,SJF算法的优点是能够最大程度地减少平均等待时间,但当任务的执行时间无法预测时,该算法可能会导致长任务等待时间过长的问题。

三、时间片轮转算法(RR)时间片轮转算法是一种抢占式调度算法,它将任务分为多个时间片,并按照顺序进行调度。

实验中,我们设置了每个时间片的长度,并将任务按照到达顺序进行调度。

实验结果表明,RR算法的优点是能够公平地分配资源,但当任务的执行时间超过一个时间片时,会导致上下文切换频繁,影响系统的性能。

四、最高响应比优先算法(HRRN)最高响应比优先算法是一种动态调度算法,它根据任务的等待时间和执行时间来计算响应比,并选择响应比最高的任务进行调度。

实验中,我们根据任务的到达时间、执行时间和等待时间计算响应比,并进行调度。

实验结果显示,HRRN算法能够在一定程度上平衡长任务和短任务的等待时间,但当任务的执行时间过长时,会导致其他任务的等待时间过长。

五、多级反馈队列算法(MFQ)多级反馈队列算法是一种综合性的调度算法,它将任务分为多个队列,并根据任务的执行情况进行调度。

实验中,我们设置了多个队列,并根据任务的执行时间和等待时间进行调度。

操作系统实验_先来先服务的调度算法及短作业优先

操作系统实验_先来先服务的调度算法及短作业优先

操作系统实验_先来先服务的调度算法及短作业优先1.引言操作系统的调度算法是指在多进程环境中,操作系统为进程分配CPU 的顺序和策略。

先来先服务(FCFS)调度算法是最简单的调度算法之一,它按照进程到达的顺序为其分配CPU。

而短作业优先(SJF)调度算法是根据进程的执行时间来为其分配CPU,执行时间越短的进程越先执行。

本文将分别介绍FCFS调度算法和SJF调度算法,并对其进行评价和比较。

2.先来先服务(FCFS)调度算法2.1调度原理FCFS调度算法的原理非常简单,按照进程到达的顺序为其分配CPU。

当一个进程进入就绪队列后,如果CPU空闲,则立即为其分配CPU。

如果CPU正忙,则进程进入等待队列,等待CPU空闲后再分配。

在该算法中,进程的运行时间不考虑,只考虑进程到达的时间。

2.2优点与缺点FCFS调度算法的主要优点是实现简单,无需对进程的运行时间进行估计。

但FCFS算法存在一定的缺点。

首先,长作业在短作业前面等待的时间较长,可能导致长作业的响应时间过长。

其次,如果有一个进程出现阻塞或响应时间过长,其后面的进程也会受到影响,造成整个系统的性能下降。

3.短作业优先(SJF)调度算法3.1调度原理短作业优先(SJF)调度算法是根据进程的执行时间来为其分配CPU。

当一个进程进入就绪队列后,如果其执行时间比当前正在运行的进程短,则优先为该进程分配CPU。

如果当前没有运行的进程或者当前运行的进程执行完毕,则立即为该进程分配CPU。

在该算法中,进程的到达时间不考虑,只考虑进程的执行时间。

3.2优点与缺点SJF调度算法的主要优点是可以最大程度地减少平均等待时间,提高系统的吞吐量。

短作业可以快速执行完毕,从而让更多的作业得以执行。

但SJF算法存在一定的缺点。

首先,需要对进程的执行时间有一个准确的估计,对于实时系统或动态系统来说,估计执行时间可能会有一定的误差。

其次,在长作业激增的情况下,短作业可能会一直得不到CPU的分配,造成长时间的等待。

先来先服务调度和最短作业优先调度算法实验报告

先来先服务调度和最短作业优先调度算法实验报告

先来先服务调度和最短作业优先调度算法实验报告实验报告一、实验目的本实验旨在通过编写代码实现先来先服务调度算法和最短作业优先调度算法,以深入理解和掌握这两种调度算法的原理和实现方法。

二、实验方法和原理1.先来先服务调度算法(FCFS)2.最短作业优先调度算法(SJF)最短作业优先调度算法是根据作业所需的运行时间进行调度的。

当一个作业到达并获得CPU后,系统会选择剩余运行时间最短的作业进行处理,这样可以最大化地提高系统的吞吐量。

三、实验过程与结果1.先来先服务调度算法的实现我们先定义一个作业类Job,其中包含作业名称、到达时间和运行时间等属性。

首先根据到达时间对作业队列进行排序,然后按照顺序执行作业,记录每个作业的开始时间、结束时间和周转时间等指标。

下面是先来先服务调度算法的代码实现部分:```pythonclass Job: = namedef fcfs_scheduler(jobs):for job in sorted_jobs:#创建作业队列jobs =Job("Job1", 0, 3),Job("Job2", 1, 4),Job("Job3", 2, 2),Job("Job4", 4, 1)#调度作业fcfs_scheduler(jobs)#输出结果for job in jobs:```运行以上代码,会得到作业的开始时间、结束时间和周转时间等信息。

2.最短作业优先调度算法的实现最短作业优先调度算法需要知道每个作业的运行时间,而这个信息在实际情况中是未知的。

因此,我们可以先按到达时间对作业队列进行排序,然后在每个时间片中选择剩余运行时间最短的作业进行执行。

下面是最短作业优先调度算法的代码实现部分:```pythondef sjf_scheduler(jobs):while True:if not remaining_jobs:break#创建作业队列jobs =Job("Job1", 0, 3),Job("Job2", 1, 4),Job("Job3", 2, 2),Job("Job4", 4, 1)#调度作业sjf_scheduler(jobs)#输出结果for job in jobs:```运行以上代码,会得到相应的作业调度结果。

调度算法的实验报告

调度算法的实验报告

一、实验目的1. 理解操作系统调度算法的基本原理和概念。

2. 掌握几种常见调度算法的原理和实现方法。

3. 分析不同调度算法的性能特点,为实际应用提供参考。

二、实验内容本次实验主要涉及以下几种调度算法:先来先服务(FCFS)、最短作业优先(SJF)、优先级调度(Priority Scheduling)、最高响应比优先(HRRN)和时间片轮转(Round Robin)。

1. 先来先服务(FCFS)调度算法FCFS调度算法按照进程到达就绪队列的顺序进行调度,先到达的进程先执行。

该算法简单易实现,但可能导致长作业等待时间过长,从而降低系统吞吐量。

2. 最短作业优先(SJF)调度算法SJF调度算法优先选择执行时间最短的进程进行调度。

该算法可以最大程度地减少平均等待时间和平均周转时间,但可能导致长作业等待时间过长。

3. 优先级调度(Priority Scheduling)算法优先级调度算法为每个进程设置一个优先级,优先选择优先级高的进程进行调度。

该算法可以满足高优先级作业的需求,但可能导致低优先级作业长时间等待。

4. 最高响应比优先(HRRN)调度算法HRRN调度算法为每个进程设置一个响应比,优先选择响应比高的进程进行调度。

响应比是作业的等待时间与作业所需时间的比值。

该算法综合考虑了作业的等待时间和所需时间,是一种较为公平的调度算法。

5. 时间片轮转(Round Robin)调度算法时间片轮转调度算法将CPU时间划分为固定的时间片,按照进程到达就绪队列的顺序,每次只允许一个进程运行一个时间片。

如果进程在一个时间片内无法完成,则将其放入就绪队列的末尾,等待下一次调度。

该算法可以平衡各个进程的执行时间,但可能导致进程响应时间较长。

三、实验步骤1. 编写一个进程调度程序,实现上述五种调度算法。

2. 生成一个包含多个进程的作业队列,每个进程具有到达时间、所需运行时间和优先级等信息。

3. 分别采用五种调度算法对作业队列进行调度,并记录每个进程的执行情况。

操作系统实验_先来先服务的调度算法及短作业优先

操作系统实验_先来先服务的调度算法及短作业优先

操作系统实验_先来先服务的调度算法及短作业优先先来先服务调度算法是一种非抢占式的调度算法,它按照作业到达的先后顺序将作业分配给CPU。

具体来说,当一个作业进入就绪队列时,调度程序将把它放在队列的末尾,然后从队列的头部选择一个作业执行。

只有当一个作业执行完成后,作业队列的头部才会选择下一个作业执行。

先来先服务调度算法的优点是简单易实现,没有复杂的排序操作,适用于短作业和长作业混合的场景。

其缺点是没有考虑作业的执行时间,导致长作业会占用CPU很长时间,影响其他作业的响应时间。

短作业优先调度算法是一种抢占式的调度算法,它根据作业的执行时间选择优先级。

具体来说,当一个作业进入就绪队列时,调度程序会比较该作业的执行时间和其他就绪作业的执行时间,并选择执行时间最短的作业执行。

如果有一个新的作业到达,且其执行时间比当前执行的作业要短,那么调度程序会中断当前作业的执行并切换到新的作业执行。

短作业优先调度算法的优点是能够最大程度上减少作业的等待时间和响应时间,提高系统的吞吐量。

其缺点是需要对作业的执行时间有较准确的估计,否则可能导致长作业陷入饥饿状态。

此外,由于需要频繁进行作业的切换,短作业优先调度算法在实现上相对复杂。

在实际应用中,先来先服务调度算法适用于短作业和长作业混合的场景,或者作业的执行时间无法估计准确的情况下。

例如,在批处理系统中,作业的执行时间往往是固定的,先来先服务调度算法可以保证公平性,并且能够有效利用CPU资源。

而短作业优先调度算法适用于多任务环境下,作业的执行时间可以估计准确的情况下。

例如,在交互式系统中,用户的操作往往是短暂的,短作业优先调度算法可以最大限度地减少用户的等待时间,提高系统的响应速度。

总之,先来先服务调度算法和短作业优先调度算法是操作系统中常用的两种调度算法。

它们分别适用于不同的应用场景,在实际应用中可以根据具体需求选择不同的调度算法。

先来先服务,时间片调度,优先级调度算法实验报告

先来先服务,时间片调度,优先级调度算法实验报告

先来先服务,时间片调度,优先级调度算法实验报告先来先服务、时间片调度、优先级调度算法实验报告1. 引言本次实验旨在研究和比较先来先服务(FCFS)、时间片调度(RR)和优先级调度(Priority Scheduling)三种常见的进程调度算法。

进程调度是操作系统中的重要概念之一,合理的进程调度算法可以提高系统效率,优化资源利用。

2. 先来先服务算法•先来先服务算法是一种简单的调度算法,按照进程到达的顺序进行调度。

•优点:简单易实现,适用于长作业。

•缺点:容易造成短作业等待时间过长,无法满足实时性要求。

3. 时间片调度算法•时间片调度算法将CPU时间划分为一段一段的时间片,每个进程在一个时间片内执行。

•若进程未完成,会被放入就绪队列的末尾,等待下一个时间片。

•优点:公平,适用于短作业,能满足实时性要求。

•缺点:时间片过长,会导致长作业等待时间过长。

4. 优先级调度算法•优先级调度算法根据进程的优先级来确定调度顺序,拥有最高优先级的进程先执行。

•静态优先级可在创建进程时确定,动态优先级可根据进程执行情况进行调整。

•优点:适用于实时任务和长作业,可根据需求调整优先级。

•缺点:可能导致低优先级任务等待时间过长,存在优先级反转问题。

5. 实验结果与分析通过对三种调度算法的实验测试,得出以下结论:•FCFS算法在长作业的情况下表现较好,但对于短作业不友好,容易造成长时间等待;•RR算法适用于短作业,能保证公平性,但时间片过长可能导致长作业等待时间过长;•优先级调度算法较为灵活,能满足实时性要求,但可能导致低优先级任务长时间等待。

综上所述,不同的调度算法适用于不同的场景,根据需求选择合适的算法可提高系统效率。

6. 总结本次实验对先来先服务、时间片调度和优先级调度算法进行了研究和比较。

通过对三种算法的分析,我们可以根据任务特点和需求选择合适的调度算法,以提高系统的效率和资源利用率。

同时,在实际应用中也需要考虑进程的实时性要求,避免长时间等待等问题的出现。

作业调度算法(先来先服务算法,短作业算法)

作业调度算法(先来先服务算法,短作业算法)

《操作系统》实验报告题目:作业调度算法班级:网络工程姓名:朱锦涛学号:E31314037一、实验目的用代码实现页面调度算法,即先来先服务(FCFS)调度算法、短作业优先算法、高响应比优先调度算法。

通过代码的具体实现,加深对算法的核心的理解。

二、实验原理1.先来先服务(FCFS)调度算法FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。

当在作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的作业,而不管该作业所需执行的时间的长短,从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程。

然后把它放入就绪队列。

2.短作业优先算法SJF算法是以作业的长短来计算优先级,作业越短,其优先级越高。

作业的长短是以作业所要求的运行时间来衡量的。

SJF算法可以分别用于作业和进程调度。

在把短作业优先调度算法用于作业调度时,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存。

3、高响应比优先调度算法高响应比优先调度算法则是既考虑了作业的等待时间,又考虑了作业的运行时间的算法,因此既照顾了短作业,又不致使长作业等待的时间过长,从而改善了处理机调度的性能。

如果我们引入一个动态优先级,即优先级是可以改变的令它随等待的时间的延长而增加,这将使长作业的优先级在等待期间不断地增加,等到足够的时间后,必然有机会获得处理机。

该优先级的变化规律可以描述为:优先权 = (等待时间 + 要求服务时间)/要求服务时间三、实验内容源程序:#include<stdio.h>#include<stdlib.h>#include<time.h>struct work{i nt id;i nt arrive_time;i nt work_time;i nt wait;f loat priority;};typedef struct sjf_work{s truct work s_work; //数据域s truct sjf_work * pNext; //指针域}NODE,*PNODE;void FCFS();void SJF();void showmenu();bool Is_empty(PNODE pHead);int cnt_work(PNODE pHead);PNODE do_work(PNODE pHead,int *w_finish_time,int i);void show(int *w_finish_time,int i,PNODE q,int*w_rel_time);void HRRN();PNODE priorit(PNODE pHead);void do_work_1(PNODE pHead,int *w_finish_time,int i);int main(){i nt choice; //设置选择数s howmenu(); //显示菜单s canf("%d",&choice);w hile(choice != 0) //选择算法{switch(choice){case 1 :printf("您选择的是先来先服务算法:\n");FCFS();break;case 2 :printf("您选择的是短作业优先算法:\n");SJF();break;case 3 :printf("您选择的是高响应比优先调度算法\n");HRRN();break;default:printf("请重新选择!");break;}printf("\n");printf("下面是菜单,请继续,或者按‘0’退出"); showmenu();scanf("%d",&choice);}p rintf("感谢您使用本系统,再见!");r eturn 0;}void FCFS(){i nt j,k;i nt w_rel_time[5];i nt w_finish_time[5];f loat rel_time = 0;struct work temp;i nt i;s truct work w[5];s rand(time(0));f or(i=0;i<5;i++){w[i].id = rand()%10;w[i].arrive_time = rand()%10;w[i].work_time = rand()%10+1;}f or(j=0;j<5;j++){printf("第%d个作业的编号是:%d\t",j+1,w[j].id);printf("第%d个作业到达时间:%d\t",j+1,w[j].arrive_time);printf("第%d个作业服务时间:%d\t",j+1,w[j].work_time);printf("\n");}for(j=1;j<5;j++)for(k=0;k<5-j;k++){if(w[k].arrive_time > w[k+1].arrive_time){temp = w[k];w[k] = w[k+1];w[k+1] = temp;}}printf("\n");w_finish_time[0] = w[0].arrive_time + w[0].work_time;for(j=0;j<5;j++){if(w_finish_time[j] < w[j+1].arrive_time){w_finish_time[j+1] = w[j+1].arrive_time + w[j+1].work_time;}elsew_finish_time[j+1] = w_finish_time[j] +w[j+1].work_time;}for(j=0;j<5;j++)w_rel_time[j] = w_finish_time[j] -w[j].arrive_time;for(j=0;j<5;j++){rel_time += w_rel_time[j];}for(j=0;j<5;j++){printf("第%d个系统执行的作业到达时间:%d ",j+1,w[j].arrive_time);printf("编号是:%d ",w[j].id);printf("服务时间是:%d ",w[j].work_time);printf("完成时间是:%d ",w_finish_time[j]);printf("周转时间是:%d ",w_rel_time[j]);printf("\n");}printf("平均周转时间:%f\n",rel_time/5);}void SJF(){i nt w_rel_time[10];i nt w_finish_time[10];f loat rel_time = 0;s rand(time(0));i nt i;i nt j = 0;P NODE pHead = (PNODE)malloc(sizeof(NODE));i f (NULL == pHead){printf("分配失败, 程序终止!\n");exit(-1);}P NODE pTail = pHead;p Tail->pNext = NULL; //定义该链表有头结点,且第一个节点初始化为空f or(i=0;i<10;i++){PNODE pNew = (PNODE)malloc(sizeof(NODE));if (NULL == pNew){printf("分配失败, 程序终止!\n");exit(-1);}pNew->s_work.id = rand()%100;pNew->s_work.arrive_time = rand()%10;pNew->s_work.work_time = rand()%10+1;pTail->pNext = pNew;pNew->pNext = NULL;pTail = pNew;}P NODE p = pHead->pNext; //p指向第一个节点w hile (NULL != p){printf("第%d个作业的编号是:%d\t",j+1,p->s_work.id);printf("第%d个作业到达时间:%d\t",j+1,p->s_work.arrive_time);printf("第%d个作业服务时间:%d\t",j+1,p->s_work.work_time);printf("\n");p = p->pNext;printf("\n");j++;}p = pHead->pNext;P NODE q = p; //p,q都指向第一个节点p = p->pNext;w hile(p != NULL){if(p->s_work.arrive_time < q->s_work.arrive_time)q = p;p = p->pNext;}P NODE r = pHead->pNext; //r也指向第一个节点i nt cnt = 0; //记录所有节点数据域中到达时间最短且相等的个数w hile(r!= NULL){if( r->s_work.arrive_time == q->s_work.arrive_time ) cnt++;r = r->pNext;}p = pHead->pNext;w hile(p != NULL) //在相等到达时间的作业中找服务时间最短的作业{if(cnt > 1){if( p->s_work.arrive_time ==q->s_work.arrive_time )if( p->s_work.work_time < q->s_work.work_time )q = p;p = p->pNext;}elsep =NULL;} //确定q所指作业最先到达且服务时间最短w_finish_time[0] = q->s_work.arrive_time +q->s_work.work_time;w_rel_time[0] = w_finish_time[0] -q->s_work.arrive_time;p rintf("第1个系统执行的作业到达时间:%d",q->s_work.arrive_time);p rintf("编号是:%d ",q->s_work.id);p rintf("服务时间是:%d \n",q->s_work.work_time); p rintf("完成时间是:%d ",w_finish_time[0]);p rintf("周转时间是:%d \n",w_rel_time[0]);p = pHead; //寻找q的前一个节点,方便删掉q节点w hile( p->pNext != q ){p = p->pNext;}p->pNext = q->pNext;f ree(q);q = NULL;f or(i=0;i<9&&!Is_empty(pHead);i++){printf("现在系统还剩%d个作业!\n",cnt_work(pHead));q = do_work(pHead,w_finish_time,i);show(w_finish_time,i,q,w_rel_time);p = pHead; //寻找q的前一个节点,方便删掉q节点while( p->pNext != q ){p = p->pNext;}p->pNext = q->pNext;free(q);q = NULL;}f or(j=0;j<10;j++)rel_time += w_rel_time[j];}printf("平均周转时间:%f\n",rel_time/10);}bool Is_empty(PNODE pHead) //判断作业是否做完{P NODE p;p = pHead->pNext;i nt len = 0;w hile(p != NULL){len++;p = p->pNext;}i f(len == 0)return true; //当没有作业时,返回为真e lsereturn false;}int cnt_work(PNODE pHead) //计算当前还剩多少作业{P NODE p;p = pHead->pNext;i nt len = 0;w hile(p != NULL){len++;p = p->pNext;}r eturn len;}PNODE do_work(PNODE pHead,int *w_finish_time,int i) {P NODE p,q;i nt cnt = 0; //计数器清0,计算当前作业完成时,系统中有多少个作业已经到达p = pHead->pNext;q = p;w hile(p != NULL){if( p->s_work.arrive_time <= w_finish_time[i] ){cnt ++;q = p;p = p->pNext;}else{p = p->pNext;}} //q指向当前到达时间小于刚刚完成的作业,但不一定是服务时间最短的(如果有的话)p rintf("系统中有%d个作业在当前作业完成时已经到达!\n",cnt);p = pHead->pNext;w hile(p != NULL){if(cnt>1) //执行此次判断后,q现在指向所有条件都满足的作业(如果有的话){if( p->s_work.arrive_time <= w_finish_time[i] ){if( p->s_work.work_time < q->s_work.work_time ){q = p;p = p->pNext;}elsep = p->pNext;}elsep = p->pNext;}else //当前作业完成时,没有作业到达的情况{p = p->pNext; //用q来接收最先到达的,用p来遍历while( p != NULL ){if( p->s_work.arrive_time<q->s_work.arrive_time )q = p;p = p->pNext;}w_finish_time[i+1] = q->s_work.arrive_time + q->s_work.work_time;}}w_finish_time[i+1] = w_finish_time[i] +q->s_work.work_time;r eturn q;}void show(int *w_finish_time,int i,PNODE q,int*w_rel_time){w_finish_time[i+1] = w_finish_time[i] +q->s_work.work_time;w_rel_time[i+1] = w_finish_time[i+1] -q->s_work.arrive_time;p rintf("第%d个系统执行的作业到达时间:%d",i+2,q->s_work.arrive_time);p rintf("编号是:%d ",q->s_work.id);p rintf("服务时间是:%d\n",q->s_work.work_time);p rintf("完成时间是:%d ",w_finish_time[i+1]);p rintf("周转时间是:%d \n",w_rel_time[i+1]);}void showmenu(){printf("**********************************\n"); p rintf("请选择你要执行的命令~: \n");p rintf("1:先来先服务算法\n");p rintf("2:短作业优先算法\n");p rintf("3: 高响应比优先算法\n");p rintf("0: 退出菜单\n");p rintf("**********************************\n"); }void HRRN(){i nt w_rel_time[10];i nt w_finish_time[10];f loat rel_time = 0;f loat priority; //计算优先权s rand(time(0));i nt i;i nt j = 0;P NODE pHead = (PNODE)malloc(sizeof(NODE));i f (NULL == pHead){printf("分配失败, 程序终止!\n");exit(-1);}P NODE pTail = pHead;p Tail->pNext = NULL; //定义该链表有头结点,且第一个节点初始化为空f or(i=0;i<10;i++) //定义了十个进程{PNODE pNew = (PNODE)malloc(sizeof(NODE));if (NULL == pNew){printf("分配失败, 程序终止!\n");exit(-1);}pNew->s_work.id = rand()%100;pNew->s_work.arrive_time = rand()%10;pNew->s_work.work_time = rand()%10+1;pTail->pNext = pNew;pNew->pNext = NULL;pTail = pNew;}P NODE p = pHead->pNext; //p指向第一个节点w hile (NULL != p){printf("第%d个作业的编号是:%d\t",j+1,p->s_work.id);printf("第%d个作业到达时间:%d\t",j+1,p->s_work.arrive_time);printf("第%d个作业服务时间:%d\t",j+1,p->s_work.work_time);printf("\n");p = p->pNext;printf("\n");j++;}p = pHead->pNext;P NODE q = p; //p,q都指向第一个节点p = p->pNext;w hile(p != NULL){if(p->s_work.arrive_time < q->s_work.arrive_time) q = p;p = p->pNext;}P NODE r = pHead->pNext; //r也指向第一个节点i nt cnt = 0; //记录所有节点数据域中到达时间最短且相等的个数w hile(r!= NULL){if( r->s_work.arrive_time == q->s_work.arrive_time ) cnt++;r = r->pNext;}p = pHead->pNext;w hile(p != NULL) //在相等到达时间的作业中找服务时间最短的作业{if(cnt > 1){if( p->s_work.arrive_time ==q->s_work.arrive_time )if( p->s_work.work_time < q->s_work.work_time )q = p;p = p->pNext;}elsep =NULL;} //确定q所指作业最先到达且服务时间最短w_finish_time[0] = q->s_work.arrive_time +q->s_work.work_time;w_rel_time[0] = w_finish_time[0] -q->s_work.arrive_time;p rintf("第1个系统执行的作业到达时间:%d",q->s_work.arrive_time);p rintf("编号是:%d ",q->s_work.id);p rintf("服务时间是:%d \n",q->s_work.work_time); p rintf("完成时间是:%d ",w_finish_time[0]);p rintf("周转时间是:%d \n",w_rel_time[0]);p = pHead; //寻找q的前一个节点,方便删掉q节点w hile( p->pNext != q ){p = p->pNext;}p->pNext = q->pNext;f ree(q);q = NULL; //已经找到并执行第一个进程,执行完之后又将其删除了f or(i=0;i<9&&!Is_empty(pHead);i++){printf("现在系统还剩%d个作业!\n",cnt_work(pHead));do_work_1(pHead,w_finish_time,i);q = priorit(pHead);show(w_finish_time,i,q,w_rel_time);p = pHead; //寻找q的前一个节点,方便删掉q节点while( p->pNext != q ){p = p->pNext;}p->pNext = q->pNext;free(q);q = NULL;}f or(j=0;j<10;j++){rel_time += w_rel_time[j];}printf("平均周转时间:%f\n",rel_time/10);}void do_work_1(PNODE pHead,int *w_finish_time,int i) {P NODE p,q;i nt cnt = 0; //计数器清0,计算当前作业完成时,系统中有多少个作业已经到达p = pHead->pNext;q = p;w hile(p != NULL){if( p->s_work.arrive_time <= w_finish_time[i] ){cnt ++;q = p;p = p->pNext;}else{p = p->pNext;}} //q指向当前到达时间小于刚刚完成的作业,但有可能有另外几个进程也已经到达了,所以要进行下面的判断p rintf("系统中有%d个作业在当前作业完成时已经到达!\n",cnt);p = pHead->pNext;w hile(p != NULL){if(cnt>1) //说明此时有好几个都已经到达了{if(p->s_work.arrive_time <= w_finish_time[i]){p->s_work.wait = w_finish_time[i] -p->s_work.arrive_time;p = p->pNext;}else{p->s_work.wait = 0;p = p->pNext;}}else //当前作业完成时,没有作业到达的情况{p = p->pNext; //此时p指向第一个节点,q指向第二个节点,还是找最先到达的while( p != NULL ){if( p->s_work.arrive_time <q->s_work.arrive_time )q = p;p = p->pNext;}w_finish_time[i+1] = q->s_work.arrive_time +q->s_work.work_time;return;}}w_finish_time[i+1] = w_finish_time[i] +q->s_work.work_time;}PNODE priorit(PNODE pHead){P NODE p = pHead->pNext;w hile(p != NULL){if(p->s_work.wait > 0){p->s_work.priority = (p->s_work.wait +p->s_work.work_time) / p->s_work.work_time; //计算每一个已经等待的进程的优先等级p = p->pNext;}elsep = p->pNext;}p = pHead->pNext;P NODE q;q = p;p = p->pNext; //p已经指向第二个节点w hile(p != NULL){if(p->s_work.wait > 0){if(p->s_work.priority > q->s_work.priority){q = p;p = p->pNext;}elsep = p->pNext;}elsep = p->pNext;}p rintf("该进程优先级最高,为:%f\n",q->s_work.priority);return q;}实验结果:系统自动为每个算法模拟分配五个作业,同时随机生成作业的编号,作业的到达时间,作业估计运行的时间。

先来先服务和短作业优先调度算法

先来先服务和短作业优先调度算法

操作系统》实验一实验报告【实验题目】:先来先服务FCFS 和短作业优先SJF进程调度算法【实验目的】通过这次实验,加深对进程概念的理解,进一步掌握进程状态的转变、进程调度的策略及对系统性能的评价方法。

【实验内容】问题描述:设计程序模拟进程的先来先服务FCFS 和短作业优先SJF 调度过程。

假设有n个进程分别在T1, ⋯,T n时刻到达系统,它们需要的服务时间分别为S1, ⋯,S n。

分别采用先来先服务FCFS和短作业优先SJF 进程调度算法进行调度,计算每个进程的完成时间,周转时间和带权周转时间,并且统计n 个进程的平均周转时间和平均带权周转时间。

程序要求如下:1)进程个数n;每个进程的到达时间T1, ⋯,T n 和服务时间S1, ⋯,S n;选择算法1-FCFS,2-SJF。

2)要求采用先来先服务FCFS 和短作业优先SJF分别调度进程运行,计算每个进程的周转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间;3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:进程 B 开始运行”等等;4)输出:要求输出计算出来的每个进程的周转时间,带权周转时间,所有进程的平均周转时间,带权平均周转时间【实验过程】#include<iostream> using namespace std;#define MaxNum 100int ArrivalTime[MaxNum];double ServiceTime[MaxNum]; double FinishTime[MaxNum]; double WholeTime[MaxNum];double AVEWholeTime[MaxNum]; doubleAVEWeightWholeTime[MaxNum]; double WeightWholeTime[MaxNum]; double AverageWT_FCFS,AverageWT_SJF; doubleAverageWWT_FCFS,AverageWWT_SJF; doubleAllTime,WeightAllTime;double a[MaxNum];int b[MaxNum];int c[MaxNum]; int d[MaxNum]; void FCFS(); void SJF();void FCFS(){int ProcessNum;cout<<" --------- 先来先服务算法"<<endl;cout<<" 请输入进程个数:"; cin>>ProcessNum; cout<<" 输入进程到达时间:"; cout<<endl;for(int i=0;i<ProcessNum;i++){cin>>ArrivalTime[i];//cout<<endl;}cout<<endl;cout<<"请输入进程服务时间:cout<<endl;for(int i=0;i<ProcessNum;i++){cin>>ServiceTime[i];//cout<<endl;}cout<<endl;for(int i=0;i<ProcessNum;i++){FinishTime[i]=ServiceTime[i];}for(int i=0;i<ProcessNum;i++){FinishTime[i+1]=FinishTime[i]+FinishTime[i+1]; }for(int i=0;i<ProcessNum-1;i++){cout<<"时刻"<<FinishTime[i]<<": 第"<<i+2<<" 个进程开始运行。

作业调度实验报告

作业调度实验报告

实验二作业调度一.实验题目1、编写并调试一个单道处理系统的作业等待模拟程序。

作业调度算法:分别采用先来先服务(FCFS),最短作业优先(SJF)、响应比高者优先(HRN)的调度算法。

(1)先来先服务算法:按照作业提交给系统的先后顺序来挑选作业,先提交的先被挑选。

(2)最短作业优先算法:是以进入系统的作业所提出的“执行时间”为标准,总是优先选取执行时间最短的作业。

(3)响应比高者优先算法:是在每次调度前都要计算所有被选作业(在后备队列中)的响应比,然后选择响应比最高的作业执行。

2、编写并调度一个多道程序系统的作业调度模拟程序。

作业调度算法:采用基于先来先服务的调度算法。

可以参考课本中的方法进行设计。

对于多道程序系统,要假定系统中具有的各种资源及数量、调度作业时必须考虑到每个作业的资源要求。

二.实验目的:本实验要求用高级语言(C语言实验环境)编写和调试一个或多个作业调度的模拟程序,了解作业调度在操作系统中的作用,以加深对作业调度算法的理解三 .实验过程<一>单道处理系统作业调度1)单道处理程序作业调度实验的源程序: zuoye.c执行程序: zuoye.exe2)实验分析:1、由于在单道批处理系统中,作业一投入运行,它就占有计算机的一切资源直到作业完成为止,因此调度作业时不必考虑它所需要的资源是否得到满足,它所占用的 CPU 时限等因素。

2、每个作业由一个作业控制块JCB 表示,JCB 可以包含如下信息:作业名、提交时间、所需的运行时间、所需的资源、作业状态、链指针等等。

作业的状态可以是等待W(Wait)、运行R(Run)和完成F(Finish)三种状态之一。

每个作业的最初状态总是等待W 。

3、对每种调度算法都要求打印每个作业开始运行时刻、完成时刻、周转时间、带权周转时间,以及这组作业的平均周转时间及带权平均周转时间。

3)流程图:二.最短作业优先算法三.高响应比算法图一.先来先服务流程图4)源程序:#include <stdio.h>#include <stdlib.h>#include <conio.h>#define getpch(type) (type*)malloc(sizeof(type))#define NULL 0int n;float T1=0,T2=0;int times=0;代替代替struct jcb //作业控制块{char name[10]; //作业名int reachtime; //作业到达时间int starttime; //作业开始时间int needtime; //作业需要运行的时间float super; //作业的响应比int finishtime; //作业完成时间float cycletime; //作业周转时间float cltime; //作业带权周转时间char state; //作业状态struct jcb *next; //结构体指针}*ready=NULL,*p,*q;typedef struct jcb JCB;void inize() //初始化界面{printf("\n\n\t\t******************************************* **\t\t\n");printf("\t\t\t\t实验二作业调度\n");printf("\t\t*********************************************\t\t\n");printf("\n\n\n\t\t\t\t\t计算机学院软件四班\n");printf("\t\t\t\t\t蓝小花\n");printf("\t\t\t\t\t完成日期:2006年11月17号");printf("\n\n\n\t\t请输入任意键进入演示过程\n");getch();}void inital() //建立作业控制块队列,先将其排成先来先服务的模式队列{int i;printf("\n输入作业数:");scanf("%d",&n);for(i=0;i<n;i++){p=getpch(JCB);printf("\n输入作业名:");scanf("%s",p->name);getch();p->reachtime=i;printf("作业默认到达时间:%d",i);printf("\n输入作业要运行的时间:");scanf("%d",&p->needtime);p->state='W';p->next=NULL;if(ready==NULL) ready=q=p;else{q->next=p;q=p;}}}void disp(JCB* q,int m) //显示作业运行后的周转时间及带权周转时间等{if(m==3) //显示高响应比算法调度作业后的运行情况{printf("\n作业%s正在运行,估计其运行情况:\n",q->name);printf("开始运行时刻:%d\n",q->starttime);printf("完成时刻:%d\n",q->finishtime);printf("周转时间:%f\n",q->cycletime);printf("带权周转时间:%f\n",q->cltime);printf("相应比:%f\n",q->super);getch();}else // 显示先来先服务,最短作业优先算法调度后作业的运行情况{printf("\n作业%s正在运行,估计其运行情况:\n",q->name); printf("开始运行时刻:%d\n",q->starttime);printf("完成时刻:%d\n",q->finishtime);printf("周转时间:%f\n",q->cycletime);printf("带权周转时间:%f\n",q->cltime);getch();}}void running(JCB *p,int m) //运行作业{if(p==ready) //先将要运行的作业从队列中分离出来{ready=p->next;p->next=NULL;}else{q=ready;while(q->next!=p) q=q->next;q->next=p->next;}p->starttime=times; //计算作业运行后的完成时间,周转时间等等p->state='R';p->finishtime=p->starttime+p->needtime;p->cycletime=(float)(p->finishtime-p->reachtime); p->cltime=(float)(p->cycletime/p->needtime);T1+=p->cycletime;T2+=p->cltime;disp(p,m); //调用disp()函数,显示作业运行情况times+=p->needtime;p->state='F';printf("\n%s has been finished!\npress any key to continue...\n",p->name);free(p); //释放运行后的作业getch();}void super() //计算队列中作业的高响应比{JCB *padv;padv=ready;do{if(padv->state=='W'&&padv->reachtime<=times)padv->super=(float)(times-padv->reachtime+padv->needtime)/p adv->needtimepadv=padv->next;}while(padv!=NULL);}void final() //最后打印作业的平均周转时间,平均带权周转时间{float s,t;t=T1/n;s=T2/n;getch();printf("\n\n作业已经全部完成!");printf("\n%d个作业的平均周转时间是:%f",n,t);printf("\n%d个作业的平均带权周转时间是%f:\n\n\n",n,s); }void hrn(int m) //高响应比算法{JCB *min;int i,iden;system("cls");inital();for(i=0;i<n;i++){p=min=ready;iden=1;super();do{if(p->state=='W'&&p->reachtime<=times)if(iden){min=p;iden=0;}else if(p->super>min->super) min=p;p=p->next;}while(p!=NULL);if(iden){i--;times++;//printf("\ntime=%d:\tno JCB submib...wait...",time);if(times>1000){printf("\nruntime is too long...error...");getch();}}else{running(min,m); //调用running()函数}} //forfinal(); //调用running()函数}void sjf(int m) // 最短作业优先算法{JCB *min;int i,iden;system("cls");inital();for(i=0;i<n;i++)p=min=ready;iden=1;do{if(p->state=='W'&&p->reachtime<=times)if(iden){min=p;iden=0;}else if(p->needtime<min->needtime) min=p;p=p->next;}while(p!=NULL) ;if(iden) {i--; //printf("\ntime=%d:\tno JCB submib...wait...",time);times++;if(times>100){printf("\nruntime is too long...error");getch();}}else{running(min,m); //调用running()函数}} //forfinal(); //调用running()函数void fcfs(int m) //先来先服务算法{int i,iden;system("cls");inital();for(i=0;i<n;i++){p=ready;iden=1;do{if(p->state=='W'&&p->reachtime<=times) iden=0; if(iden)p=p->next;}while(p!=NULL&&iden) ;if(iden){i--;printf("\n没有满足要求的进程,需等待");times++;if(times>100){printf("\n时间过长");getch();}}else{running(p,m); //调用running()函数}}final(); //调用running()函数}void mune(){int m;system("cls");printf("\n\n\t\t******************************************* **\t\t\n");printf("\t\t\t\t作业调度演示\n");printf("\t\t*********************************************\t \t\n");printf("\n\n\n\t\t\t1.先来先服务算法.");printf("\n\t\t\t2.最短作业优先算法.");printf("\n\t\t\t3.响应比高者优先算法");printf("\n\t\t\t0.退出程序.");printf("\n\n\t\t\t\t选择所要操作:");scanf("%d",&m);switch(m){case 1:fcfs(m);getch();system("cls"); mune();break;case 2:sjf(m);getch();system("cls"); mune();break;case 3:hrn(m);getch();system("cls"); mune();break;case 0:system("cls"); break;default:printf("选择错误,重新选择.");getch();system("cls");mune();}}main() //主函数{inize();mune();}5)调试结果:1.选择操作的界面2.输入操作初始信息:3.先来先服务算法作业调度结果: (调度顺序:a->b->c->d->e)4.最短作业优先算法作业调度结果(调度顺序: a->d->b->e->c)5.高响应比算法作业调度结果: (调度顺序 a->b->d->c->e)<二>多道处理系统作业调度1)多道处理程序作业调度实验的源程序: duodao.c执行程序: duodao.exe2)实验分析:采用多道程序设计方法的操作系统,在系统中要经常保留多个运行的作业,以提高系统效率。

作业调度算法-实验报告

作业调度算法-实验报告

作业调度算法模拟一、课题内容和要求常见的作业调度算法有先来先服务算法、最短作业优先算法、响应比优先调度算法。

(1)参考操作系统教材理解这3种算法。

(2)实现这3个算法。

(3)已知若干作业的到达时间和服务时间,用实现的算法计算对该组作业进行调度的平均周转时间Ttime和平均带权周转时间WTtime。

(4)作业的到达时间和服务时间可以存放在文本文件record.txt中。

(5)设计简单的交互界面,演示所设计的功能。

(可以使用MFC进行界面的设计) (6)可根据自己能力,在完成以上基本要求后,对程序功能进行适当扩充。

二、需求分析模拟实现作业调度算法,包括:FCFS(先来先服务算法)、SJF(短作业优先算法)、HRN(最高响应比优先算法)、HPF(基于优先数调度算法)。

先来先服务算法:按照各个作业进入系统(输入井)的自然次序来调度算法。

短作业优先算法:优先调度并处理短作业。

所谓的“短作业”并不是指物理作业长度短,而是指作业的运行时间短。

最高响应比优先算法:优先调度并处理响应比最高的作业。

三、概要设计函数中一些类:1、2、先来先服务:3、最短作业优先:4、最高响应比:四、详细设计1、程序代码MFC头文件a.h内容:const int defMaxJobNumber = 10; //作业数量的最大值class Time //时间类{public:int hour;int minute;};class Job//作业类{public:int ID; //作业编号Time enter; //进入时间int requesttime; //估计运行时间int priority; //优先数Time start; //开始时间Time end; //结束时间int Ttime; //周转时间double WTtime; //带权周转时间};class schedule //调度类{public:int size; //作业数Job *job; //作业数组int *r; //排序用数组int Differ(Time t1,Time t2) //求两个时刻间的时间差t2-t1{int borrow = (t2.minute<t1.minute) ? 1 : 0;return ((t2.hour-t1.hour-borrow)*60+(borrow*60+t2.minute-t1.minute));}public:schedule() //构造函数{size = 0;job = new Job[defMaxJobNumber];r = new int[defMaxJobNumber-1];}void readFile() //从文件读信息{ifstream txtfile;txtfile.open("record.txt");int i = 0;int entertime;while(!txtfile.eof()){txtfile>>job[i].ID>>entertime>>job[i].requesttime>>job[i].priority;job[i].enter.hour = entertime / 100; //取小时job[i].enter.minute = entertime % 100; //取分钟i++;size++;}txtfile.close();}void FCFS()//先来先服务(First Come First Serve){int hour,minute,carry;job[0].start = job[0].enter;hour = job[0].requesttime / 60;minute = job[0].requesttime % 60;job[0].end.minute = (job[0].start.minute + minute) % 60;carry = (job[0].start.minute + minute) / 60; //carry是分钟累积超过60商job[0].end.hour = job[0].start.hour + hour + carry;job[0].Ttime = job[0].requesttime;job[0].WTtime = ((double)job[0].Ttime) / job[0].requesttime;for(int i=1;i<size;i++){job[i].start = job[i-1].end;hour = job[i].requesttime / 60;minute = job[i].requesttime % 60;job[i].end.minute = (job[i].start.minute + minute) % 60;carry = (job[i].start.minute + minute) / 60;job[i].end.hour = job[i].start.hour + hour + carry;job[i].Ttime = Differ(job[i].enter,job[i].end); //周转时间job[i].WTtime = ((double)job[i].Ttime) / job[i].requesttime; //带权周转时间}}void SJF()//短作业优先(Shortest Job First){int hour,minute,carry;job[0].start = job[0].enter;hour = job[0].requesttime / 60;minute = job[0].requesttime % 60;job[0].end.minute = (job[0].start.minute + minute) % 60;carry = (job[0].start.minute + minute) / 60; //carry是分钟累积超过60的商job[0].end.hour = job[0].start.hour + hour + carry;job[0].Ttime = job[0].requesttime; //周转时间job[0].WTtime = ((double)job[0].Ttime) / job[0].requesttime; //带权周转时间for(int i=1;i<size;i++)r[i] = i;for(i=1;i<size-1;i++) //按照作业运行时间从低到高排序{int index = i;for(int j=i+1;j<size;j++)if(job[r[j]].requesttime<job[r[index]].requesttime)index = j;if(index!=i){int w = r[i];r[i] = r[index];r[index] = w;}}int dest=0;for(i=1;i<size;i++) //按排序后的作业序继续执行{int index = r[i];job[index].start = job[dest].end;hour = job[index].requesttime / 60;minute = job[index].requesttime % 60;job[index].end.minute = (job[index].start.minute + minute) % 60;carry = (job[index].start.minute + minute) / 60;job[index].end.hour = job[index].start.hour + hour + carry;job[index].Ttime = Differ(job[index].enter,job[index].end);job[index].WTtime = ((double)job[index].Ttime) / job[index].requesttime;dest = index;}}void HRN() //最高响应比优先(Highest Response_ratio Next){int hour,minute,carry;job[0].start = job[0].enter;hour = job[0].requesttime / 60;minute = job[0].requesttime % 60;job[0].end.minute = (job[0].start.minute + minute) % 60;carry = (job[0].start.minute + minute) / 60; //carry是分钟累积超过60的商job[0].end.hour = job[0].start.hour + hour + carry;job[0].Ttime = job[0].requesttime; //周转时间job[0].WTtime = ((double)job[0].Ttime) / job[0].requesttime; 带权周转时间int dest=0;for(int i=1;i<size;i++)r[i] = i;for(i=1;i<size;i++){int index = i;for(int j=i+1;j<size;j++) //按照响应比从大到小排序if(((double)Differ(job[r[j]].enter,job[dest].end))/job[r[j]].requesttime>((double)Differ(job[r[index]].enter,job[dest].end))/job[r[index]].requesttime)//响应比=作业周转时间/作业处理时间index = j;if(index!=i){int w = r[i];r[i] = r[index];r[index] = w;}//按排序后的作业序继续执行index = r[i];job[index].start = job[dest].end;hour = job[index].requesttime / 60;minute = job[index].requesttime % 60;job[index].end.minute = (job[index].start.minute + minute) % 60;carry = (job[index].start.minute + minute) / 60;job[index].end.hour = job[index].start.hour + hour + carry;job[index].Ttime = Differ(job[index].enter,job[index].end);job[index].WTtime = ((double)job[index].Ttime) / job[index].requesttime;dest = index;}}};五、测试数据及其结果分析从文本文件中读取数据(书上的例子):1 800 120 22 850 50 33 900 10 14 950 20 4输出的平均周转时间、平均带权周转时间结果正确。

操作系统实验一先来先服务FCFS和短作业优先SJF调度算法

操作系统实验一先来先服务FCFS和短作业优先SJF调度算法

操作系统实验报告一[实验题目]先来先服务FCFS和短作业优先SJF调度算法[实验目的]通过本次实验,加深对进城概念的理解,进一步掌握对进城状态转变、进城调度策略及对系统性能的评价方法。

[实验内容]编程实现如下内容:1.先来先服务算法;2.短进程优先算法;3.根据调度顺序计算所有作业的平均周转时间及平均带权周转时间。

代码如下:一、先来先服务算法代码#include<stdio.h>#include<stdlib.h>/**@author*@date 2015-6-1*/typedef struct process_FCFS{float arrivetime; //到达时间float servetime; //服务时间float finishtime; //完成时间float roundtime; //周转时间float daiquantime; //带权周转时间struct process_FCFS *link; //结构体指针}FCFS;FCFS *p,*q,*head=NULL;struct process_FCFS a[100];struct process_FCFS *sortarrivetime(struct process_FCFS a[],int n) {int i,j;struct process_FCFS t;int flag;for(i=1;i<n;i++){flag=0;for(j=0;j<n-i;j++){if(a[j].arrivetime>a[j+1].arrivetime){t=a[j];a[j]=a[j+1];a[j+1]=t;flag=1;}}if(flag==0)//如果排序中没发生任何交换,则结束break;}return a;}//先来先服务算法void print(struct process_FCFS a[],int n){int i;for(i=0;i<n;i++){printf("到达时间:%f",a[i].arrivetime);printf("服务时间:%f",a[i].servetime);printf("完成时间:%f",a[i].finishtime);printf("周转时间:%f",a[i].roundtime);printf("带权周转时间:%f",a[i].daiquantime);printf("\n");}}void Fcfs(struct process_FCFS a[],int n){int i;a[0].finishtime=a[0].arrivetime+a[0].servetime;a[0].roundtime=a[0].finishtime+a[0].arrivetime;a[0].daiquantime=a[0].roundtime/a[0].servetime; for(i=0;i<n;i++){if(a[i].arrivetime<a[i-1].finishtime){a[i].finishtime=a[i-1].finishtime+a[i].servetime;a[i].roundtime=a[i].finishtime-a[i].arrivetime;a[i].daiquantime=a[i].roundtime/a[i].servetime; }else{a[i].finishtime=a[i].arrivetime+a[i].servetime;a[i].roundtime=a[i].finishtime-a[i].arrivetime;a[i].daiquantime=a[i].roundtime/a[i].servetime; }}printf("先来先服务\n");print(a,n);}void main(){int n,i;printf("请输入有几个进程\n");scanf("%d",&n);for(i=0;i<n;i++){printf("arrivetime");scanf("%f",&a[i].arrivetime);printf("servetime");scanf("%f",&a[i].servetime);}Fcfs(a,n);}二、短作业优先算法代码#include<iostream.h>#include<stdio.h>struct pcb{char pno;int come_time; //到达时间int run_time; //服务时间};float fcfs(pcb pro[],int n){struct pcb temp;int i,j,k; //time为当前时间float weight_time=0,time=0; //记录周转时间的和//temp=(pcb)malloc(sizeof(pcb));cout<<"进程调度情况如下:"<<endl;cout<<"进程号到达时间服务时间周转时间:"<<endl;//选择排序过程,按到达时间升序排列for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++)if(pro[k].come_time>pro[j].come_time)k=j;if(k!=i){temp=pro[i];pro[i]=pro[k];pro[k]=temp;}}for(i=0;i<n;i++){ time+=pro[i].run_time;weight_time+=(time-pro[i].come_time)/pro[i].run_time;//(time-pro[i].come_time)/pro[i].run_time为排序后第i个进程的周转时间cout<<pro[i].pno<<" "<<pro[i].come_time<<" "<<pro[i].run_time<<""<<(time-pro[i].come_time)/pro[i].run_time<<endl;}return weight_time/=n; //返回平均带权周转时间}void insert(pcb pro[],pcb pro1,int start,int end)//将一pcb类型的元素插入到有序数组中,最后还保持有序{int i=end;while((i--)>start)if(pro[i].run_time>pro1.run_time)pro[i+1]=pro[i];pro[i]=pro1;}float sjp(pcb pro[],int n){int i,first=0,count,flag[20],k,min;float time=0,weight_time=0;//调度第一个到达内存的进程for(i=1;i<n;i++){if(pro[first].come_time>pro[i].come_time) first=i;flag[i]=0;}flag[first]=1;time=(float)pro[first].run_time;weight_time=1;cout<<pro[first].pno<<" "<<pro[first].come_time<<" "<<pro[first].run_time<<" "<<weight_time<<endl;//pro_temp[0]=pro[first];count=n-1;while(count){k=0;min=32767; //设置一个较大的阈值,for(i=0;i<n;i++) //找到一个未被访问的,作业较短的且已经到达内存的作业调度if((i!=first)&&(flag[i]==0)&&(time>=pro[i].come_time)&&(min>pro[i]. run_time)){k=i;min=pro[i].run_time;}flag[k]=1; //访问后置标记为访问time+=pro[k].run_time;weight_time+=(time-pro[k].come_time)/pro[k].run_time;cout<<pro[k].pno<<" "<<pro[k].come_time<<" "<<pro[k].run_time<<""<<(time-pro[k].come_time)/pro[k].run_time<<endl;count--; //每调度一个作业,count减1}return weight_time/=n;}void main(){pcb pro[5]={{'C',2,5},{'A',0,4},{'B',1,3},{'D',3,2},{'E',4,4}};cout<<fcfs(pro,5)<<endl;cout<<sjp(pro,5)<<endl;}[实验结果](抓图)先来先服务算法截图短作业优先截图[心得体会]1、通过实验,我加深了对进程的了解2、了解了先来先服务算法和短作业算法的特征和区别。

先来先服务FCFS和短作业优先SJF进程调度算法_实验报告材料

先来先服务FCFS和短作业优先SJF进程调度算法_实验报告材料

先来先服务FCFS和短作业优先SJF进程调度算法_实验报告材料一、实验目的本实验的目的是通过编写程序模拟先来先服务(FCFS)和短作业优先(SJF)进程调度算法,并对其效果进行评估,从而对两种算法有一个更直观的认识。

二、实验原理2. 短作业优先(Shortest-Job-First, SJF)进程调度算法:根据进程的执行时间进行调度,选择执行时间最短的进程先执行。

三、实验步骤1. 设计进程类Process,包含进程名称、到达时间、执行时间等属性,并重载比较运算符以便后续排序。

2. 设计FCFS调度算法函数fcfs_scheduling,实现进程按照先来先服务的规则进行调度。

3. 设计SJF调度算法函数sjf_scheduling,实现进程按照执行时间最短的规则进行调度。

4. 编写主函数,分别调用fcfs_scheduling和sjf_scheduling函数,并根据实际情况输出结果,比较两种算法的效果。

四、实验结果与分析1.输入样例:进程A:到达时间0,执行时间3进程B:到达时间1,执行时间4进程C:到达时间2,执行时间2进程D:到达时间4,执行时间12.输出结果:FCFS调度结果:A->B->C->D,平均等待时间为(0+3+7+9)/4=4.75SJF调度结果:A->C->B->D,平均等待时间为(0+1+3+6)/4=2.53.结果分析:从结果可以看出,短作业优先(SJF)进程调度算法能够更好地减少进程的等待时间,因为它根据进程的执行时间进行调度,优先执行执行时间较短的进程。

与之相比,先来先服务(FCFS)进程调度算法无法对不同进程的执行时间进行判断,可能导致执行时间较短的进程等待时间长。

五、实验总结通过本次实验,我对先来先服务(FCFS)和短作业优先(SJF)进程调度算法有了更深入的了解。

先来先服务(FCFS)算法简单直观,但无法保证最优解;短作业优先(SJF)算法可以减少进程的等待时间,但需要预知每个进程的执行时间。

调度算法实验报告总结(3篇)

调度算法实验报告总结(3篇)

第1篇一、实验目的本次实验旨在通过模拟操作系统中的进程调度过程,加深对进程调度算法的理解。

实验中,我们重点研究了先来先服务(FCFS)、时间片轮转(RR)和动态优先级调度(DP)三种常见的调度算法。

通过编写C语言程序模拟这些算法的运行,我们能够直观地观察到不同调度策略对进程调度效果的影响。

二、实验内容1. 数据结构设计在实验中,我们定义了进程控制块(PCB)作为进程的抽象表示。

PCB包含以下信息:- 进程编号- 到达时间- 运行时间- 优先级- 状态(就绪、运行、阻塞、完成)为了方便调度,我们使用链表来存储就绪队列,以便于按照不同的调度策略进行操作。

2. 算法实现与模拟(1)先来先服务(FCFS)调度算法FCFS算法按照进程到达就绪队列的顺序进行调度。

在模拟过程中,我们首先将所有进程按照到达时间排序,然后依次将它们从就绪队列中取出并分配CPU资源。

(2)时间片轮转(RR)调度算法RR算法将CPU时间划分为固定的时间片,并按照进程到达就绪队列的顺序轮流分配CPU资源。

当一个进程的时间片用完时,它将被放入就绪队列的末尾,等待下一次调度。

(3)动态优先级调度(DP)算法DP算法根据进程的优先级进行调度。

在模拟过程中,我们为每个进程分配一个优先级,并按照优先级从高到低的顺序进行调度。

3. 输出调度结果在模拟结束后,我们输出每个进程的调度结果,包括:- 进程编号- 到达时间- 运行时间- 等待时间- 周转时间同时,我们还计算了平均周转时间、平均等待时间和平均带权周转时间等性能指标。

三、实验结果与分析1. FCFS调度算法FCFS算法简单易实现,但可能会导致进程的响应时间较长,尤其是在存在大量短作业的情况下。

此外,FCFS算法可能导致某些进程长时间得不到调度,造成饥饿现象。

2. 时间片轮转(RR)调度算法RR算法能够有效地降低进程的响应时间,并提高系统的吞吐量。

然而,RR算法在进程数量较多时,可能会导致调度开销较大。

操作系统实验_先来先服务的调度算法和短作业优先

操作系统实验_先来先服务的调度算法和短作业优先

操作系统实验_先来先服务的调度算法和短作业优先先来先服务(FCFS)调度算法是一种非抢占式调度算法,在这种算法中,进程按照到达系统的先后顺序执行,并且在一个进程执行完毕之前,不会有其他进程执行。

如果一个进程没有执行完成,后续进程需要等待。

FCFS调度算法的优点是实现简单,公平性好。

由于按照到达时间先后顺序执行进程,能够保证所有进程都能够得到执行的机会。

然而,FCFS调度算法容易出现“饥饿”现象,即如果一个进程占用了较长的CPU时间,其他进程可能需要等待较长时间。

短作业优先(SJF)调度算法是一种非抢占式调度算法,它选择下一个执行的进程是根据预计的执行时间最短的进程。

在SJF调度算法中,进程按照预计的执行时间进行排序,并按照顺序执行。

SJF调度算法的优点是能够最大程度地减少平均等待时间。

因为进程按照预计的执行时间最短的顺序执行,执行时间短的进程优先执行,可以最大限度地减少其他进程等待的时间。

然而,SJF调度算法需要预先知道所有进程的执行时间,并且如果一个进程执行时间长,其他进程需要等待的时间可能会很长。

FCFS调度算法和SJF调度算法都有各自的优点和局限性。

FCFS调度算法适用于进程执行时间相对均匀的情况,可以保证所有进程都能够得到执行的机会。

但是,如果一个进程执行时间很长,可能会导致其他进程等待的时间非常长,容易出现“饥饿”现象。

SJF调度算法适用于进程执行时间差异较大的情况,可以最大程度地减少平均等待时间。

但是,SJF调度算法需要预先知道所有进程的执行时间,而且在实际应用中,很难准确预测进程的执行时间。

在实验中,可以通过编写相应的模拟程序来实现FCFS调度算法和SJF调度算法。

可以设定一个进程队列,每个进程有自己的到达时间和执行时间。

按照FCFS算法,按照到达时间先后顺序执行进程;按照SJF算法,按照执行时间从小到大的顺序执行进程。

通过模拟进程的调度过程,可以观察到FCFS算法和SJF算法的效果差异。

操作系统实验-先来先服务、短作业优先算法

操作系统实验-先来先服务、短作业优先算法

实验报告【实验名称】实验一进程调度【实验目的】巩固和加深处理机调度的概念。

【实验内容】设计调度算法,模拟实现处理机的调度。

1.设计先来先服务调度算法数据结构和符号说明:typedef struct PCB{char name[10]; //进程名char state;//进程状态int arrivetime; //到达时间int starttime;//开始时间int finishtime; //完成时间int servicetime;//服务时间float turnaroundtime;//周转时间float weightedturnaroundtime;//带权周转时间struct PCB *next;//指向下个进程的指针}pcb;int time;//全局变量,计时器int n;//全局变量,进程个数pcb *head = NULL,*p,*q;//进程链表指针流程图:开始输入进程名、到达时间、服务时间存入链表进程是否全部处理完毕?当前进程状态是否为F ?N处理进程,计算完成时间,周转时间等,并更新当前时间Y处理下一进程N 结束Y 程序源代码/*操作系统实验一先来先服务调度算法*/#include<stdio.h>#include<stdlib.h>typedef struct PCB//进程控制{char name[10];//进程名char state;//进程状态int arrivetime;//到达时间int starttime;//开始时间int finishtime;//结束时间int servicetime;//服务时间float turnaroundtime;//周转时间float weightedturnaroundtime;//带权周转时间struct PCB *next;//指向下个进程}pcb;int time;//当前时间int n;//进程个数pcb *head = NULL,*p,*q;//处理未完成的进程void run_fcfs(pcb *p1){time = p1->arrivetime > time ? p1->arrivetime : time; //如果进程到达时间大于当前时间,则当前时间=到达时间p1->starttime = time;//当前时间即为进程开始时间printf("\n现在时间是%d,开始运行作业%s\n",time,p1->name);time += p1->servicetime;//进程开始处理,处理的时间为进程的服务时间p1->state = 'T';//更改状态,表示该进程已被处理过p1->finishtime = time;//存入完成时间p1->turnaroundtime = p1->finishtime - p1->arrivetime;//周转时间=完成时间-到达时间p1->weightedturnaroundtime = p1->turnaroundtime/p1->servicetime;//带权周转时间=周转时间/服务时间printf(" 到达时间服务时间开始时间完成时间周转时间带权周转时间\n");printf("%8d%10d%10d%10d%10.1f%14.2f\n",p1->arrivetime,p1->servicetime,p1->starttime,p1->finishtime,p1->turnaroundtime,p1->weightedturnaroundtime);//打印输出}//找到当前未完成的进程void fcfs(){int i,j;p = head;for(i=0; i<n; i++){if(p->state == 'F'){q = p;//如果当前进程未执行,则开始执行run_fcfs(q);}p = p->next;指向下一个进程}}//输入进程个数与进程信息void getInfo(){int num;printf("\n作业个数:");scanf("%d",&n);for(num = 0; num < n; num++){p = (pcb*)malloc(sizeof(pcb));printf("依次输入:\n");printf("进程名到达时间服务时间\n");scanf("%s\t%d\t%d",&p->name,&p->arrivetime,&p->servicetime);if(head == NULL){head = p;q = p;time = p->arrivetime;}if(p->arrivetime < time)time =p->arrivetime;q->next = p;p->starttime = 0;p->finishtime = 0;p->turnaroundtime = 0;p->weightedturnaroundtime = 0;p->next = NULL;p->state = 'F';q = p;}}int main(){printf("先来先服务调度算法\n");getInfo();p = head;fcfs();return 0;}运行结果图1运行结果2.设计按短进程优先调度算法数据结构与符号说明:struct sjf{char name[10]; //进程名float arrivetime; //到达时间float servicetime;//服务时间float starttime; //开始时间float finishtime;//完成时间float turnaroundtime;//周转时间float dqturnaroundtime;//带权周转};//结构体数组sjf a[100];流程图:程序源代码/*操作系统实验一按短进程优先调度算法*/#include <stdio.h>struct sjf{char name[10]; //进程名float arrivetime; //到达时间float servicetime;//服务时间float starttime; //开始时间float finishtime;//完成时间float turnaroundtime;//周转时间float dqturnaroundtime;//带权周转};//结构体数组sjf a[100];//输入函数void input(sjf *p,int N){int i;printf("依次输入:\n");for(i=0;i<=N-1;i++){printf("进程名到达时间服务时间\n");scanf("%s%f%f",&p[i].name,&p[i].arrivetime,&p[i].servicetime);}}//输出函数void Print(sjf *p,float arrivetime,float servicetime,float starttime,float finishtime,float turnaroundtime,float dqturnaroundtime,int N){int k;printf("\n进程名到达时间服务时间开始时间完成时间周转时间带权周转时间\n");for(k=0;k<=N-1;k++){printf("%4s%10.2f%10.2f%10.2f%10.2f%10.2f%10.2f\n",p[k].name,p[k].arrivetime,p[k].servicetime,p[k]. starttime,p[k].finishtime,p[k].turnaroundtime,p[k].dqturnaroundtime);}}//按到达时间排序void sort(sjf *p,int N){for(int i=0;i<=N-1;i++)for(int j=0;j<=i;j++)if(p[i].arrivetime<p[j].arrivetime){sjf temp;temp=p[i];p[i]=p[j];p[j]=temp;}}//处理作业void deal(sjf *p, float arrivetime,float servicetime,float starttime,float finishtime,float &turnaroundtime,float&dqturnaroundtime,int N){int k;for(k=0;k<=N-1;k++){if(k == 0){p[k].starttime = p[k].arrivetime;//第一个进程的开始时间=到达时间p[k].finishtime = p[k].arrivetime + p[k].servicetime;}//完成时间=到达时间+服务时间else{if(p[k-1].finishtime >= p[k].arrivetime){p[k].starttime = p[k-1].finishtime;}//前一项作业的完成时间大于当前项的到达时间则当前项的开始时间为前一项的结束时间else{p[k].starttime = p[k].arrivetime;//否则当前项的开始时间为当前项的到达时间}p[k].finishtime = p[k].starttime + p[k].servicetime;//完成时间=作业开始时间+作业服务时间}}for(k=0;k<=N-1;k++){p[k].turnaroundtime = p[k].finishtime - p[k].arrivetime;//周转时间=完成时间-到达时间p[k].dqturnaroundtime = p[k].turnaroundtime / p[k].servicetime;//带权周转时间=周转时间/服务时间}}//短作业优先调度算法void sjff(sjf *p,int N){float arrivetime = 0;float servicetime = 0;float starttime = 0;float finishtime = 0;float turnaroundtime = 0;float dqturnaroundtime = 0;sort(p,N);//调用sort函数进行排序for(int m=0;m<N-1;m++){if(m == 0)//第一项作业p[m].finishtime = p[m].arrivetime + p[m].servicetime;//完成时间=到达时间+服务时间else{if(p[m-1].finishtime >= p[m].arrivetime ){p[m].starttime = p[m-1].finishtime;}//上一项进程结束后本进程才开始else{p[m].starttime = p[m].arrivetime;}p[m].finishtime = p[m].starttime + p[m].servicetime;//完成时间=开始时间+服务时间}int i = 0;for(int n=m+1;n<=N-1;n++){if(p[n].arrivetime <= p[m].finishtime) i++;}//按服务时间排序float min=p[m+1].servicetime;int next=m+1;//m+1=nfor(int k=m+1;k<m+i;k++){if(p[k+1].servicetime<min)//k+1项的服务时间小于最小项则k+1项为最小项{min=p[k+1].servicetime;next=k+1;}}sjf temp;temp=p[m+1];p[m+1]=p[next];p[next]=temp;}deal(p,arrivetime,servicetime,starttime,finishtime,turnaroundtime,dqturnaroundtime,N);Print(p,arrivetime,servicetime,starttime,finishtime,turnaroundtime,dqturnaroundtime,N); }int main(){int N;printf("短作业优先调度算法\n");printf("\n作业个数:");scanf("%d",&N);input(a,N);sjf *b=a;sjff(b,N);//调用sjff函数}运行结果图2 运行结果。

操作系统实验_先来先服务的调度算法和短作业优先

操作系统实验_先来先服务的调度算法和短作业优先

操作系统实验_先来先服务的调度算法和短作业优先操作系统中的进程调度算法是实现多道程序设计的关键,作为操作系统中的调度器,它决定了进程在CPU上执行的顺序,直接影响到系统的性能和响应时间。

本文将重点介绍两种常用的进程调度算法:先来先服务调度算法(FCFS)和短作业优先调度算法(SJF)。

先来先服务调度算法是一种最简单、最基础的调度算法,其实现非常简单:按照进程到达CPU的先后顺序,将其依次调入CPU执行。

当一个进程进入就绪队列后,在CPU空闲的时候,就将其调入CPU执行,直到进程执行完成或者主动放弃CPU时间片。

这种调度算法的优势在于实现简单、公平性好;但其缺点也很明显,由于没有考虑进程的执行时间长短,如果一个长时间的进程先到达就绪队列,则会造成其他进程的等待时间过长,导致系统的响应时间较长。

与FCFS相对的是短作业优先调度算法(Shortest Job First, SJF)。

SJF调度算法会根据进程的相对执行时间长短来进行调度,即将执行时间最短的进程优先调度进入CPU执行。

SJF算法的关键在于如何估计进程的执行时间,通常有两种方法:预测和历史信息。

预测方法是根据进程的相关信息,如进程的大小、执行时间等进行预测;而历史信息方法是根据以往同类任务的执行时间的平均值或历史执行时间进行估算。

在实际操作中,通常采用后者进行调度。

SJF调度算法的优势在于可以最大程度地减少平均等待时间,提高系统的响应效率。

然而,该算法也存在一些问题,如如何准确估算进程的执行时间、对长时间任务不够友好等。

两种调度算法各自都有其优势和劣势,因此在实际操作中需要根据具体的情况选择适用的调度算法。

如果系统中存在大量长时间任务,可以考虑使用FCFS来保证公平性;而如果系统中的任务短且繁琐,可以优先考虑SJF算法来减少平均等待时间。

此外,还有一些改进版的调度算法,如最短剩余时间优先调度算法(Shortest Remaining Time First, SRTF)和多级反馈队列调度算法(Multi-Level Feedback Queue, MLFQ)等,它们在一定程度上兼顾了FCFS和SJF的优势,更适用于实际的操作系统。

先来先服务调度和最短作业优先调度算法实验报告

先来先服务调度和最短作业优先调度算法实验报告
实验目的及要求理解并掌握处理机调度算法实验原理基于先来先服务调度和最短作业优先调度算法思想用语言编程实现实验环境使用的软件visualc60实验内容
实验概述:
【实验目的及要求】
理解并掌握处理机调度算法
【实验原理】
基于先来先服务调度和最短作业优先调度算法思想用C语言编程实现
【实验环境】(使用的软件)
Visual C++6.0
输入:3 <回车>
屏幕显示:You have in put a wrong nu mber, please in put aga in.
输入:1<回车>
屏幕输出结果:
submit run start ing final wait tur naro und
3
8.0
1.0
8.0
9.0
0.0
1.0
2
8.5
0.5
9.0
9.5
0.5
1.0
1
9.0
0.2
9.5
9.7
0.5
0.7
4
9.1
0.1
9.7
9.8
0.6
0.7
屏幕显示:
The average turn aro und time is 0.85
What kind of algorithm do you want? Please in put 1 to select FCFS, or 2 to select
测试数据二:
submit run
160.5
250.9
36.30.1
FCFS和SJF算法结果一样:
submit
run
starti ng
final
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

先来先服务调度和最短作业优先调度算法实验
报告
GE GROUP system office room 【GEIHUA16H-GEIHUA GEIHUA8Q8-
实验报告说明
1.实验项目名称:要用最简练的语言反映实验的内容。

要求与实验指导书中相一致。

2.实验类型:一般需说明是验证型实验还是设计型实验,是创新型实验还是综合型实验。

3.实验目的与要求:目的要明确,要抓住重点,符合实验指导书中的要求。

4.实验原理:简要说明本实验项目所涉及的理论知识。

5.实验环境:实验用的软硬件环境(配置)。

6.实验方案设计(思路、步骤和方法等):这是实验报告极其重要的内容。

概括整个实验过程。

对于操作型实验,要写明依据何种原理、操作方法进行实验,要写明需要经过哪几个步骤来实现其操作。

对于设计型和综合型实验,在上述内容基础上还应该画出流程图、设计思路和设计方法,再配以相应的文字说明。

对于创新型实验,还应注明其创新点、特色。

7.实验过程(实验中涉及的记录、数据、分析):写明具体上述实验方案的具体实施,包括实验过程中的记录、数据和相应的分析。

8.结论(结果):即根据实验过程中所见到的现象和测得的数据,做出结论。

9.小结:对本次实验的心得体会、思考和建议。

10.指导教师评语及成绩:指导教师依据学生的实际报告内容,用简练语言给出本次实验报告的评价和价值。

注意:
实验报告将记入实验成绩;
每次实验开始时,交上一次的实验报告,否则将扣除此次实验成绩。

相关文档
最新文档