(售后服务)操作系统编程进程或作业先来先服务高优先权按时间片轮转调度算法

合集下载

操作系统调度算法

操作系统调度算法

1.先来先服务调度算法
例:在下表中给出进程的到达时 间、执行时间和优先级,请给出 先来先服务调度算法的进程执行 次序和平均周转时间。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 P1

到 达 执 行 优 先 程 时 时 级 间 间
0 2 3 5 5 10 1 2 1 5 3 1 2 4 3
7.最高响应比优先调度算法
高响应比优先调度算法的基本思想是把 CPU分配给就绪队列中响应 比最高的进程。
高响应比优先调度算法既考虑作业的执行时间也考虑作业的等待时 间,综合了先来先服务和最短作业优先两种算法的特点。 优先数=(等待时间+运行时间)/运行时间 例:有3个进程A、B、C,它们分别在7∶50、8∶00和8∶30到达, 它们需要执行的时间分别是 1.5 个小时、 1 小时和 0.4 小时。系统在 9∶00开始按响应比的高者优先算法,对它们进行调度。请回答下列 问题: (1)进程被选中的执行次序是什么? (2)三个进程被选中时的响应比分别是什么?
(T
i 1
n
ei
Tsi )
n ( 1 9 0) (3 2) (7 3) (8 5) ( 1 7 5) 5 7.8
5.短进程优先调度算法
短作业优先又称为“短进程优先,这是对FCFS算法的改进,其目标 是减少平均周转时间。对预计执行时间短的作业(进程)优先分派 处理机。通常后来的短作业不抢先正在执行的作业。
P1 P2 P3 P4
P2
P3
P4
P5
平均周转时间:
P5
T
(T
i 1
n
ei
Tsi )

优先级调度算法计算

优先级调度算法计算

优先级调度算法计算
优先级调度算法是一种操作系统中的调度算法,根据进程的优先级来决定进程的调度顺序。

优先级可以由操作系统根据进程的特性和重要性来分配,也可以由进程本身来设定。

优先级调度算法的计算步骤如下:
1. 确定进程的优先级:可以根据进程的特性、重要性等来确定进程的优先级。

一般来说,进程的优先级越高,调度的权重越大。

2. 设置进程的优先级:将确定好的优先级设置给相应的进程,可以通过修改进程的优先级字段来设置优先级。

3. 进程调度:根据进程的优先级进行调度,优先级高的进程会被优先调度执行。

具体的调度算法可以是抢占式调度或非抢占式调度,具体实现也可以是基于时间片轮转调度等。

需要注意的是,优先级调度算法可能存在问题,如优先级反转问题。

为了解决这些问题,可以使用优先级继承或优先级翻转等技术来进行优化。

先来先服务FCFS和短作业优先SJF进程调度算法

先来先服务FCFS和短作业优先SJF进程调度算法

先来先服务FCFS和短作业优先SJF进程调度算法FCFS(先来先服务)算法是最简单的进程调度算法之一、它按照进程到达的顺序来分配CPU时间,即先到达的进程先执行。

在FCFS算法中,进程按照它们进入就绪队列的时间排序,随后按照就绪队列的顺序被调度执行。

FCFS算法不考虑进程的执行时间,也不会对进程进行任何优先级排序。

FCFS算法的优点是简单易懂,实现起来非常简单。

但是,FCFS算法有一个明显的缺点是不利于短进程的执行。

当一个长进程到达并占据CPU 资源时,短进程可能要等待很长时间才能执行。

这种情况下,CPU的利用率会较低,响应时间也会较长。

因此,FCFS算法适用于进程的执行时间相对较短且没有明显的优先级关系的场景。

SJF(短作业优先)算法是根据进程的执行时间进行优先级排序的进程调度算法。

在SJF算法中,短进程将会优先执行,而长进程需等待。

当一个进程到达就绪队列时,系统会根据其估计的执行时间大小将其插入到就绪队列的适当位置。

当前执行的进程完成后,下一个执行的是就绪队列中估计执行时间最短的进程。

SJF算法的优点是能够减少平均等待时间,提高系统整体的吞吐量。

由于短进程占用CPU时间较少,因此能够更快地释放CPU资源给其他进程使用,从而减少等待时间。

然而,SJF算法存在一个问题是如何准确估计进程的执行时间。

在实际场景中,准确估计进程的执行时间是很困难的,因此SJF算法很容易出现估计错误,导致长进程等待时间过长。

总结来说,FCFS和SJF都是进程调度算法,但它们有不同的特点和适用场景。

FCFS算法简单易懂,适用于进程执行时间相对较短且没有明显优先级的场景;而SJF算法适用于进程执行时间有较大差异的场景,能够减少平均等待时间。

然而,SJF算法对进程的执行时间要求较高,需要准确估计执行时间,否则可能导致长进程等待时间过长。

在实际应用中,通常会根据具体情况选择不同的调度算法。

例如,在交互式系统中,为了提供更好的用户体验,使用SJF算法能够减少响应时间;而在批处理系统中,FCFS算法通常被用于处理较短的作业。

操作系统常用调度算法

操作系统常用调度算法

操作系统常⽤调度算法在操作系统中存在多种调度算法,其中有的调度算法适⽤于作业调度,有的调度算法适⽤于进程调度,有的调度算法两者都适⽤。

下⾯介绍⼏种常⽤的调度算法。

先来先服务(FCFS)调度算法FCFS调度算法是⼀种最简单的调度算法,该调度算法既可以⽤于作业调度也可以⽤于进程调度。

在作业调度中,算法每次从后备作业队列中选择最先进⼊该队列的⼀个或⼏个作业,将它们调⼊内存,分配必要的资源,创建进程并放⼊就绪队列。

在进程调度中,FCFS调度算法每次从就绪队列中选择最先进⼊该队列的进程,将处理机分配给它,使之投⼊运⾏,直到完成或因某种原因⽽阻塞时才释放处理机。

下⾯通过⼀个实例来说明FCFS调度算法的性能。

假设系统中有4个作业,它们的提交时间分别是8、8.4、8.8、9,运⾏时间依次是2、1、0.5、0.2,系统⾤⽤FCFS调度算法,这组作业的平均等待时间、平均周转时间和平均带权周转时间见表2-3。

表2-3 FCFS调度算法的性能作业号提交时间运⾏时间开始时间等待时间完成时间周转时间带权周转时间18280102128.4110 1.611 2.6 2.638.80.511 2.211.5 2.7 5.4490.211.5 2.511.7 2.713.5平均等待时间 t = (0+1.6+2.2+2.5)/4=1.575平均周转时间 T = (2+2.6+2.7+2.7)/4=2.5平均带权周转时间 W = (1+2.6+5.牡13.5)/4=5.625FCFS调度算法属于不可剥夺算法。

从表⾯上看,它对所有作业都是公平的,但若⼀个长作业先到达系统,就会使后⾯许多短作业等待很长时间,因此它不能作为分时系统和实时系统的主要调度策略。

但它常被结合在其他调度策略中使⽤。

例如,在使⽤优先级作为调度策略的系统中,往往对多个具有相同优先级的进程按FCFS原则处理。

FCFS调度算法的特点是算法简单,但效率低;对长作业⽐较有利,但对短作业不利(相对SJF和⾼响应⽐);有利于CPU繁忙型作业,⽽不利于I/O繁忙型作业。

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

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

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

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

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

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

然后把它放入就绪队列。

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

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

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

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

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

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

该优先级的变化规律可以描述为:优先权 = (等待时间 + 要求服务时间)/要求服务时间三、实验内容源程序:#include<>#include<>#include<>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; d = 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; 来先服务算法该算法严格按照各作业到达时间来为其分配进程和资源,实验的结果见截图,最后算出该算法五个作业的平均周转时间。

调度算法OS

调度算法OS

调度算法OS调度算法(OS)2011-04-05 20:59处理机调度的分级高级、中级和低级调度作业从提交开始直到完成,往往要经历下述三级调度:高级调度:(High-Level Scheduling)又称为作业调度,它决定把后备作业调入内存运行;低级调度:(Low-Level Scheduling)又称为进程调度,它决定把就绪队列的某进程获得CPU;中级调度:(Intermediate-Level Scheduling)又称为在虚拟存储器中引入,在内、外存对换区进行进程对换。

1.进程调度算法(处理器管理)A).先来先服务和短作业(进程)优先调度算法B).高优先权优先调度算法C).基于时间片的轮转调度算法2.作业调度算法2)短作业优先法SJF、3)最高响应比优先法HRN、4定时轮转法和优先数法3.移臂(磁盘)调度算法(设备管理根本目的在于有效利用磁盘,保证磁盘的快速访问)1)先来先服务算法;(根据访问者提出访问请求的先后次序来决定执行次序。

)2)最短寻找时间优先调度算法;(从等待的访问者中挑选寻找时间最短的那个请求执行,而不管访问者的先后次序。

)3)电梯4)单向扫描4.页式调度算法(存储器管理)1先进先出调度算法2最近最少调度算法3最近最不常用调度算法/////////////////////////////调度算法是指:根据系统的资源分配策略所规定的资源分配算法。

进程调度算法(处理器管理)一、先来先服务和短作业(进程)优先调度算法1.先来先服务调度算法先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。

FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。

由此可知,本算法适合于CPU繁忙型作业,而不利于I/O繁忙型的作业(进程)。

2.短作业(进程)优先调度算法短作业(进程)优先调度算法(SJ/PF)是指对短作业或短进程优先调度的算法,该算法既可用于作业调度,也可用于进程调度。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

操作系统第13讲:第4章 处理机调度调度算法.ppt

操作系统第13讲:第4章 处理机调度调度算法.ppt
(4) 尽力而为调度算法类:这一类算法不进行可能性分析,只 对到达的事件和相关任务指定相应的优先级,并进行调度。 尽力而为调度方式开销较小,实现容易。但是,该算法不一 定满足用户要求的处理时限。
2019/10/31
18
4.6 实时系统调度方算法简介
四、时限调度算法
导语:基本思想是:按用户的时限要求顺序设置优先级,优先
●实时系统所处理的外部任务可分为周期性的与非周期性的两大类。非周期性 任务,存在有一个完成或开始进行处理时限;而周期性任务要求在周期T内 完成或开始进行处理。
2019/10/31
13
4.6 实时系统调度算法简介
一、实时系统的特点
1.有限等待和响应时间(决定性) 2.可靠性高 3.用户可以控制 4.系统纠错能力强,实时系统要求很高的可靠性。
导语:
●实时系统广泛用在移动通信、网络计算、航空航天等领域。os是实时系统中 最重要的部分之一,它负责在用户要求的时限内进行事件处理和控制。
●实时系统与其他系统的最大区别:处理和控制的正确性不仅取决于计算的逻 辑结果,而且取决于计算和处理结果产生的时间。因此,实时系统的调度, 即把给定的任务,按所要求的时限调配到相应的设备上处理完成。根据实 时系统对处理外部事件的时限要求,分为硬、软实时任务。 ◆硬实时任务要求系统必须完全满足任务的时限要求。 ◆软实时任务允许时限要求有一定的延迟,时限要求只是一个相对条件。
注意P90: 周转T、完成T、提交T、带权周转T等概念在公式中的含义。 ●分析结论:P3 执行的时间非常短,但等待时间过长,显然是不合理的。
2019/10/31
3
4.4 调度算法
二、短作业或短进程调度算法(SJF)
1. 适应范围:作业或进程 2. 原则:选取最短作业或进程进行执行 3. 优点:当短作业或短进程较多时,系统效率较高 4. 缺陷:对长作业不利,设有考虑优先级

进程调度模拟设计——先来先服务优先级法

进程调度模拟设计——先来先服务优先级法

进程调度模拟设计——先来先服务优先级法首先,我们来介绍先来先服务调度算法。

FCFS调度算法的原则是按照进程到达的先后顺序进行调度,即先到先执行。

具体步骤如下:1.首先,将所有等待执行的进程按照到达的时间进行排序,即按照先后顺序排列进程队列。

2.选择队列中的第一个进程执行,其余的进程处于等待状态。

3.当当前进程执行完毕或者发生阻塞时,调度器从进程队列中选择下一个进程执行。

4.重复以上步骤,直到所有进程执行完毕。

虽然FCFS调度算法的实现简单,但是存在一个明显的问题,即“饥饿问题”,即如果队列中存在一个长时间执行的进程,其他进程会一直等待,无法得到执行机会。

为了解决饥饿问题,我们引入优先级法调度算法。

优先级法调度算法基于每个进程的优先级来决定调度顺序,具体步骤如下:1.对每个进程设置一个优先级,取值范围从1到n,数值越高表示优先级越高。

2.调度器根据进程的优先级将进程排序,高优先级的进程排在前面。

3.选择优先级最高的进程执行,其余进程处于等待状态。

4.当当前进程执行完毕或者发生阻塞时,调度器从进程队列中选择下一个优先级最高的进程执行。

5.重复以上步骤,直到所有进程执行完毕。

优先级法调度算法解决了饥饿问题,使得所有进程都有机会执行。

然而,优先级法调度算法可能存在一个问题,即“优先级反转问题”。

如果一个低优先级的进程持有一个高优先级的资源,那么其他高优先级的进程就会一直等待,无法得到高优先级资源的使用权。

为了解决优先级反转问题,可以引入优先级继承机制或者抢占式调度策略。

总结起来,先来先服务调度算法按照进程到达的先后顺序进行调度,实现简单但容易导致饥饿问题;优先级法调度算法根据进程的优先级进行调度,避免了饥饿问题但可能导致优先级反转问题。

需要根据不同的应用场景和需求来选择合适的调度算法。

操作系统部分习题参考答案(孙钟秀版)

操作系统部分习题参考答案(孙钟秀版)

操作系统部分习题参考答案(孙钟秀版)操作系统部分习题参考答案第⼀章2. ⼀个计算机系统,有⼀台输⼊机和⼀台打印机,现有两道程序投⼊运⾏,且程序A先开始做,程序B后开始运⾏。

程序A的运⾏轨迹为:计算50ms、打印100ms、再计算50ms、打印100ms,结束。

程序B的运⾏轨迹为:计算50ms、输⼊80ms、再计算100ms,结束。

试说明(1)两道程序运⾏时,CPU有⽆空闲等待?若有,在哪段时间内等待?为什么会等待?(2)程序A、B有⽆等待CPU的情况?若有,指出发⽣等待的时刻。

答:画出两道程序并发执⾏图如下:(1) 两道程序运⾏期间,CPU存在空闲等待,时间为100⾄150ms之间(见图中有⾊部分)。

(2) 程序A⽆等待现象,但程序B有等待。

程序B有等待时间段为180ms⾄200ms间(见图中有⾊部分)。

5. 在单CPU和两台I/O(I1,I2)设备的多道程序设计环境下,同时投⼊三个作业运⾏。

它们的执⾏轨迹如下:Job1:I2(30ms)、CPU(10ms)、I1(30ms)、CPU(10ms)Job2:I1(20ms)、CPU(20ms)、I2(40ms)Job3:CPU(30ms)、I1(20ms)如果CPU、I1和I2都能并⾏⼯作,优先级从⾼到低为Job1、Job2和Job3,优先级⾼的作业可以抢占优先级低的作业的CPU。

试求:(1)每个作业从投⼊到完成分别所需的时间。

(2) 从作业的投⼊到完成CPU的利⽤率。

(3)I/O设备利⽤率。

答:画出三个作业并⾏⼯作图如下(图中着⾊部分为作业等待时间):(1) Job1从投⼊到运⾏完成需80ms,Job2从投⼊到运⾏完成需90ms,Job3从投⼊到运⾏完成需90ms。

(2) CPU空闲时间段为:60ms⾄70ms,80ms⾄90ms。

所以CPU利⽤率为(90-20)/80=77.78%。

(3) 设备I1空闲时间段为:20ms⾄40ms,故I1的利⽤率为(90-20)/90=77.78%。

C++-实现进程调度算法-有先来先服务、优先级调度、短作业优先、响应比高优先

C++-实现进程调度算法-有先来先服务、优先级调度、短作业优先、响应比高优先

课程设计报告书实践课题:操作系统课程设计姓名:学号:完成时间:指导老师:(老师)一、设计摘要利用C++,实现进程调度算法,有先来先服务、优先级调度、短作业优先、响应比高优先,进一步理解了进程调度各种算法的概念及含义。

二、设计背景在OS中,调度的实质是一种资源分配,调度算法即指:根据系统的资源分配策略所规定的资源分配算法。

对于不同的系统和系统目标,通常采用不同的调度算法,如在批处理系统中,为照顾为数众多的短作业,采用短作业有限调度算法;在分时系统中,为保证系统具有合理的响应时间,采用轮转法进行调度。

采用算法时,则要考虑多方面因素,以便达到最佳效果。

三、主要技术/算法简介#include<iostream>using namespace std;#define MAX 10struct task_struct{char name[10]; /*进程名称*/int number; /*进程编号*/float come_time; /*到达时间*/float run_begin_time; /*开始运行时间*/float run_time; /*运行时间*/float run_end_time; /*运行结束时间*/int priority; /*优先级*/int order; /*运行次序*/int run_flag; / *调度标志*/}tasks[MAX];int counter; /*实际进程个数*/int fcfs(); /*先来先服务*/int ps(); /*优先级调度*/int sjf(); /*短作业优先*/int hrrn(); /*响应比高优先*/int pinput(); /*进程参数输入*/int poutput(); / *调度结果输出*/void main(){ int option;pinput();printf("请选择调度算法(0~4):\n");printf("1.先来先服务\n");printf("2.优先级调度\n");printf("3.短作业优先\n");printf("4.响应比高优先\n");printf("0.退出\n");scanf("%d",&option);switch (option){case 0:printf("运行结束。

编程进程或作业先来先服务高优先权按时间片轮转调度算法

编程进程或作业先来先服务高优先权按时间片轮转调度算法

编程进程或作业先来先服务高优先权按时间片轮转调度算法学生实验报告姓名:年级专业班级 10 级计算机3 班日期 201 2 年 12 月 9 日成绩课程名称计算机操作系统实验名称 2 编程进程或作业先来先服务、权、按时间片轮转调度算法(4 课时)实验类型验证设计综合创新【实验目的、要求】(1)通过编写程序实现进程或作业先来先服务、权、按时间片轮转调度算法,使学生进一步掌握进程调度的概念和算法,加深对处理机分配的理解。

(2)了解Windows2000/XP 中进程(线程)的调度机制。

(3)学习使用Windows2000/XP 中进程(线程)调度算法,掌握相应的与调度有关的Win32 API 函数。

【实验内容】在Windows XP、Windows 2000 等操作系统下,使用的VC、VB、java 或C 等编程语言,利用相应的WIN32 API 函数,编写程序实现进程或作业先来先服务、权、按时间片轮转调度算法。

【实验环境】(含主要设计设备、器材、软件等)一台计算机及c++软件【实验步骤、过程】(含原理图、流程图、关键代码,或实验过程中的记录、数据等)1、进程调度算法:采用多级反馈队列调度算法。

其基本思想是:当一个新进程进入内在后,首先将它放入第一个队列的末尾,按FCFS 原则排队等待高度。

当轮到该进程执行时,如能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚为完成,调度程序便将该进程转入第二队列的末尾,再同样地按FCFS 原则等待调度执行,以此类推。

2、实验步骤: (1)按先来先服务算法将进程排成就绪队列。

(2)检查所有队列是否为空,若空则退出,否则将队首进程调入执行。

(3)检查该运行进程是否运行完毕,若运行完毕,则撤消进程,否则,将该进程插入到下一个逻辑队列的队尾。

(4)是否再插入新的进程,若是则把它放到第一逻辑队列的列尾。

(5)重复步骤(2)、(3)、(4),直到就绪队列为空。

先来先服务、短作业优先、时间片轮转、高优先权算法

先来先服务、短作业优先、时间片轮转、高优先权算法

#include<iostream>#define N 4#include <string>//时间片系列#include<stdio.h>#include<stdlib.h>#define MAX 4 //进程数量#define RR 4 //时间片大小//时间片系列using namespace std;struct time{string name;float arriveTime;float runTime;float finishTime;float totalTime;float weightTotalTime;};//时间片系列struct pro{char num;int arriveTime;int burst;int rt; //记录进程被运行的次数struct pro *next;};int TOTALTIME; //记录所有进程的总时间//时间片系列//函数声明struct pro* creatList();void insert(struct pro *head,struct pro *s);struct pro* searchByAT(struct pro *head,int AT);void del(struct pro* p);int getCount(struct pro *head,int time);struct pro* searchEnd(struct pro *head);void move(struct pro *headF,struct pro *headT,int n);struct pro* creatList() //创建链表,按照进程的到达时间排列,记录所有进程的信息{struct pro* head=(struct pro*)malloc(sizeof(struct pro));head->next=NULL;struct pro* s;int i;TOTALTIME=0;cout<<"输入进程名& 到达时间& 运行时间(example:a 0 0):"<<endl;cout<<"name "<<"arrivetime "<<"runtime"<<endl;for(i=0;i<MAX;i++){s=(struct pro*)malloc(sizeof(struct pro));cin>>s->num;cin>>s->arriveTime;cin>>s->burst;TOTALTIME+=s->burst; //计算总时间s->rt=1; //rt的初始值为1s->next=NULL;insert(head,s);}return head; //到达队列中的进程按照其到达时间的先后顺序排列}void insert(struct pro *head,struct pro *s) //插入节点{struct pro *p=searchByAT(head,s->arriveTime);s->next=p->next;p->next=s;return;}struct pro* searchByAT(struct pro *head,int AT) //查找第一个到达时间大于等于AT的节点,返回其前一个指针{struct pro *p,*q;p=head;q=head->next;while(q!=NULL&&q->arriveTime<=AT){p=q;q=q->next;}return p;}void del(struct pro* p) //删除p的下一个节点{struct pro *tmp;tmp=p->next;p->next=tmp->next;return;}int getCount(struct pro *head,int time) //察看在time之前到达但未移动到运行队列的进程数量{int count=0;struct pro *s,*t;s=head;t=s->next;while(t!=NULL&&t->arriveTime<=time){s=t;t=t->next;count++; //count记录当前时刻到达的进程数}return count;}struct pro* searchEnd(struct pro *head) //查找并返回循坏队列的尾节点的前一个节点{struct pro *p,*q;p=head;q=head->next;while(q->next!=head){p=q;q=q->next;}return p;}void move(struct pro *headF,struct pro *headT,int n) //将headF后的n个节点移动到循环队列headT中{struct pro *r,*s,*t;s=headF;t=s->next;r=t; //r记录要移动的第一个节点while(n>1){t=t->next;}s->next=t->next; //以上完成从原队列中摘除相关节点,r,t分别为第一个和最后一个节点s=searchEnd(headT);if(s!=headT)s=s->next;t->next=s->next;s->next=r;struct pro *f=s;}void run(struct pro *head){int time=0; //记录当前时间int newarrive;//新到达进程数struct pro *runhead=(struct pro*)malloc(sizeof(struct pro));runhead->next=runhead; //创建新的循环链表,存放当前就绪队列中的进程struct pro *p,*q;p=runhead;q=p->next; //q记录当前应当运行的进程while(time<=TOTALTIME){newarrive=getCount(head,time);if(newarrive>0)move(head,runhead,newarrive); //将head后的newarrive个节点移动到runhead队列中if(runhead->next==runhead) //就绪队列中没有进程time++;else if(q==runhead){p=q;q=q->next;}else{cout<<"进程名:"<<q->num<<endl;cout<<"到达时间:"<<q->arriveTime<<endl;if(q->rt==1)printf("响应时间:%d\n",time-q->arriveTime);elseprintf("第%d次运行开始时间:%d\n",q->rt,time);if(q->burst<=RR){time+=q->burst;printf("第%d次运行结束时间:%d\n",q->rt,time);printf("周转时间:%d\n",time-q->arriveTime);printf("************************************\n");struct pro *tmp=q;q=q->next;p->next=q;runhead->next=q;free(tmp);}else //q->burst>RR{time+=RR;printf("第%d次运行结束时间:%d\n",q->rt,time);printf("************************************\n");q->burst-=RR;q->rt++;struct pro *h;h=runhead->next;if(h->next!=runhead){while(h->next!=runhead)h=h->next;runhead->next=q->next;h->next=q;q->next=runhead;q=runhead->next;}else{ struct pro *n;n=q;p=q;q=q->next;}}}}}//时间片系列void InputTime(time *p){int i;//countercout<<"input name & arrive time & run time(example:a 00):"<<endl;cout<<"name "<<"arrivetime "<<"runtime"<<endl;for(i=0;i<=N-1;i++){float temp1,temp2;string name;cin>>name;p[i].name=name;cin>>temp1;p[i].arriveTime=temp1;cin>>temp2;p[i].runTime=temp2;}}void Print(time *p,float totalTimeSum,float weightTotalTimeSum){cout<<"********运行次序:"<<endl;for(int k=0;k<=N-1;k++){cout<<p[k].name<<" ";}cout<<endl;cout<<"平均周转时间:"<<totalTimeSum/N<<endl;cout<<"平均带权周转时间:"<<weightTotalTimeSum/N<<endl; }void sort(time *p){for(int i=0;i<=N-1;i++)for(int j=0;j<=i;j++)if(p[i].arriveTime<p[j].arriveTime){time temp;temp=p[i];p[i]=p[j];p[j]=temp;}}void deal(time *p,float &totalTimeSum,float&weightTotalTimeSum){int k;//counterfor(k=0;k<=N-1;k++){if(k==0)p[k].finishTime=p[k].arriveTime+p[k].runTime;elsep[k].finishTime=p[k-1].finishTime+p[k].runTime;}for(k=0;k<=N-1;k++){p[k].totalTime=p[k].finishTime-p[k].arriveTime;p[k].weightTotalTime=p[k].totalTime/p[k].runTime;totalTimeSum+=p[k].totalTime;weightTotalTimeSum+=p[k].weightTotalTime;}}void FCFS(time *p){float totalTimeSum=0,weightTotalTimeSum=0;sort(p);deal(p,totalTimeSum,weightTotalTimeSum);cout<<endl;cout<<"**********************"<<endl;cout<<"***先来先服务:"<<endl;Print(p,totalTimeSum,weightTotalTimeSum);cout<<"****************"<<endl;}void SWF(time *p){float totalTimeSum=0,weightTotalTimeSum=0;sort(p);for(int m=0;m<N-1;m++){if(m==0)p[m].finishTime=p[m].arriveTime+p[m].runTime;elsep[m].finishTime=p[m-1].finishTime+p[m].runTime;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].runTime;int follow=m+1;for(int k=m+1;k<m+i;k++){if(p[k+1].runTime<min){min=p[k+1].runTime;follow=k+1;}}time temp;temp=p[m+1];p[m+1]=p[follow];p[follow]=temp;}deal(p,totalTimeSum,weightTotalTimeSum);cout<<endl;cout<<"**********************"<<endl;cout<<"***短作业优先:"<<endl;Print(p,totalTimeSum,weightTotalTimeSum);cout<<"**********************"<<endl;}void TRRF(time *p){float totalTimeSum=0,weightTotalTimeSum=0;sort(p);for(int m=0;m<N-1;m++){if(m==0)p[m].finishTime=p[m].arriveTime+p[m].runTime;elsep[m].finishTime=p[m-1].finishTime+p[m].runTime;int i=0;for(int n=m+1;n<=N-1;n++){if(p[n].arriveTime<=p[m].finishTime)i++;}float max=(p[m].finishTime-p[m+1].arriveTime)/p[m+1].runTime;int follow=m+1;for(int k=m+1;k<m+i;k++){if(max<=(p[m].finishTime-p[k+1].arriveTime)/p [k+1].runTime){max=(p[m].finishTime-p[k+1].arriveTime)/p[k+1].runTime;follow=k+1;}}time temp;temp=p[m+1];p[m+1]=p[follow];p[follow]=temp;}deal(p,totalTimeSum,weightTotalTimeSum);cout<<endl;cout<<"**********************"<<endl;cout<<"***最高响应比优先:"<<endl;Print(p,totalTimeSum,weightTotalTimeSum);cout<<"**********************"<<endl;}void main(){int lg;cout<<"请选择任一种算法:"<<endl;cout<<"1.FCFS(先来先服务)2.SWF(短作业优先)3.TRRF(高响应比优先) 4.RR(时间片轮转)0.退出"<<endl;cin>>lg;cout<<endl;time a[N],b[N],c[N];while (lg){if(lg==1){InputTime(a);FCFS(a);cout<<endl;}//time *b=a;time *c=a;if(lg==2){InputTime(b);SWF(b);cout<<endl;}if(lg==3){InputTime(c);TRRF(c);cout<<endl;}//时间片系列if(lg==4){cout<<endl;cout<<"********时间片模拟*******"<<endl;struct pro *head=creatList();printf("当前时间片大小为:%d\n",RR);run(head);cout<<endl;}cout<<"1.FCFS(先来先服务)2.SWF(短作业优先)3.TRRF(高响应比优先) 4.RR(时间片轮转)0.退出"<<endl;cin>>lg;cout<<endl;}cout<<"您选择了退出模拟。

四种进程调度算法 先到先服务,优先级,短作业优先,时间片轮转

四种进程调度算法 先到先服务,优先级,短作业优先,时间片轮转

#include"stdio.h"#define N 50int n;int sj;struct Gzuo{int id; //进程名字int dt; //到达时刻int st; //服务时间int wct; //完成时刻int yxj; //优先级int st2; //标志是否完成float zt; //周转时间float dczt; //带权周转时间};Gzuo a[N];void input(Gzuo a[]){printf("请输入进程个数:");scanf("%d",&n);for(int i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间:");scanf("%d",&a[i].dt);printf("\t服务时间:");scanf("%d",&a[i].st);a[i].st2 = a[i].st;printf("\n");}printf("\t请输入时间片大小(0<sjp):\t"); scanf("%d",&sj);}void sjp(Gzuo a[],int sj)//时间片轮转调度{int i,j,min,time;float sum1,sum2;bool flag=true;/*printf("\t请输入进程数(0<n<=50):\t"); scanf("%d",&n);while(n>50||n<=0){printf("n\t请重新输入:");scanf("%d",&n);printf("\n\n");printf("\t请输入时间片大小(0<sjp):\t"); scanf("%d",&sjp);while(sjp<=0){printf("n\t请重新输入:");scanf("%d",&sjp);}/*struct Gzuo{int id; //进程名字int dt; //到达时刻int st; //服务时间int wct; //完成时刻int st2; //标志是否完成float zt; //周转时间float dczt; //带权周转时间};Gzuo a[N];for(i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间:");scanf("%d",&a[i].dt);printf("\t服务时间:");scanf("%d",&a[i].st);a[i].st2 = a[i].st;printf("\n");}*/for(j=n-1;j>=0;j--){for(i=0;i<j;i++){if(a[i].dt>a[i+1].dt){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].st2;a[i].st2=a[i+1].st2;a[i+1].st2=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}time = a[0].dt;//printf("赋值后TIME值为:%d\n",time);min = 0;while(min<n){flag=true;for(i=0;i<n;i++){if(a[i].st2>0&&a[i].dt<=time)flag=false;}for(i=0;i<n;i++){if(a[i].st2 > 0 ){if(a[i].dt<=time){//printf("当前a[%d].st2值为:%d\n",i,a[i].st2);a[i].st2 = a[i].st2 - sj;//printf("运算后当前a[%d].st2值为:%d\n",i,a[i].st2); //printf("当前TIME值为:%d\n",time);time = time + sj;//printf("增加之后TIME值为:%d\n",time);if(a[i].st2<=0){a[i].wct = time + a[i].st2;a[i].zt=(float)(a[i].wct-a[i].dt);a[i].dczt=a[i].zt/a[i].st;min++;}}else if(flag)for(i=0;i<n;i++){if(a[i].st2>0&&a[i].dt>time){time = a[i].dt;break;}}}}}}printf("\n进程:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");sum1=0;sum2=0;for(j=0;j<n;j++){for(i=0;i<n;i++)if(a[i].id==j+1){printf("%d:%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt ,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}}printf("**************************************************************** *****\n");}void fcfs(Gzuo a[])//先到先服务调度{int i,j,min;float sum1,sum2;/*printf("\t请输入进程数(0<n<=50):\t");scanf("%d",&n);while(n>50||n<=0)printf("n\t请重新输入:"); scanf("%d",&n);}printf("\n\n");/*struct Gzuo{int id; //进程名字int dt; //到达时刻int st; //服务时间int wct; //完成时刻float zt; //周转时间float dczt; //带权周转时间 };Gzuo a[N];for(i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间:");scanf("%d",&a[i].dt);printf("\t服务时间:");scanf("%d",&a[i].st);printf("\n");}*/for(j=n-1;j>=0;j--){for(i=0;i<j;i++){if(a[i].dt>a[i+1].dt){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}a[0].wct=a[0].st+a[0].dt;a[0].zt=(float)a[0].st;a[0].dczt=a[0].zt/a[0].st;for(i=1;i<n;i++){if(a[i].dt>a[i-1].wct){a[i].wct=a[i].dt+a[i].st;a[i].zt=(float)a[i].st;a[i].dczt=a[i].zt/a[i].st;}else{a[i].wct=a[i-1].wct+a[i].st;a[i].zt=(float)(a[i].wct-a[i].dt);a[i].dczt=a[i].zt/a[i].st;}}printf("\n进程:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");sum1=0;sum2=0;for(j=0;j<n;j++){for(i=0;i<n;i++)if(a[i].id==j+1){printf("%d:%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt ,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}}printf("****************************************************************** ***\n");}void sjf(Gzuo a[])//短作业优先调度{int i,j,min;int b=0,z;float sum1,sum2;/*printf("\n\t\t请输入进程数(0<n<=50):\t"); scanf("%d/n",&n);while(n>50||n<=0){printf("n\t请重新输入:");scanf("%d",&n);}printf("\n");/*struct Gzuo{int id; //进程名字int dt; //到达时刻int st; //服务时间int wct; //完成时刻float zt; //周转时间float dczt; //带权周转时间};Gzuo a[N];for(i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间:");scanf("%d",&a[i].dt);printf("\t服务时间:");scanf("%d",&a[i].st);printf("\n");}*/min=a[0].dt;for(j=n-1;j>=0;j--){for(i=0;i<j;i++){if(a[i].dt>a[i+1].dt){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}if(a[i].dt==a[i+1].dt&&a[i].st>a[i+1].st) {min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}a[0].wct=a[0].st+a[0].dt;a[0].zt=(float)a[0].st;a[0].dczt=a[0].zt/a[0].st;for(i=1;i<n;i++){if(a[i].dt>a[0].wct) ;else b=b+1;}for(j=b-1;j>=1;j--){for(i=1;i<j;i++){if(a[i].st>a[i+1].st){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}for(i=1;i<n;i++){if(a[i].dt>a[i-1].wct){a[i].wct=a[i].dt+a[i].st;a[i].zt=(float)a[i].st;a[i].dczt=a[i].zt/a[i].st;}else{a[i].wct=a[i-1].wct+a[i].st;a[i].zt=(float)(a[i].wct-a[i].dt); a[i].dczt=a[i].zt/a[i].st;}for(j=i+1,b=j;j<n;j++){if(a[j].dt>a[i].wct) ;else b=b+1;}for(j=b-1;j>=i;j--){for(z=i;z<j;z++){if(a[z].st>a[z+1].st){min=a[z].dt;a[z].dt=a[z+1].dt;a[z+1].dt=min;min=a[z].st;a[z].st=a[z+1].st;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}}printf("\n进程:到达时间\t服务时间\t完成时间\t周转时间\t带权周转时间\n");sum1=0;sum2=0;for(j=0;j<n;j++){ for(i=0;i<n;i++)if(a[i].id==j+1){printf("%d:%d\t\t%d\t\t%d\t\t%.0f\t\t%.2f\n",a[i].id,a[i].dt,a[i].st,a[i].wct,a[i].zt, a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}}printf("****************************************************************** ***\n");}void yxj(Gzuo a[])//优先级优先调度{int i,j,min;int b=0,z;float sum1,sum2;/*printf("\n\t\t请输入进程数(0<n<=50):\t");scanf("%d/n",&n);while(n>50||n<=0){printf("n\t请重新输入:");scanf("%d",&n);}printf("\n");/* struct Gzuo{int id; //进程名字int dt; //到达时刻int st; //服务时间int yxj; //优先级int wct; //完成时刻float zt; //周转时间float dczt; //带权周转时间 };Gzuo a[N];for(i=0;i<n;i++){a[i].id=i+1;printf("\t到达时间:"); scanf("%d",&a[i].dt);printf("\t服务时间:"); scanf("%d",&a[i].st);printf("\t优先级:");scanf("%d",&a[i].yxj);printf("\n");}*/min=a[0].dt;for(j=n-1;j>=0;j--){for(i=0;i<j;i++){if(a[i].dt>a[i+1].dt){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min; min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;min=a[i].yxj;a[i].yxj=a[i+1].yxj;a[i+1].yxj=min;}if(a[i].dt==a[i+1].dt&&a[i].yxj<a[i+1].yxj) {min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;min=a[i].yxj;a[i].yxj=a[i+1].yxj;a[i+1].yxj=min;}}}a[0].wct=a[0].st+a[0].dt;a[0].zt=(float)a[0].st;a[0].dczt=a[0].zt/a[0].st;for(i=1;i<n;i++){if(a[i].dt>a[0].wct) ;else b++;}for(j=b-1;j>=1;j--){for(i=1;i<j;i++){if(a[i].yxj<a[i+1].yxj){min=a[i].dt;a[i].dt=a[i+1].dt;a[i+1].dt=min;min=a[i].st;a[i].st=a[i+1].st;a[i+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;min=a[i].yxj;a[i].yxj=a[i+1].yxj;a[i+1].yxj=min;}}}for(i=1;i<n;i++){if(a[i].dt>a[i-1].wct){a[i].wct=a[i].dt+a[i].st;a[i].zt=(float)a[i].st;a[i].dczt=a[i].zt/a[i].st;}else{a[i].wct=a[i-1].wct+a[i].st;a[i].zt=(float)(a[i].wct-a[i].dt); a[i].dczt=a[i].zt/a[i].st;}for(j=i+1,b=j;j<n;j++){if(a[j].dt>a[i].wct) ;else b=b+1;}for(j=b-1;j>=i;j--){for(z=i;z<j;z++){if(a[z].yxj<a[z+1].yxj){min=a[z].dt;a[z].dt=a[z+1].dt;a[z+1].dt=min;min=a[z].st;a[z].st=a[z+1].st;a[z+1].st=min;min=a[i].id;a[i].id=a[i+1].id;a[i+1].id=min;}}}}printf("\n进程:到达时间\t服务时间\t优先级\t完成时间\t周转时间\t带权周转时间\n"); sum1=0;sum2=0;for(j=0;j<n;j++){ for(i=0;i<n;i++)if(a[i].id==j+1){printf("%d:%d\t\t%d\t\t%d\t\t%d\t\t%.0f\t%.2f\n",a[i].id,a[i].dt,a[i].yxj,a[i].st,a[i ].wct,a[i].zt,a[i].dczt);sum1+=a[i].zt;sum2+=a[i].dczt;}}printf("****************************************************************** ***\n");}void main(){ int n;input(a);printf("以下是先到先服务调度:");fcfs(a);printf("以下是短作业优先调度:");sjf(a);printf("以下是时间片轮转法:");sjp(a,sj);printf("以下是优先级优先调度:");yxj(a); }。

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

(售后服务)操作系统编程进程或作业先来先服务高优先权按时间片轮转调度
算法
湖南农业大学科学技术师范学院
学生实验报告
(高优先权流程图)
(按时间片轮转调度)
程序说明及实现:
1)先来先服务调度算法:
高响应比优先实现进程调度.(用C语言实现),
2)优先级调度程序:
该程序由主程序、构造队列子程序、打印子程序、运行子程序构成。

3)时间片轮转法程序:
于此程序中由于程序比较小,未进行分模块设计。

直接采用单壹模块。

1先来先服务
#include<stdio.h> floatt,d;/*定义俩个全局变量*/
struct/*定义壹个结构体数组,包括进程的信息*/
{
intid;
floatArriveTime;
floatRequestTime;
floatStartTime;
floatEndTime;
floatRunTime;
floatDQRunTime;
intStatus;
}arrayT ask[4];/*定义初始化的结构体数组*/
GetTask()/*给结构体数组赋值,输入到达,服务时间*/
{inti;
floata;
for(i=0;i<4;i++)
{arrayT ask[i].id=i+1;
printf("inputthenumber");
printf("inputthetheArriveTimeofarrayT ask[%d]:",i);/*用户输入进程的时间,初始为零*/
scanf("%f",&a);
arrayT ask[i].ArriveTime=a;
printf("inputtheRequestTimeofarrayT ask[%d]:",i);
scanf("%f",&a);
arrayT ask[i].RequestTime=a;
arrayT ask[i].StartTime=0;
arrayT ask[i].EndTime=0;
arrayT ask[i].RunTime=0;。

相关文档
最新文档