多级反馈队列调度模拟

合集下载

进程调度模拟算法

进程调度模拟算法

进程调度模拟算法进程调度是操作系统中的重要组成部分之一,它负责决定在多道程序环境下,哪个进程将获得CPU的使用权。

进程调度模拟算法是为了研究和评估不同调度策略的性能而开发的一种仿真方法。

在实际系统中,调度算法会受到多种因素的影响,如进程优先级、进程的I/O需求、进程的实际执行时间等。

通过模拟这些因素,可以更好地理解不同调度算法之间的差异,并选择最合适的算法来满足特定需求。

下面介绍两种常见的进程调度模拟算法:先来先服务(FCFS)和最短作业优先(SJF)算法。

1. 先来先服务(FCFS)算法:该算法按照进程到达的顺序来调度任务。

当一个进程完成或阻塞时,下一个已到达的进程将获得CPU的使用权。

这种算法非常简单,但是不适用于长作业时间和短作业时间交替出现的情况。

在短作业启动时,长作业仍然在运行,使得短作业的等待时间增加。

2. 最短作业优先(SJF)算法:该算法根据任务的执行时间来调度进程。

在该算法中,每个进程的执行时间都是已知的,并且操作系统根据已知的执行时间来决定哪个进程获得CPU的使用权。

在短作业优先算法中,短作业将会先被调度,这样有助于减少平均周转时间和等待时间。

但是,短作业优先算法容易产生“饥饿”现象,即长作业可能会一直等待,而短作业一直得到CPU的使用权。

除了以上两种算法,还有其他的进程调度模拟算法。

例如:- 时间片轮转(RR)调度算法:使用固定的时间片来调度进程,当时间片用完后,该进程被放入就绪队列的末尾。

- 优先级调度算法:每个进程都拥有一个优先级,优先级越高的进程越早被调度。

这种方法可以根据不同进程的紧迫程度和重要性来进行调度。

- 多级反馈队列调度算法:将就绪队列划分为多个队列,并根据进程的性质和优先级将进程放入不同的队列。

每个队列都有不同的优先级和时间片大小,进程可以通过提高优先级或时间片大小来提高被调度的机会。

在实际应用中,需要根据系统需求和性能指标选择合适的调度算法。

常用的性能指标包括平均周转时间、平均等待时间、CPU利用率等。

操作系统进程调度算法模拟实验报告

操作系统进程调度算法模拟实验报告

操作系统进程调度算法模拟实验报告一、实验目的本实验旨在深入理解操作系统的进程调度算法,并通过模拟实验来探究不同调度算法之间的差异和优劣。

二、实验原理操作系统的进程调度算法是决定进程执行顺序的重要依据。

常见的调度算法有先来先服务(FCFS)、最短作业优先(SJF)、优先级调度(Priority Scheduling)、轮转法(Round Robin)和多级反馈队列调度(Multilevel Feedback Queue Scheduling)等。

1.先来先服务(FCFS)算法:按照进程到达的先后顺序进行调度,被调度的进程一直执行直到结束或主动阻塞。

2.最短作业优先(SJF)算法:按照进程需要的执行时间的短长程度进行调度,执行时间越短的进程越优先被调度。

3. 优先级调度(Priority Scheduling)算法:为每个进程分配一个优先级,按照优先级从高到低进行调度。

4. 轮转法(Round Robin)算法:将进程按照到达顺序排列成一个队列,每个进程被分配一个时间片(时间量度),当时间片结束时,将进程从队列头取出放置到队列尾。

5.多级反馈队列调度算法:将进程队列分为多个优先级队列,每个队列时间片大小依次递减。

当一个队列中的进程全部执行完毕或者发生阻塞时,将其转移到下一个优先级队列。

三、实验步骤与结果1.实验环境:- 操作系统:Windows 10- 编译器:gcc2.实验过程:(1)首先,设计一组测试数据,包括进程到达时间、需要的执行时间和优先级等参数。

(2)根据不同的调度算法编写相应的调度函数,实现对测试数据的调度操作。

(3)通过模拟实验,观察不同调度算法之间的区别,比较平均等待时间、完成时间和响应时间的差异。

(4)将实验过程和结果进行记录整理,撰写实验报告。

3.实验结果:这里列举了一组测试数据和不同调度算法的结果,以便对比分析:进程,到达时间,执行时间,优先------,----------,----------,-------P1,0,10,P2,1,1,P3,2,2,P4,3,1,P5,4,5,a.先来先服务(FCFS)算法:平均等待时间:3.8完成时间:15b.最短作业优先(SJF)算法:平均等待时间:1.6完成时间:11c. 优先级调度(Priority Scheduling)算法:平均等待时间:2.8完成时间:14d. 轮转法(Round Robin)算法:时间片大小:2平均等待时间:4.8完成时间:17e.多级反馈队列调度算法:第一级队列时间片大小:2第二级队列时间片大小:4平均等待时间:3.8完成时间:17四、实验总结通过上述的实验结果可以得出以下结论:1.在上述测试数据中,最短作业优先(SJF)算法的平均等待时间最短,说明该算法在短作业的情况下能够有效地减少等待时间。

多级反馈队列_实验_操作系统

多级反馈队列_实验_操作系统

实验名称:多级反馈队列调度09091201丁奎荣一、实验目的:1、综合应用下列知识点设计并实现操作系统的进程调度,进程状态转换,多组级反馈队列进程调度算法。

2、加深理解操作系统进程调度的过程。

3、加深理解多级反馈队列进程调度算法。

二、实验内容:1、采用一种熟悉的语言,编制程序,最好采用C/C++,界面设计可采用其它自己喜欢的语言。

2、采用多级反馈队列进程调度算法进行进程调度。

3、每个进程对应一个PCB。

在PCB中包括进程标识符pid、进程的状态标志status、进程优先级priority、进程的队列指针next和表示进程生命周期的数据项life(在实际系统中不包括该项)。

4、创建进程时即创建一个PCB,各个进程的pid都是唯一的,pid时在1到100范围的一个整数。

可以创建一个下标为1到100的布尔数组,“真”表示下标对应的进程号是空闲的,“假”表示下标对应的进程号已分配给某个进程。

5、进程状态status的取值为“就绪ready”或“运行run”,刚创建时,状态为“ready”。

被进程调度程序选中后变为“run”。

6、进程优先级priority是0到49范围内的一个随机整数。

7、生命周期life是1到5范围内的一个随机整数。

8、初始化时,创建一个邻接表,包含50各就绪队列,各就绪队列的进程优先级priority分别是0到49。

9、为了模拟用户动态提交任务的过程,要求动态创建进程。

进入进程调度循环后,每次按ctrl+f即动态创建一个过程,然后将该PCB插入就绪队列中。

按ctrl+q 退出进程调度循环。

10、在进程调度循环中,每次选择优先级最大的就绪进程来执行。

将其状态从就绪变为运行,通过延时一段时间来模拟该进程执行一个时间片的过程,然后优先级减半,生命周期减一。

设计图形用户界面GUI,在窗口中显示该进程和其他所有进程的PCB内容。

如果将该运行进程的生命周期不为0,则重新把它变为就绪状态,插入就绪对列中;否则该进程执行完成,撤销其PCB。

操作系统 多级反馈队列算法例题

操作系统 多级反馈队列算法例题

操作系统:多级反馈队列算法例题在操作系统中,调度算法是用来管理和执行进程的重要工具。

其中,多级反馈队列调度算法是一种经典的调度算法,它能够根据进程的优先级和执行情况动态地调整进程的执行顺序,以达到更高效的资源利用和更快速的响应时间。

接下来,我们将通过一个例题来深入探讨多级反馈队列调度算法的原理和应用。

假设有5个进程,它们的执行时间分别为3、5、2、7和4个单位。

我们可以构建一个具有3个队列的多级反馈队列调度算法,每个队列的优先级不同,分别为高、中、低。

在这个例题中,我们将以此为例,进行具体的调度过程。

将这5个进程按照它们的到达时间依次加入到第一个队列中,然后按照先来先服务的原则进行调度。

假设第一个队列的时间片为2个单位。

在第一个队列中,我们依次执行进程1和进程2,并在时间片用完之后将它们移到第二个队列中。

此时,这两个进程还有未完成的执行时间,因此它们进入第二个队列的队尾。

接下来,轮到第三个进程加入到第一个队列中,并按照相同的规则进行调度。

在第一个队列中,我们执行进程3的两个时间片,然后将它移到第二个队列中。

此时,第一个队列已经没有进程,因此我们开始执行第二个队列中的进程。

依次类推,直到所有的进程执行完毕。

通过这个例题,我们可以清楚地看到多级反馈队列调度算法是如何根据进程的优先级和执行情况进行动态调整的。

它能够兼顾短作业和长作业,保证了系统的公平性和响应速度。

总结起来,多级反馈队列调度算法是一种高效的进程调度算法,它能够根据进程的优先级和执行情况动态地调整执行顺序,以提高系统的资源利用和响应速度。

通过深入地理解和应用这个调度算法,我们能够更好地优化系统性能,提升用户体验。

在我看来,多级反馈队列调度算法是非常值得学习和掌握的一种调度算法。

它不仅能够帮助我们更好地理解操作系统的工作原理,还能够在实际的系统设计和优化中发挥重要作用。

我会继续深入研究这个算法,并将其应用到实际的项目中去。

希望本文能够帮助您更深入地理解多级反馈队列调度算法,并对操作系统有更全面、深刻和灵活的理解。

进程调度实验报告

进程调度实验报告

进程调度实验报告一、实验目的。

本实验旨在通过对进程调度算法的模拟和实验,加深学生对进程调度原理的理解,掌握各种进程调度算法的特点和应用场景,提高学生的实际操作能力和分析问题的能力。

二、实验环境。

本次实验使用了C语言编程语言,通过模拟实现了先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转(RR)和多级反馈队列(MFQ)四种进程调度算法。

三、实验过程。

1. 先来先服务(FCFS)调度算法。

先来先服务调度算法是一种非抢占式的调度算法,按照进程到达的先后顺序进行调度。

在本次实验中,我们通过模拟多个进程到达并排队等待CPU执行,观察其平均等待时间和平均周转时间。

实验结果表明,先来先服务调度算法适用于作业长度差异较大的情况,但容易产生“饥饿”现象。

2. 最短作业优先(SJF)调度算法。

最短作业优先调度算法是一种非抢占式的调度算法,按照作业执行时间的长短进行调度。

在本次实验中,我们通过模拟多个作业的执行时间,观察其平均等待时间和平均周转时间。

实验结果表明,最短作业优先调度算法能够最大程度地减少平均等待时间,但可能会导致长作业被“饿死”。

3. 时间片轮转(RR)调度算法。

时间片轮转调度算法是一种抢占式的调度算法,每个进程被分配一个时间片,当时间片用完后,该进程被放到队尾等待。

在本次实验中,我们通过模拟多个进程的执行和时间片的调度,观察其平均等待时间和平均周转时间。

实验结果表明,时间片轮转调度算法能够保证每个进程都能得到一定的执行时间,但可能会导致上下文切换频繁。

4. 多级反馈队列(MFQ)调度算法。

多级反馈队列调度算法是一种综合性的调度算法,根据进程的优先级和执行时间进行动态调整。

在本次实验中,我们通过模拟多个进程的执行和不同优先级队列的调度,观察其平均等待时间和平均周转时间。

实验结果表明,多级反馈队列调度算法能够兼顾短作业和长作业,提高了系统的整体性能。

四、实验总结。

通过本次实验,我们深入理解了不同进程调度算法的特点和适用场景。

调度的调度算法实验报告

调度的调度算法实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

多级反馈队列调度算法_C语言

多级反馈队列调度算法_C语言

多级反馈队列调度算法C语言模拟实现多级反馈队列调度算法:1、设置多个就绪队列,并给队列赋予不同的优先级数,第一个最高,依次递减。

2、赋予各个队列中进程执行时间片的大小,优先级越高的队列,时间片越小。

3、当一个新进程进入内存后,首先将其放入一个对列末尾,如果在一个时间片结束时尚未完成,将其转入第二队列末尾。

4、当一个进程从一个对列移至第n个队列后,便在第n个队列中采用时间片轮转执行完。

5、仅当时间片空闲时,才调度第二个队列中的进程。

(1~i-1)空闲时,才调度i,如果处理机正在第i队列中运行,又有新进程进入优先权较高队列,则新进程抢占处理机,将正在运行的进程放入第i队列队尾,将处理机分给新进程。

#include <stdio.h>#include <stdlib.h>#include <string.h>typedef struct node /*进程节点信息*/{char name[20]; /*进程的名字*/int prio; /*进程的优先级*/int round; /*分配CPU的时间片*/int cputime; /*CPU执行时间*/int needtime; /*进程执行所需要的时间*/char state; /*进程的状态,W——就绪态,R——执行态,F——完成态*/int count; /*记录执行的次数*/struct node *next; /*链表指针*/}PCB;typedef struct Queue /*多级就绪队列节点信息*/{PCB *LinkPCB; /*就绪队列中的进程队列指针*/int prio; /*本就绪队列的优先级*/int round; /*本就绪队列所分配的时间片*/struct Queue *next; /*指向下一个就绪队列的链表指针*/}ReadyQueue;PCB *run=NULL,*finish=NULL; /*定义三个队列,就绪队列,执行队列和完成队列*/ReadyQueue *Head = NULL; /*定义第一个就绪队列*/int num; /*进程个数*/int ReadyNum; /*就绪队列个数*/void Output(); /*进程信息输出函数*/void InsertFinish(PCB *in); /*将进程插入到完成队列尾部*/void InsertPrio(ReadyQueue *in); /*创建就绪队列,规定优先数越小,优先级越低*/ void PrioCreate(); /*创建就绪队列输入函数*/void GetFirst(ReadyQueue *queue); /*取得某一个就绪队列中的队头进程*/void InsertLast(PCB *in,ReadyQueue *queue); /*将进程插入到就绪队列尾部*/void ProcessCreate(); /*进程创建函数*/void RoundRun(ReadyQueue *timechip); /*时间片轮转调度算法*/void MultiDispatch(); /*多级调度算法,每次执行一个时间片*/int main(void){PrioCreate(); /*创建就绪队列*/ProcessCreate();/*创建就绪进程队列*/MultiDispatch();/*算法开始*/Output(); /*输出最终的调度序列*/return 0;}void Output() /*进程信息输出函数*/{ReadyQueue *print = Head;PCB *p;printf("进程名\t优先级\t轮数\tcpu时间\t需要时间\t进程状态\t计数器\n");while(print){if(print ->LinkPCB != NULL){p=print ->LinkPCB;while(p){printf("%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\n",p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count);p = p->next;}}print = print->next;}p = finish;while(p!=NULL){printf("%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\n",p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count);p = p->next;}p = run;while(p!=NULL){printf("%s\t%d\t%d\t%d\t%d\t\t%c\t\t%d\n",p->name,p->prio,p->round,p->cputime,p->needtime,p->state,p->count);p = p->next;}}void InsertFinish(PCB *in) /*将进程插入到完成队列尾部*/{PCB *fst;fst = finish;if(finish == NULL){in->next = finish;finish = in;}else{while(fst->next != NULL){fst = fst->next;}in ->next = fst ->next;fst ->next = in;}}void InsertPrio(ReadyQueue *in) /*创建就绪队列,规定优先数越小,优先级越低*/{ReadyQueue *fst,*nxt;fst = nxt = Head;if(Head == NULL) /*如果没有队列,则为第一个元素*/{in->next = Head;Head = in;}else /*查到合适的位置进行插入*/{if(in ->prio >= fst ->prio) /*比第一个还要大,则插入到队头*/{in->next = Head;Head = in;}else{while(fst->next != NULL) /*移动指针查找第一个别它小的元素的位置进行插入*/{nxt = fst;fst = fst->next;}if(fst ->next == NULL) /*已经搜索到队尾,则其优先级数最小,将其插入到队尾即可*/{in ->next = fst ->next;fst ->next = in;}else /*插入到队列中*/{nxt = in;in ->next = fst;}}}}void PrioCreate() /*创建就绪队列输入函数*/{ReadyQueue *tmp;int i;printf("输入就绪队列的个数:\n");scanf("%d",&ReadyNum);printf("输入每个就绪队列的CPU时间片:\n");for(i = 0;i < ReadyNum; i++){if((tmp = (ReadyQueue *)malloc(sizeof(ReadyQueue)))==NULL){perror("malloc");exit(1);}scanf("%d",&(tmp->round)); /*输入此就绪队列中给每个进程所分配的CPU时间片*/tmp ->prio = 50 - tmp->round; /*设置其优先级,时间片越高,其优先级越低*/tmp ->LinkPCB = NULL; /*初始化其连接的进程队列为空*/tmp ->next = NULL;InsertPrio(tmp); /*按照优先级从高到低,建立多个就绪队列*/}}void GetFirst(ReadyQueue *queue) /*取得某一个就绪队列中的队头进程*/{run = queue ->LinkPCB;if(queue ->LinkPCB != NULL){run ->state = 'R';queue ->LinkPCB = queue ->LinkPCB ->next;run ->next = NULL;}}void InsertLast(PCB *in,ReadyQueue *queue) /*将进程插入到就绪队列尾部*/{PCB *fst;fst = queue->LinkPCB;if( queue->LinkPCB == NULL){in->next = queue->LinkPCB;queue->LinkPCB = in;}else{while(fst->next != NULL){fst = fst->next;}in ->next = fst ->next;fst ->next = in;}}void ProcessCreate() /*进程创建函数*/{PCB *tmp;int i;printf("输入进程的个数:\n");scanf("%d",&num);printf("输入进程名字和进程所需时间:\n");for(i = 0;i < num; i++){if((tmp = (PCB *)malloc(sizeof(PCB)))==NULL){perror("malloc");exit(1);}scanf("%s",tmp->name);getchar(); /*吸收回车符号*/scanf("%d",&(tmp->needtime));tmp ->cputime = 0;tmp ->state ='W';tmp ->prio = 50 - tmp->needtime; /*设置其优先级,需要的时间越多,优先级越低*/tmp ->round = Head ->round;tmp ->count = 0;InsertLast(tmp,Head); /*按照优先级从高到低,插入到就绪队列*/ }}void RoundRun(ReadyQueue *timechip) /*时间片轮转调度算法*/{int flag = 1;GetFirst(timechip);while(run != NULL){while(flag){run->count++;run->cputime++;run->needtime--;if(run->needtime == 0) /*进程执行完毕*/{run ->state = 'F';InsertFinish(run);flag = 0;}else if(run->count == timechip ->round)/*时间片用完*/{run->state = 'W';run->count = 0; /*计数器清零,为下次做准备*/InsertLast(run,timechip);flag = 0;}}flag = 1;GetFirst(timechip);}}void MultiDispatch() /*多级调度算法,每次执行一个时间片*/{int flag = 1;int k = 0;ReadyQueue *point;point = Head;GetFirst(point);while(run != NULL){Output();if(Head ->LinkPCB!=NULL)point = Head;while(flag){run->count++;run->cputime++;run->needtime--;if(run->needtime == 0) /*进程执行完毕*/{run ->state = 'F';InsertFinish(run);flag = 0;}else if(run->count == run->round)/*时间片用完*/{run->state = 'W';run->count = 0; /*计数器清零,为下次做准备*/if(point ->next!=NULL){run ->round = point->next ->round;/*设置其时间片是下一个就绪队列的时间片*/InsertLast(run,point->next); /*将进程插入到下一个就绪队列中*/flag = 0;}else{RoundRun(point); /*如果为最后一个就绪队列就调用时间片轮转算法*/break;}}++k;if(k == 3){ProcessCreate();}}flag = 1;if(point ->LinkPCB == NULL)/*就绪队列指针下移*/point =point->next;if(point ->next ==NULL){RoundRun(point);break;}GetFirst(point);}}。

多级反馈队列实验报告

多级反馈队列实验报告

多级反馈队列实验报告实验目的本实验旨在通过实践了解多级反馈队列调度算法的原理及应用。

通过模拟多个作业的调度过程,了解多级反馈队列调度算法对于不同类型作业的处理效果,并比较其与其他调度算法的差异。

实验背景在计算机操作系统中,进程调度是一项重要的任务,它决定了不同进程间的运行顺序和优先级。

多级反馈队列调度算法是一种基于队列的调度算法,通过动态调整作业的优先级,使得优先级高的作业能够更快地被处理,提高整体系统的响应速度。

实验过程1. 创建多个作业首先,我们需要创建多个作业模拟实际运行环境下的多任务场景。

每个作业有不同的优先级和执行时间,以模拟不同类型的任务。

2. 创建多级反馈队列在实验中,我们创建了多级反馈队列,用于处理不同优先级的作业。

队列的优先级由高到低依次为1、2、3,其中优先级1的队列时间片最短,而优先级3的队列时间片最长。

3. 调度作业在实验中,我们按照作业的优先级将作业放入相应的队列。

每个队列根据时间片长度进行轮转调度,即每个作业执行一段时间后会被暂停,并放入下一个优先级更低的队列继续执行。

如果作业的执行时间超过了当前队列的时间片长度,作业会被放入优先级更高的队列继续执行。

4. 结果分析通过观察每个作业的执行情况,我们可以比较多级反馈队列调度算法与其他调度算法的优劣。

如果某个作业的执行时间较长,但优先级较低,那么它会在多个队列中轮转执行,从而获得更多的CPU时间。

同时,优先级较高的作业能够更快地被处理,提高整个系统的响应速度。

实验结果经过多次实验,我们得出了以下实验结果:1. 多级反馈队列调度算法能够较好地处理不同类型的作业。

优先级较高的作业能够被更快地处理,而优先级较低的作业也能有机会获得更多的CPU时间。

2. 多级反馈队列调度算法对短作业具有较好的响应速度。

由于时间片较短,短作业能够迅速完成,不会被长作业长时间占用。

3. 多级反馈队列调度算法较其他简单的调度算法更加灵活。

相比于先来先服务调度算法或短作业优先调度算法,多级反馈队列调度算法能够更合理地分配CPU资源,提高整体性能。

多级反馈队列调度算法

多级反馈队列调度算法

多级反馈队列调度算法多级反馈队列调度算法一实验内容以链式结构组成空闲PCB栈,以双向链式结构组成进程的就绪队列和睡眠队列,模拟UNIX的进程管理程序,实现以下操作(可用键盘命令、命令文件或由产生的随机数决定操作和参数)。

(1)创建一个新进程:如pid=newp(pri,size,time),申请空闲PCB和所需内存,填写PCB的各项初始数据,将该PCB送入就绪队列。

(2)调度和执行:自己设计多级反馈队列调度算法,在就绪队列中选择一个优先级最高的进程,使其运行若干单位时间。

要求在运行期间进程的p_cpu、p_pri和p_time要变化,并在适当的时机重新调度。

(3)进程睡眠:进程运行时可调用自编的睡眠函数,主动进入睡眠状态,并转调度程序。

也可由操作使进程强迫挂起,睡眠适当时间。

进程睡眠时要在PCB中记录睡眠原因和优先数。

(4)进程的唤醒:根据睡眠原因,将相应的进程从睡眠队列中调出,转入就绪队列。

如果该进程优先级比现在运行的优先级高,则转调度程序。

(5)进程的终止:如果一个进程运行完作业所需的时间,该进程就终止,释放所占用的内存和PCB资源,转调度程序。

二、设计思想实现多级犯规队列调度算法,多级调度队列分别高优先级(H或h)队列、中优先级(M或m)队列和低优先级的(L或l)队列。

(1)当一个进程在一次运行中用完了时间片(100单位时间)还未完成任务或没有进入阻塞状态,降低其优先级,进入低一级的调度队列。

(2)进程没用完的时间片,就因为I/O等原因转变为阻塞状态。

等到阻塞原因解除,转变为就绪状态后,仍回到原先队列。

(3)当一个进程正在运行时,在更高的优先级的队列中到来了一个进程,那么高优先级的进程可以抢占当前进程的处理机。

被抢占的进程已运行了一定的时间(但没到达100单位时间),仍留在原先的队列中。

(4)进程在时间片内完成了任务,被撤离系统。

三、函数和算法(1)建议使用的PCB数据结构struct mypcb {char p_pid; //进程标志数char p_pstat; //进程状态void *p_addr; //进程映像在内存中的首址int p_size; //进程映像的长度char p_pri; //进程优先数int p_cpu; //进程当前运行的时间int p_time; //作业运行的(剩余)总时间char p_wchan; //进程睡眠原因struct mypcb *p_next,*p_prior; //进程mypcb的双向链指针};(2)主程序:初始化变量和队列从输入文件中读入进程信息,创建进程打印初始的3个调度队列进程调度主循环首先调度高优先级队列进程IF 有进行苏醒设定当前进程运行一段时间,进程剩余时间减去该时间打印当前进程的信息和将要唤醒的进程在睡眠队列唤醒进程,回到调度主循环IF当前进程满足睡眠条件打印当前进程的信息进程移出调度队列加入睡眠队列,回到调度主循环IF 当前进程不满足睡眠条件IF 进程总剩余时间>100运行并用掉时间片中的剩余时间从高优先级队列中移出,加入中优先级队列ELSE用掉全部剩余时间,从队列中删去其次调度次高优先级队列进程(略)最后调度低优先级队列进程(略)如果3个调度队列和睡眠队列皆空,调度循环终止(3)函数i. int init()初始化变量、初始化调度队列和睡眠队列ii. int printlist(struct list *List)打印调度队列中的进程和剩余运行时间iii. int gotosleep(struct mypcb *process)根据进程的剩余运行时间p_time,使其运行一段时间,并设置睡眠状态iv. struct proc *wakeup(struct list *List)判断是否有进程苏醒,本程序设计调用5次,唤醒队列首进程v. int wakeup_work(struct mypcb *p,struct list *List)苏醒进程插进原先优先级队列vi. int newp(char pri,int size,int time)根据优先数、进程大小和运行时间的参数创建一个新进程,为新进程分配内存空间,睡眠原因为空,如进入睡眠,状态为‘s’;vii. int addlist(struct list *List,struct mypcb *process)将进程添加到队列的尾部,包括睡眠队列;四、测试与分析程序输入格式为:./sched <输入文件名>输入文件内容为:优先级内存大小分配时间H 1000 301H 1000 200M 1000 203M 1000 200H 1000 100M 1000 102L 1000 200五、总结和思考1、总结自己实验过程中的心得体会;2、思考以下问题:(1)如何用简单的方法模拟I/O中断或其他事件,使进程睡眠若干时间。

进程调度算法模拟程序设计

进程调度算法模拟程序设计

进程调度算法模拟程序设计引言进程调度算法是操作系统中的重要组成部分,它决定了进程在系统中的执行顺序和分配时间片的策略。

为了更好地理解和研究不同的进程调度算法,我们可以设计一个模拟程序来模拟进程的调度过程。

本文将介绍进程调度算法的基本概念和常见的调度算法,并详细讨论如何设计一个进程调度算法模拟程序。

什么是进程调度算法进程调度算法是操作系统中的一种策略,用于决定在多个进程同时请求执行时,系统按照什么样的顺序来选择并分配CPU资源。

进程调度算法的目标是尽可能地提高系统的吞吐量、响应时间和公平性。

常见的进程调度算法先来先服务(FCFS)先来先服务是最简单的进程调度算法,它按照进程到达的先后顺序进行调度。

当一个进程到达系统后,它会被放入就绪队列中,然后按照先后顺序执行。

这种算法的优点是简单易懂,但是存在”饥饿”问题,即长作业会占用CPU资源,导致其他短作业等待时间过长。

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

当一个进程到达系统后,系统会根据其执行时间将其放入适当的位置,执行时间短的进程优先执行。

这种算法可以最大限度地减少平均等待时间,但是对于长作业来说可能会饥饿。

时间片轮转(RR)时间片轮转算法是一种分时调度算法,它将CPU的执行时间划分为多个时间片,每个进程在一个时间片内执行一定的时间,然后切换到下一个进程。

这种算法可以保证所有进程都有机会执行,并且对于响应时间要求较高的任务比较合适。

多级反馈队列(MFQ)多级反馈队列算法是一种综合了FCFS和RR的调度算法。

系统将进程根据优先级划分为多个队列,每个队列都有不同的时间片大小。

当一个进程到达系统后,它被放入第一个队列中,如果在时间片内没有执行完,则被移到下一个队列中。

这种算法可以根据进程的优先级和执行时间动态调整调度策略,提高系统的响应性能。

进程调度算法模拟程序设计程序结构为了设计一个进程调度算法模拟程序,我们需要考虑以下几个方面的内容:1.进程的数据结构:我们可以使用一个进程控制块(PCB)来表示一个进程,PCB包含了进程的状态、优先级、执行时间等信息。

多级队列调度算法和多级反馈队列调度算法

多级队列调度算法和多级反馈队列调度算法

多级队列调度算法和多级反馈队列调度算法在计算机操作系统中,进程调度是指根据一定的策略从就绪队列中选择一个进程分配CPU时间片,使得多个进程能够合理高效地共享CPU资源。

多级队列调度算法和多级反馈队列调度算法是两种常见的进程调度算法。

本文将分别介绍这两种调度算法的原理和特点。

一、多级队列调度算法多级队列调度算法是一种基于优先级的调度算法,将就绪进程划分为多个队列,每个队列具有不同的优先级,其中优先级高的队列具有更高的调度优先级。

调度器按照优先级从高到低的顺序选择进程执行,同一优先级的进程按照先到先服务的原则进行调度。

多级队列调度算法的主要特点如下:1. 简单高效:多级队列调度算法简单直观,易于实现和理解。

由于进程被划分到不同的队列中,能够更好地满足不同进程的调度需求。

2. 公平性:多级队列调度算法可以根据进程的优先级来确定调度顺序,优先级高的进程能够更早地被执行,提高了进程的响应速度。

3. 适应性:多级队列调度算法可以根据不同进程的调度需求来设置不同的优先级,能够更好地满足不同进程的执行要求。

然而,多级队列调度算法也存在一些问题。

例如,如果某个队列中的进程过多,可能会导致低优先级队列的进程长时间得不到执行,影响系统的整体性能。

为了解决这个问题,引入了多级反馈队列调度算法。

二、多级反馈队列调度算法多级反馈队列调度算法是在多级队列调度算法的基础上进行改进的一种调度算法。

它引入了时间片的概念,并允许进程在不同的队列之间移动。

每个队列具有不同的时间片大小和优先级,当一个进程的时间片用完后,它会被移到下一个优先级更低的队列中。

多级反馈队列调度算法的主要特点如下:1. 公平性:多级反馈队列调度算法兼顾了优先级和时间片的概念,能够更加公平地分配CPU时间片,避免某个队列中的进程长时间得不到执行。

2. 弹性:多级反馈队列调度算法能够根据进程的执行情况灵活地调整进程的优先级和时间片大小,提高系统的响应速度和吞吐量。

c语言实现多级反馈队列调度的算法模拟进程的控制

c语言实现多级反馈队列调度的算法模拟进程的控制

c语言实现多级反馈队列调度的算法模拟进程的控制目录1. 引言1.1 背景和意义1.2 结构概述1.3 目的2. 多级反馈队列调度算法2.1 基本原理2.2 算法设计思路2.3 算法流程图3. C语言实现模拟进程控制3.1 数据结构定义3.2 进程创建与销毁3.3 进程调度与执行4. 实验结果与分析4.1 实验环境介绍4.2 实验结果展示4.3 结果分析与讨论5. 结论与展望5.1 结论总结5.2 存在问题与改进方向1. 引言1.1 背景和意义在计算机科学领域,进程调度是操作系统中非常重要的一个功能。

它负责决定哪个进程可以使用CPU并以何种顺序执行。

进程调度算法的优劣直接影响了系统的性能和效率。

多级反馈队列调度算法是一种常用的进程调度算法之一,它可以根据进程的类型和优先级将进程划分到不同的队列中,并根据优先级来决定进程的执行顺序。

该算法兼具公平性和高响应时间两个特点,适合应用于多任务环境下。

本文旨在使用C语言实现模拟多级反馈队列调度算法,并通过模拟进程控制过程,探讨其在实际应用中的表现。

通过实验结果与分析,我们将评估该算法在不同场景下的性能指标,并对其中存在问题提出改进方向。

1.2 结构概述本文共分为五个部分组成:•引言:介绍本文撰写目的、研究背景以及多级反馈队列调度算法在进程控制中的重要性。

•多级反馈队列调度算法:详细介绍多级反馈队列调度算法的基本原理、设计思路和算法流程图。

•C语言实现模拟进程控制:描述C语言中如何定义数据结构以及实现进程的创建、销毁以及调度和执行过程。

•实验结果与分析:介绍实验环境并展示实验结果,对结果进行分析和讨论。

•结论与展望:总结本文的研究成果,并提出该算法在应用过程中存在的问题以及改进方向。

通过以上结构安排,我们将全面深入地探讨多级反馈队列调度算法在模拟进程控制中的应用。

1.3 目的本文旨在通过使用C语言实现多级反馈队列调度算法,模拟进程控制过程。

通过对该算法进行分析和实验,目标如下:1.探讨多级反馈队列调度算法在不同场景下的优劣势,并对其性能指标进行评估。

★多级反馈队列调度算法_实例

★多级反馈队列调度算法_实例
63
Feedback (q=1)
Time=7~9 RQ0=
RQ1=
RQ2=
A
B
C
Running=B and finished
64
Feedback (q=2i)
Time=0 RQ0= A
RQ1=
RQ2=
A
B
C
当一个进程第一次进入系统时,它被放置在RQ0,当它第一次被 抢占后并返回就绪状态时,它被放置在RQ1。在随后的时间里, 每当它被抢占时,它被降级到下一个低优先级队列中。一个短进 程很快会执行完,不会在就绪队列中降很多级。
A
B
C
q=21
Running=C and finished
74
Feedback (q=2i)
Time=7~9
RQ0=
RQ1=
RQ2=
A
B
C
q=21
Running=B and finished
75
Feedback
低级就绪队列
超过时间片
选中,时间片500ms
等待其 启动其他外设 他外设
运行
启动磁盘磁带
Time=3 RQ0= RQ1= A RQ2=
A
Feedback (q=2i)
B
C
69
Feedback (q=2i)
Time=3~4 RQ0=
RQ1= B
RQ2=
A
B
C
Running=A and finished
70
Time=4 RQ0= C RQ1= B RQ2=
A Running=A
Feedback (q=2i)
Time=4~5 RQ0=
RQ1= B

多级反馈队列调度算法

多级反馈队列调度算法

如果一个队列中的所有进程都已 完成,则该队列将被移至最低优 先级的队列。
多级反馈队列调度算法是一种先 进的调度算法,它结合了优先级 调度和轮转调度的优点。
在每个时间片内,调度算法会根 据队列的优先级选择一个队列进 行服务。
这种算法能够有效地处理短进程 和长进程,并确保公平性和优先 级。
多级反馈队列调度算法的优缺点
02 03
介绍
多级反馈队列调度算法是计算机操作系统中的一种重要调 度算法,具有灵活性和公平性的特点。该论文主要介绍了 多级反馈队列调度算法的基本原理、实现方法、性能评估 以及在计算机操作系统中的应用。
材料与方法
该论文采用理论分析和实证研究相结合的方法,首先介绍 了多级反馈队列调度算法的基本原理和实现方法,然后通 过模拟实验和性能评估,分析了多级反馈队列调度算法的 性能表现。
多级反馈队列调度算法的优缺点
缺点
实现复杂度:多级反馈队列调度算法的实现复 杂度较高,需要维护多个队列和相应的数据结 构。
优先级反转:在某些情况下,低优先级的进程 可能会占用CPU时间过长,导致高优先级的进 程等待过长时间,这被称为优先级反转问题。
03
多级反馈队列调度算法的设计与实现
算法设计思路和流程
讨论未来工作
尽管多级反馈队列调度算法在性能评估和分析中表现出 了较好的性能,但仍有许多问题需要进一步研究和改进 。例如,我们可以考虑如何优化任务分配策略,使得系 统能够更好地处理大规模和复杂的任务;我们还可以探 讨如何设计更加智能的任务调度策略,以更好地满足实 时性和可靠性等需求。此外,我们也可以将多级反馈队 列调度算法与其他优化算法相结合,以实现更好的系统 性能。
进行排序
03
定期检查队列中的进程是否需要升级或降级,根据其

多级反馈队列调度算法例题

多级反馈队列调度算法例题

多级反馈队列调度算法例题
多级反馈队列调度算法是一种:
A. 非抢占式调度算法
B. 抢占式调度算法
C. 实时调度算法
D. 批处理调度算法
在多级反馈队列调度算法中,新进程通常被放入:
A. 最高优先级队列
B. 最低优先级队列
C. 中间优先级队列
D. 随机选择一个队列
当一个进程在其当前队列中服务完成后,它可能会被移到:
A. 更高优先级的队列
B. 更低优先级的队列
C. 保持在当前队列
D. 移除出系统
多级反馈队列调度算法的主要目的是:
A. 减少进程等待时间
B. 提高系统吞吐量
C. 实现进程公平性
D. 优化CPU利用率
在多级反馈队列调度中,进程老化是指:
A. 进程优先级随时间降低
B. 进程优先级随时间提高
C. 进程执行时间增加
D. 进程等待时间减少
哪种类型的进程在多级反馈队列调度中可能获得更好的服务?
A. I/O密集型进程
B. CPU密集型进程
C. 实时进程
D. 所有类型进程机会均等
多级反馈队列调度算法通常不包括以下哪个特性?
A. 多个就绪队列
B. 进程可以在队列间移动
C. 固定的进程优先级
D. 抢占式调度
在多级反馈队列调度中,如果一个进程在当前队列中等待时间过长,它可能会被:
A. 终止执行
B. 移到更高优先级队列
C. 保持在当前队列不动
D. 移到更低优先级队列。

非抢占式多级反馈队列调度算法例题

非抢占式多级反馈队列调度算法例题

非抢占式多级反馈队列调度算法例题下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!1. 引言非抢占式多级反馈队列调度算法是一种常见的调度算法,用于多任务操作系统中对进程进行调度。

优先级法、多级反馈轮转法进程调度模拟设计

优先级法、多级反馈轮转法进程调度模拟设计

学号:课程设计题目进程调度模拟设计——优先级法、多级反应轮转法学院计算机学院专业班级姓名指导教师吴利军2021 年 1 月15 日课程设计任务书学生姓名:指导教师:吴利军工作单位:计算机科学与技术学院题目: 进程调度模拟设计——优先级法、多级反应轮转法初始条件:1.预备内容:阅读操作系统的处理机办理章节内容,对进程调度的功能以及进程调度算法有深入的理解。

2.实践准备:掌握一种计算机高级语言的使用。

要求完成的主要任务:〔包孕课程设计工作量及其技术要求,以及仿单撰写等具体要求〕1.模拟进程调度,能够处理以下的情形:⑴能够选择分歧的调度算法〔要求中给出的调度算法〕;⑵能够输入进程的根本信息,如进程名、优先级、到达时间和运行时间等;⑶按照选择的调度算法显示进程调度队列;⑷按照选择的调度算法计算平均周转时间和平均带权周转时间。

2.设计敷陈内容应说明:⑴需求分析;⑵功能设计〔数据构造及模块说明〕;⑶开发平台及源轨范的主要局部;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i〕你认为你完成的设计哪些地方做得比力好或比力出色;ii〕什么地方做得不太好,以后如何改正;iii〕从本设计获得的收获〔在写,调试,执行过程中的经历和教训〕;iv〕完成此题是否有其他方式〔如果有,简要说明该方式〕;时间放置:设计放置一周:周1、周2:完成轨范分析及设计。

周2、周3:完成轨范调试及测试。

周4、周5:验收、撰写课程设计敷陈。

〔考前须知:严禁抄袭,一旦发现,一律按0分记〕指导教师签名:年月日系主任〔或责任教师〕签名:年月日进程调度模拟设计——优先级法、多级轮转反应法1设计目的与功能1.1设计目的了解进程调度中的相关知识,能够使用其中的方式来进展进程调度模拟设计。

本次课程设计的重点是多级轮转反应法和优先级法的使用,要求熟练掌握并运用他们,并能够运用一种高级语言来完成这个轨范。

1.2设计功能模拟进程调度,能够处理以下的情形:⑴能够选择分歧的调度算法〔要求中给出的调度算法〕;⑵能够输入进程的根本信息,如进程名、优先级、到达时间和运行时间等;⑶按照选择的调度算法显示进程调度队列;⑷按照选择的调度算法计算平均周转时间和平均带权周转时间。

基于反馈(FeedBack,FB)排队算法的CPU调度的模拟实现

基于反馈(FeedBack,FB)排队算法的CPU调度的模拟实现

JLU《操作系统》课程设计[基于反馈(Feed Back,FB)排队算法的CPU调度的模拟实现]程序代码:// 223.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <STRING.H> //Definitions for memory and string functions.#include <CTYPE.H> //Defines the ctype macros.#include <MALLOC.H> //memory management functions and variables.#include <STDIO.H>#include <STDLIB.H>#include <IO.H> //Definitions for low level I/O functions.#include <PROCESS.H> //Symbols and structures for process management.#include <CONIO.H> //Direct MSDOS console input/output.#include <WINDOWS.H>#include <TIME.H> // Struct and function declarations for dealing with time. #include <DOS.H> //Defines structs, unions, macros, and functions for dealing //with MSDOS and the Intel iAPX86 microprocessor family.// 函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2//////////////////////////////////////////typedef int Status; //指定用Status和Boolean代表int类型typedef int Boolean;//////////////////////////////////////////typedef struct QNode{char name[5];int time;int timeType;struct QNode *next;}QNode,*QueuePtr;typedef struct{QueuePtr front;//队头指针QueuePtr rear; // 队尾指针}LinkQueue;int count=0; //时间计数变量LinkQueue qRun,qWait,qReady1,qReady2,qReady3,qReady4;//////////////////////////////////////////////////////////////////////////void menu1();void menu2();void gotoxy(int x,int y);void clrscr(void); //清屏函数void clreol(void); //在文本窗口中清除字符到行末void clreoscr(void); //clear end of screenStatus InitQueue(LinkQueue &Q);Status creatPro(LinkQueue &quePro);void dealTime();void runPro(void);void run();void wait();void wake();void endPro();////////////////////////////////////////////////////////////////////////////DOS界面坐标定位函数/////////////////////////////////////////////////////void gotoxy(int x,int y){CONSOLE_SCREEN_BUFFER_INFO csbiInfo; //variablendklaration HANDLE hConsoleOut;hConsoleOut = GetStdHandle(STD_OUTPUT_HANDLE);GetConsoleScreenBufferInfo(hConsoleOut,&csbiInfo);csbiInfo.dwCursorPosition.X = x; //cursorposition X koordinate festlegencsbiInfo.dwCursorPosition.Y = y; //cursorposition Y koordinate festlegenSetConsoleCursorPosition(hConsoleOut,csbiInfo.dwCursorPosition); //den cursor an die festgelegte koordinate setzen}Status InitQueue(LinkQueue &Q){ // 构造一个空队列Qif(!(Q.front=Q.rear=(QueuePtr)malloc(sizeof(QNode))))exit(OVERFLOW);Q.front->next=NULL;return OK;}Status EnQueue(LinkQueue &Q,char e[5],int proTime,int tType){ // 插入元素e为Q的新的队尾元素QueuePtr p;if(!(p=(QueuePtr)malloc(sizeof(QNode)))) // 存储分配失败exit(OVERFLOW);strcpy(p->name,e);p->time=proTime;p->timeType=tType;p->next=NULL;Q.rear->next=p;Q.rear=p;return OK;}Status DeQueue(LinkQueue &Q,char e[5]){ // 若队列不空,删除Q的队头元素,用e返回其值,并返回OK,否则返回ERROR QueuePtr p;if(Q.front==Q.rear)return ERROR;p=Q.front->next;strcpy(e,p->name);Q.front->next=p->next;if(Q.rear==p)Q.rear=Q.front;free(p);return OK;}Status QueueTraverse(LinkQueue &Q,int x,int y){QueuePtr p;p=Q.front->next;while(p){gotoxy(x,y);printf("%s",p->name);gotoxy(x,y+1);printf("%d",p->time);p=p->next;x+=6;}printf("\n");return OK;}void print(){if(qRun.front!=qRun.rear){QueueTraverse(qRun,17,5);}if(qWait.front!=qWait.rear){QueueTraverse(qWait,17,8);}if(qReady1.front!=qReady1.rear){QueueTraverse(qReady1,17,11);}if(qReady2.front!=qReady2.rear){QueueTraverse(qReady2,17,14);}if(qReady3.front!=qReady3.rear){QueueTraverse(qReady3,17,17);}if(qReady4.front!=qReady4.rear){QueueTraverse(qReady4,17,20);}}Status creatPro(LinkQueue &quePro){char proName[5];int proTime;QueuePtr p;b: gotoxy(22,3);printf("进程名: ");gotoxy(36,3);printf("所需时间: ");gotoxy(30,3);scanf("%s",&proName);gotoxy(46,3);scanf("%d",&proTime);if(proTime<=0){gotoxy(22,3);printf("信息提示: 输入时间错误!请按Enter键返回!");gotoxy(15,3); getchar();getchar();gotoxy(0,0);menu1();goto b;}getchar();if(!(p=(QueuePtr)malloc(sizeof(QNode)))) // 存储分配失败exit(OVERFLOW);strcpy(p->name,proName);p->time=proTime;p->timeType=10; //进入时间片为10的就绪队列,即优先级最高的就绪队列p->next=NULL;quePro.rear->next=p;quePro.rear=p;return OK;}void dealTime(){char e[5];int tType=qRun.front->next->timeType;++count;qRun.front->next->time--;if(qRun.front->next->time==0){DeQueue(qRun,e);runPro();count=0;}elseif(qRun.front->next->timeType==count){if(qRun.front->next->timeType==10)EnQueue(qReady2,qRun.front->next->name,qRun.front->next->time,tType+10); if(qRun.front->next->timeType==20)EnQueue(qReady3,qRun.front->next->name,qRun.front->next->time,tType+20);if(qRun.front->next->timeType==40)EnQueue(qReady4,qRun.front->next->name,qRun.front->next->time,80);if(qRun.front->next->timeType==80)EnQueue(qReady4,qRun.front->next->name,qRun.front->next->time,80);DeQueue(qRun,e);runPro();count=0;}}void runPro(void){char e[5];int pTime,f1=0,f2=0,f3=0,f4=0;if(qReady1.front!=qReady1.rear){pTime=qReady1.front->next->time;EnQueue(qRun,qReady1.front->next->name,pTime,qReady1.front->next->timeType);DeQueue(qReady1,e);f1=1; }else{if(qReady2.front!=qReady2.rear){pTime=qReady2.front->next->time;EnQueue(qRun,qReady2.front->next->name,pTime,qReady2.front->next->timeType); DeQueue(qReady2,e);f2=1;}else{if(qReady3.front!=qReady3.rear){pTime=qReady3.front->next->time;EnQueue(qRun,qReady3.front->next->name,pTime,qReady3.front->next->timeType);DeQueue(qReady3,e);f3=1;}else{if(qReady4.front!=qReady4.rear){pTime=qReady4.front->next->time;EnQueue(qRun,qReady4.front->next->name,pTime,qReady4.front->next->timeType);DeQueue(qReady4,e);f4=1;}}}}gotoxy(0,4);menu2();if(f1==0 && f2==0 && f3==0 && f4==0){gotoxy(0,0);menu1();gotoxy(22,3);printf("信息提示:无就绪进程,请输入其他功能选项!");}gotoxy(0,4);menu2();}void run(){if(qRun.front==qRun.rear)runPro();elsedealTime();}void endPro(){char e[5];if(qRun.front==qRun.rear){gotoxy(0,0);menu1();gotoxy(22,3);printf("信息提示:无运行进程,请按Enter键运行进程!");gotoxy(15,3);}else{DeQueue(qRun,e);gotoxy(0,0);menu1();gotoxy(22,3);printf("信息提示:选择菜单功能或按Enter键执行进程!");gotoxy(0,4);menu2();print();} }void wait(){char e[5];if(qRun.front!=qRun.rear){EnQueue(qWait,qRun.front->next->name,qRun.front->next->time,qRun.front->next->timeType); DeQueue(qRun,e);gotoxy(0,4);menu2();print();gotoxy(22,3);printf("信息提示: 选择菜单功能或按Enter键执行进程!");} else{gotoxy(0,0);menu1();gotoxy(22,3);printf("信息提示:无运行进程,请输入其他功能选项!");}}void wake(){char e[5];if(qWait.front!=qWait.rear){EnQueue(qReady1,qWait.front->next->name,qWait.front->next->time,qWait.front->next->timeType );DeQueue(qWait,e);gotoxy(0,4);menu2();print();gotoxy(22,3);printf("信息提示: 选择菜单功能或按Enter键执行进程!");}else{gotoxy(0,0);menu1();gotoxy(22,3);printf("信息提示:无等待进程,请输入其他功能选项!");}}void menu1(){printf(" ┏━━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━┓\n");printf(" ┃ 1-> 创建进程┃2-> 撤销进程┃3-> 阻塞进程┃4-> 唤醒进程┃0->退出系统┃\n");printf(" ┣━━━━━━━╋━━━━━━┻━━━━━━┻━━━━━━┻━━━━━━┫\n");printf(" ┃菜单选择: ┃┃\n");}void menu2(){printf(" ┣━━━━━┳━┻┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┳━━┫\n");printf(" ┃Run: ┃┃┃┃┃┃┃┃┃┃┃\n");printf(" ┃Time ┃┃┃┃┃┃┃┃┃┃┃\n");printf(" ┣━━━━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫\n");printf(" ┃Wait: ┃┃┃┃┃┃┃┃┃┃┃\n");printf(" ┃Time ┃┃┃┃┃┃┃┃┃┃┃\n");printf(" ┣━━━━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫\n");printf(" ┃Ready1 ┃┃┃┃┃┃┃┃┃┃┃\n");printf(" ┃Time:10 ┃┃┃┃┃┃┃┃┃┃┃\n");printf(" ┣━━━━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫\n");printf(" ┃Ready2 ┃┃┃┃┃┃┃┃┃┃┃\n");printf(" ┃Time:20 ┃┃┃┃┃┃┃┃┃┃┃\n");printf(" ┣━━━━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫\n");printf(" ┃Ready3 ┃┃┃┃┃┃┃┃┃┃┃\n");printf(" ┃Time:40 ┃┃┃┃┃┃┃┃┃┃┃\n");printf(" ┣━━━━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━╋━━┫\n");printf(" ┃Ready4 ┃┃┃┃┃┃┃┃┃┃┃\n");printf(" ┃Time:80 ┃┃┃┃┃┃┃┃┃┃┃\n");printf(" ┗━━━━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┻━━┛\n");}void main(){char a=NULL;system("color 0B");InitQueue(qRun);InitQueue(qWait);InitQueue(qReady1);InitQueue(qReady2);InitQueue(qReady3);InitQueue(qReady4);menu1();menu2();gotoxy(15,3);scanf("%c",&a);while(1){gotoxy(0,0);menu1();switch(a){case '1':creatPro(qReady1);print();gotoxy(22,3);printf("信息提示: 选择菜单功能或按Enter键执行进程!");while(1){f: gotoxy(15,3);a=getchar();if(a=='\n'){gotoxy(22,3);printf("信息提示: 选择菜单功能或按Enter键执行进程!"); run();gotoxy(0,4);menu2();print();}elsebreak;}getchar();break;case '2':endPro();goto f;break;case '3':wait(); goto f; print(); break;case '4':wake(); goto f; print(); break;case '0': gotoxy(22,3); exit(0); break;default:gotoxy(22,3);printf("信息提示: 输入错误!请选择正确的菜单功能选项!"); goto f;}print();}}。

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

creat=1;
proc_num=0;
flag=0;
j=0;
for(i=0;i<p->pro_num;i++) //队列内循环
{
if(p->time>=p->queue[i].pro_time)
{Time+=p->queue[i].pro_time;printf("\n进程 %s 在 %d 时刻执行完\n",p->queue[i].name,Time);}
printf("\n模拟过程中是否有新进程到达【1:有 2:无】\n");
printf("\n请选择:");
scanf("%d",&choose);
if(choose == 1)
return true;
return false;
p->queue[i].have_deal_time+=p->time;
printf("\n进程 %s 未执行完(已处理:%d 剩余:%d ),调到下一队列\n",p->queue[i].name,p->queue[i].have_deal_time,p->queue[i].pro_time);
int j;
int creat;
int duilie=0; //队列序数
do //队列之间循环
{
duilie++;
printf("\n队列 %d:",duilie);
printf("(时间片%d)\n",p->time);
input_proc();
have=ask();
if(have)
{
printf("\n请输入新进程 到达时间 进程名 进程执行时间/23 xunlei 8/:");
scanf("%d",&new_pro_arrive_time);
have=false;
}
if(have&&Time>=new_pro_arrive_time&&p->k >= 1)
have=deal_with_new_pro();
}
p->pro_num=0; //每一队列执行完后进程数为零
if(flag==1)
else
{
flag=1; //表示有未完成的进程进入下一队列
proc_num++; //统计下一队列的进程数
Time+=p->time; //cpu执行时间
p->queue[i].pro_time-=p->time;
Time+=p->queue[0].pro_time;printf("\n新进程 %s 在 %d 时刻执行完\n",p->queue[0].name,Time);
printf("\n***********************************************************************\n");
q->time=(int)pow(2,q->k); //本节点的时间片长度
p->next=q;
}
q->queue[j++]=p->queue[i]; //将未执行完的进程调到下一队列
}
if(have&&Time>=new_pro_arrive_time&&p->k == 1)
bool Go_on(); //模拟结束询问是否继续模拟
int new_pro_arrive_time; //新进程到达时间
bool deal_with_new_pro();
Queue *Queue_head; //指向就绪队列队链表的头指针
int count=0; //统计节点的个数
break;
}
else
{
Time+=p->time; //cpu执行时间
p->queue[0].pro_time-=p->time;
p->queue[0].have_deal_time+=p->time;
printf("\n新进程 %s 未执行完(已处理:%d 剩余:%d ),调到下一队列\n",p->queue[0].name,p->queue[0].have_deal_time,p->queue[0].pro_time);
if(creat==1) //如果是队列的第一个节点则创建
{
creat=0;
q=(Queue*)malloc(sizeof(Queue)); //创建下一队列
q->next=NULL;
q->k=++count; //本节点是第几个节点
#include<stdio.h>
#include<math.h>
#include<malloc.h>
#include<string.h>
struct PCB
{
char name[20]; //进程名
int pro_time; //执行时间
int have_deal_time; //进程已执行时间
{
printf("\n有新进程到达,放入本队列末尾\n");
p->pro_num++;
scanf("%s%d",&p->queue[p->pro_num-1].name,&p->queue[p->pro_num-1].pro_time);
p->queue[p->pro_num-1].have_deal_time=0;
{
p=q;
p->pro_num=proc_num; //下一进程的数目
}
}
while(flag == 1 );
}
bool deal_with_new_pro()
{
bool no;
Queue *p;
p=Queue_head;
printf("\n有新进程到达,放入第一队列,处理机开始处理新到达的进程,\n");
Queue *next;
};
void instruction(); //模拟原理
void deal(bool); //模拟处理机处理相应队列
bool ask(); //询问模拟方式(处理过程中是否有新进程到达)
void input_proc(); //读入就绪进程数和新到达的进程
printf("\n*************************************************************\n");
scanf("%s%d",&p->queue[0].name,&p->queue[0].pro_time);
p->queue[0].have_deal_time=0;
int Time=0; //处理机运行时间
void main()
{
Queue_head=NULL;
bool go_on=true;
bool no;
bool have;
while(go_on)
{
instruction();
};
struct Queue //队列链表
{
PCB queue[20]; //队列长度
int time; //各个队列的时间片
int k; //记住自己是第几个节点
int pro_num; //队列中进程数
printf("\n请输入就绪进程数:");
scanf("%d",&proc_num);
p->pro_num=proc_num; //就绪进程数
printf("\n请输入进程名和执行时间/xunlei 8/:\n");
while((proc_num--)) //读入进程至第一队列
{
i++;
scanf("%s%d",&p->queue[i].name,&p->queue[i].pro_time);
p->queue[i].have_deal_time=0;
}
Queue_head=p;
}
bool ask()
{
int choose;
p->next->queue[p->next->pro_num] = p->queue[0];
if(p->next->pro_num!=0)
{
p->next->pro_num++;
printf("\n************************************************************\n");
for(int i=1; p->pro_num==0 ; p=p->next,i++)
相关文档
最新文档