动态优先权进程调度算法模拟实验报告
动态高优先权
动态高优先权实验报告一、实验目的通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解.提高自己的动手能力主要是通过自己去思考并自己的编码更进一步及更贴切的去理解弄明白动态优先权算法的模拟加深对进程概念和进程调度过程的工作流程及其原理!二、实验要求用C语言来实现对N个进程采用动态优先权优先算法的进程调度。
三、实验内容每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:1.进程标识数ID2.进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
3.进程已占用的CPU时间CPUTIME。
4.进程还需占用的CPU时间ALLTIME。
当进程运行完毕时,ALLTIME变为0。
5.进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。
6.进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
7.进程状态STATE。
8.队列指针NEXT,用来将PCB排成队列。
四、实验结果五、实验小结其实每次实验,老师都建议大家自己开始写程序,网上的代码可以自己选择性的参考,但绝对不能纯粹性的抄袭,但由于自己的C++基础实在是不怎么好,如果自己编的话会摸不着头脑,不知从哪里开始,就还是从网上下载了一些代码,在同学们的帮助下,理解编着的思路,明白各个模块的调度,也明白了动态高优先权的具体内容。
虽然中间碰见了不少问题,但经过多次调试,还是有了比较满意的结果。
然而这些调试是需要花费时间的,课堂的时间不够,只能课下去完成。
正所谓皇天不负有心人,努力就会有收获,经过这次试验也算是有所提高吧。
动态优先权是指在创建进程时所赋予的优先权,可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能.例如,我们可以规定,在就绪队列中的进程,随其等待时间的增长,其优先权以速率a 提高.若所有的进程都具有相同的优先权初值,则显然是最先进入就绪队列的进程,将因其动态优先权变得最高而优先获得处理机,此即FCFS算法.优先权的变化规律可描述为:由于等待时间与服务时间之和,就是系统对该作业的响应时间,故该优先权又相当于响应比RP此次实验让我明白了许多,不仅是知识上的,还有认识上的,我明白任何时候都是自己动手丰衣足食,学问是自己的,是无止境的,为了以后我们只能努力的补充自己···附录#include "stdio.h"#include <stdlib.h>#include <conio.h>#define getpch(type) (type*)malloc(sizeof(type))#define NULL 0struct pcb { /* 定义进程控制块PCB */char name[10]; /*定义进程名称*/char state; /*进程状态*/int super; /*优先数*/int ntime; /*需要运行的时间*/int rtime; /*已占用的CPU时间*/struct pcb* link;}*ready=NULL,*p;typedef struct pcb PCB; /*pcb表*/void sort() /* 建立对进程进行优先级排列函数*/{ PCB *first, *second;int insert=0;if((ready==NULL)||((p->super)>(ready->super))) /*优先级最大者, 插入队首*/{ p->link=ready;ready=p;}else /* 进程比较优先级,插入适当的位置中*/{ first=ready;second=first->link;while(second!=NULL){ if((p->super)>(second->super)) /*若插入进程比当前进程优先数大,*/{ /*插入到当前进程前面*/p->link=second;first->link=p;second=NULL;insert=1;}else /* 插入进程优先数最低,则插入到队尾*/{ first=first->link;second=second->link;}}if(insert==0) first->link=p;}}void input() /* 建立进程控制块函数*/ { int i,num;system("cls"); /*清屏*/printf("\n 请输入进程号?");scanf("%d",&num);for(i=0;i<num;i++){ printf("\n 进程号No.%d:\n",i);p=getpch(PCB);printf("\n 输入进程名:");scanf("%s",p->name);printf("\n 输入进程优先数:");scanf("%d",&p->super);printf("\n 输入进程运行时间:");scanf("%d",&p->ntime);printf("\n");p->rtime=0;p->state='w';p->link=NULL;sort(); /* 调用sort函数*/}}int space(){ int l=0; PCB* pr=ready;while(pr!=NULL){ l++;pr=pr->link;}return(l);}void disp(PCB * pr) /*建立进程显示函数,用于显示当前进程*/{ printf("\n qname \t state \t super \t ndtime \t runtime \n");printf("|%s\t",pr->name);printf("|%c\t",pr->state);printf("|%d\t",pr->super);printf("|%d\t",pr->ntime);printf("|%d\t",pr->rtime);printf("\n");}void check() /* 建立进程查看函数,检查等待队列的进程是否进入就绪队列*/{ PCB* pr;printf("\n **** 当前正在运行的进程是:%s",p->name); /*显示当前运行进程*/disp(p);pr=ready;printf("\n ****当前就绪队列状态为:\n"); /*显示就绪队列状态*/while(pr!=NULL){ disp(pr);pr=pr->link;}}void destroy() /*建立进程撤消函数(进程运行结束,撤消进程)*/{ printf("\n 进程[%s] 已完成.\n",p->name);free(p);}void running() /* 建立进程就绪函数(进程运行时间到,置就绪状态*/ { (p->rtime)++;if(p->rtime==p->ntime)destroy(); /* 调用destroy函数*/else{ (p->super)--;p->state='w';sort(); /*调用sort函数*/}}void main() /*主函数*/{ int len, h=0;char ch;input();len=space();while((len!=0)&&(ready!=NULL)){ ch=getchar();h++;printf("\n The execute number:%d \n",h); p=ready;ready=p->link;p->link=NULL;p->state='R';check();running();printf("\n 按任一键继续......");ch=getchar();}printf("\n\n 进程已经完成.\n");ch=getchar();}。
进程调度实验【实验报告】
实验一进程调度实验专业:信息管理与信息系统学号:2014******姓名:陈*实验日期:2016年11月11日一、实验目的通过本实验,采用动态优先权优先的调度算法编写和调试一个简单的进程调度程序,加深理解了有关进程控制块、进程队列的概念,并体会了优先权调度算法的具体实施办法。
二、实验要求用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解.三、实验方法内容1.算法设计思路(流程图)开始输入所有进程到一个链表中是否所有进程都已完成结束Yi = 1,m = 0在就绪队列中找到优先级最高的进程,用P1表示,state 设为R用P2指向链表第一个节点P2所指进程state = F ?NP2所指进程state = R ?NPriority – 2,CPUTime + 1,AllTime –1,YAllTime = 0?YNState 设为F ,m = 1CPUTime % StartBlock = 0 ?state 设为B ,m = 1YNP2所指进程state = B ?BolckTime - 1BlockTime = 0?State 设为 W YYN P2所指进程state = W ?NPriority + 1YNP2指向下一个节点P2已指向链表末尾?NYM = 1 ?i <= 2 ?i + 1YNNYNY2.算法中用到的数据结构(1)首先定义一个结构体,用以保存一个进程的各种信息,最后一个指针便于将所有进程形成一个链表typedef struct pcb{int id;int arriveTime; //到达时间int priority;int cpuTime;int allTime;int startBlock;int blockTime;char state;struct pcb *next;}PCB;(2)接着建立一个链表存储所有进程,以结构体PCB为节点(头节点为空节点,从第二个节点开始存储数据)。
使用动态优先权的进程调度算法的模拟实验
使用动态优先权的进程调度算法的模拟实验动态优先权调度算法是一种根据进程动态表现调整优先权的进程调度算法。
它不仅考虑了进程的优先级,还将进程的实际执行情况作为调度依据。
下面将介绍一个模拟实验,以更好地理解这种调度算法。
实验背景:假设有五个待执行的进程,它们的ID和初始优先权分别为P1(3)、P2(5)、P3(2)、P4(1)、P5(4)。
这五个进程的优先权在调度过程中会根据实际情况进行动态调整。
实验过程:1.初始化:在实验开始之前,首先需要对进程的初始状态进行初始化。
每个进程有两个属性:优先级和已运行时间。
优先级用于决定进程的调度优先级,已运行时间用于记录进程已经运行了多长时间。
设置一个全局时间片,表示每个时间单元中运行的时间。
2.进程调度:根据进程的优先权,选取最高优先权的进程进行调度。
从P1到P5,进程的优先权逐渐减小。
-选择进程:比如初始时最高优先权的进程为P2-进程执行:进程P2被调度后开始执行,运行一个时间片。
每运行一个时间片,该进程的已运行时间加一,重新计算进程的优先权。
-优先权调整:根据已运行时间的加一,重新计算进程的优先权。
优先权的计算公式可以根据实际需要进行调整,比如可以设为:新的优先权=原优先权+(已运行时间/其中一常量)。
-进程阻塞:如果进程运行的时间超过了一个时间片,则该进程被阻塞,进入就绪队列等待下一次轮转调度,其他进程继续执行。
3.调度进程更新:进程在执行和阻塞的过程中,它们的优先权会发生变化。
在每一轮调度后,需要更新进程的优先权,重新确定每个进程的调度顺序。
4.实验结果:重复进行步骤2和步骤3,直到所有进程都完成执行。
记录每次调度过程中的结果,包括进程的执行顺序、时刻和优先权的变化。
实验分析:通过模拟实验,可以得出以下一些结论:1.动态优先权调度算法能够根据实际情况调整进程的优先权,更好地适应不同进程的需求,增强了调度的灵活性。
2.在实验中,进程运行时间越长,优先权越低。
动态高优先权实验报告
实验一动态高优先权调度实验一、实验目的:通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解.提高自己的动手能力主要是通过自己去思考并自己的编码更进一步及更贴切的去理解弄明白动态优先权算法的模拟加深对进程概念和进程调度过程的工作流程及其原理!二.实验要求:1.在开是页面用户需要输入作业名,优先权级数,作业要求服务时间;2.每运行一个时间单位,作业的优先权级数减去自己的学号的后两位31mod5=1;3.在运行出的用户界面中需显示初始作业名,作业状态,优先权级数,需要服务的时间,已经运行的时间;4.每次调度前后显示作业队列。
三.实验内容利用C语言或JAVA或其它的语言(我用的用C语言)来实现对N 个进程采用动态优先权优先算法的进程调度。
每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:进程标识数ID进程优先数,并规定优先数越大的进程,其优先权越高进程已占用的CPU时间CUPTIME 进程还需占用的CPU时间ALLTIME。
当进程运行完毕时,ALLTIME变为0进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。
进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
进程状态STATE.队列指针NEXT,用来将 PCB排成队列。
优先数改变的原则:进程在就绪队列中呆一个时间片,优先数增加1。
进程每运行一个时间片,优先数减1。
二、实验感想:在第次试验时,老师建议大家应该开始自己写程序,可以借鉴参考网上的代码,但绝不能单单的COPY网上的程序了,吃饭容易种饭难哈,自己写动态高优先权调度要比从网上写个代码简单修改一下难得多呀。
我自己开始编时摸不着头脑,从哪里下手。
我还是从网上下了个代码,然后认真的独立几遍,主要理解弄明白她的编写思路,好让我有个清晰的思路!然后自己写程序,不过其中碰见的很多的问题。
动态优先权进程调度算法实验报告
《动态优先权进程调度算法》实验报告题目:动态优先权进程调度算法的模拟实现专业:班级:学号:姓名:日期:一﹑实验目的通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。
二﹑实验内容与基本要求编制模拟动态优先权算法的程序,并给出的例子验证所编写的程序的正确性。
(1)用C语言实现对N个进程采用动态优先权算法的调度。
(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:✧进程标识数ID。
✧进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
✧进程已占用CPU时间CPUTIME。
✧进程还需占用的CPU时间ALLTIME。
当进程运行完毕时,ALLTIME变为0。
✧进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。
✧进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
✧进程状态STATE。
✧队列指针NEXT,用来将PCB排成队列。
(3)优先数改变的原则:✧进程在就绪队列中呆一个时间片,优先数增加1。
✧进程每运行一个时间片,优先数减3。
(4)假设在调度前,系统中有5个进程,它们得初始状态如下:为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。
格式如下:RUNNING PROG:iREADY_QUEUE:->id1->id2BLOCK_QUEUE:->id3->id4==========================================================ID 0 1 2 3 4PRIORITY P0 P1 P2 P3 P4CPUTIME C0 C1 C3 C4 C5ALLTIME A0 A1 A2 A3 A4STARTBLOCK T0 T1 T2 T3 T4BLOCKTIME B0 B1 B2 B3 B4STATE S0 S1 S2 S3 S4三、实验报告内容1、动态优先权算法原理动态优先权是指,在创建进程时所赋予的优先权,是可以随进程的推进或随其等待时间的增加而改变的,以便获得更好的调度性能。
【精品】进程调度算法模拟实验报告
【精品】进程调度算法模拟实验报告一、实验目的本实验通过模拟进程的调度算法,使学生掌握多种进程调度算法的实现过程及其优缺点。
二、实验内容本实验实现了三种进程调度算法:先来先服务(First Come First Served,FCFS)、最短作业优先(Shortest Job First,SJF)、时间片轮转(Round Robin,RR)。
(一)FCFS算法FCFS算法是一种非抢占式的进程调度算法,按照进程到达的先后顺序进行执行,即先到达的进程先被执行,后到达的进程后被执行。
当一个进程在执行过程中发生等待时,其他新到达的进程会继续执行。
等待时间长的进程会长时间等待,造成了响应时间长的问题。
SJF算法是一种动态优先级的进程调度算法,按照进程预计运行时间的大小来决定其优先级,预计运行时间短的进程具有高优先级。
当一个新进程到达时,如果其预计运行时间比当前正在运行的所有进程都短,那么这个新进程就可以立即执行。
该算法在保证短作业优先的同时,可能会导致长作业饥饿的问题。
(三)RR算法RR算法是一种抢占式的进程调度算法,每个进程被分配一个时间片,当一个进程的时间片用完时,就被剥夺CPU,然后排到队列的末尾,等待下一次调度。
该算法能够保证每个进程的响应时间比较短,但可能会导致CPU利用率较低。
三、实验步骤(一)编写程序框架首先,根据实验要求,编写完整的程序框架,包括进程类Process和调度器类Scheduler。
Process类中包含了进程需要的属性和方法,如进程ID、进程到达时间、进程执行时间、进程状态等。
Scheduler类中包含了进程调度所需要的方法,如FCFS、SJF、RR 调度算法等。
(二)实现进程调度算法FCFS算法较为简单,只需要按照进程到达时间排序即可。
```pythondef FCFS(self):queue = Queue()process_time = 0while not self.is_finished():ready_process = self.get_arrived_process(process_time)if ready_process:queue.put(ready_process)if not queue.empty():current_process = queue.get()current_process.status = 'running'current_process.start_time = process_timecurrent_process.end_time = current_process.start_time + current_process.run_timeself.finished_processes.append(current_process)process_time += 1```2. SJF算法SJF算法需要进行进程预计运行时间的排序,然后按照排序后的顺序进行执行。
动态优先权进程调度算法模拟实验报告
动态优先权进程调度算法模拟实验报告动态优先权调度算法是一种动态调度算法,根据进程的优先级来决定下一个要执行的进程。
进程的优先级可以根据其紧迫性、重要性和资源需求等因素来确定。
本实验利用模拟算法来模拟动态优先权调度算法,并通过实例来说明该调度算法的工作原理和优缺点。
一、实验目的通过本实验,我们可以了解动态优先权调度算法的工作原理,掌握如何使用模拟算法来模拟进程的调度过程,进一步了解该调度算法的优缺点。
二、实验环境本实验使用C++编程语言来实现动态优先权调度算法的模拟。
编译器使用Dev-C++。
三、实验步骤1.设计进程控制块(PCB)的数据结构,包括进程优先级、进程标识、进程状态等信息。
2.设计模拟算法来模拟动态优先权调度算法。
具体算法如下:a.初始化就绪队列,将所有的进程按照优先级插入到就绪队列中。
b.选择优先级最高的进程执行,并更新该进程的优先级。
c.执行完毕后更新进程的状态,并将其从就绪队列中删除。
d.如果新的进程到达,将其插入到就绪队列中。
3.实现主函数,模拟进程的创建、调度和执行过程。
4.进行多个实例的测试,观察进程的调度顺序和执行结果。
5.总结实验结果,分析动态优先权调度算法的优缺点。
四、实验结果与分析通过多个实例的测试,我们可以观察到动态优先权调度算法的工作过程和效果。
该算法可以根据进程的优先级来确定下一个要执行的进程,从而可以更好地满足不同进程的需求。
同时,动态优先权调度算法可以确保优先级高的进程能够及时得到执行,提高系统的响应速度。
然而,动态优先权调度算法存在一些缺点。
首先,该算法对进程的优先级要求较高,需要合理设置进程的优先级。
如果优先级设置不合理,可能导致优先级高的进程一直占用CPU资源,而优先级低的进程无法得到执行,造成资源浪费。
其次,该算法没有考虑进程的等待时间和执行时间,容易导致饥饿现象的发生,即一些进程无法得到执行。
五、实验总结通过本实验,我们了解了动态优先权调度算法的工作原理和模拟方法。
进程的调度实验报告(3篇)
第1篇一、实验目的通过本次实验,加深对操作系统进程调度原理的理解,掌握先来先服务(FCFS)、时间片轮转(RR)和动态优先级(DP)三种常见调度算法的实现,并能够分析这些算法的优缺点,提高程序设计能力。
二、实验环境- 编程语言:C语言- 操作系统:Linux- 编译器:GCC三、实验内容本实验主要实现以下内容:1. 定义进程控制块(PCB)结构体,包含进程名、到达时间、服务时间、优先级、状态等信息。
2. 实现三种调度算法:FCFS、RR和DP。
3. 创建一个进程队列,用于存储所有进程。
4. 实现调度函数,根据所选算法选择下一个执行的进程。
5. 模拟进程执行过程,打印进程执行状态和就绪队列。
四、实验步骤1. 定义PCB结构体:```ctypedef struct PCB {char processName[10];int arrivalTime;int serviceTime;int priority;int usedTime;int state; // 0: 等待,1: 运行,2: 完成} PCB;```2. 创建进程队列:```cPCB processes[MAX_PROCESSES]; // 假设最多有MAX_PROCESSES个进程int processCount = 0; // 实际进程数量```3. 实现三种调度算法:(1)FCFS调度算法:```cvoid fcfsScheduling() {int i, j;for (i = 0; i < processCount; i++) {processes[i].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[i].processName); processes[i].usedTime++;if (processes[i].usedTime == processes[i].serviceTime) { processes[i].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[i].processName); }for (j = i + 1; j < processCount; j++) {processes[j].arrivalTime--;}}}```(2)RR调度算法:```cvoid rrScheduling() {int i, j, quantum = 1; // 时间片for (i = 0; i < processCount; i++) {processes[i].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[i].processName); processes[i].usedTime++;processes[i].serviceTime--;if (processes[i].serviceTime <= 0) {processes[i].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[i].processName); } else {processes[i].arrivalTime++;}for (j = i + 1; j < processCount; j++) {processes[j].arrivalTime--;}}}```(3)DP调度算法:```cvoid dpScheduling() {int i, j, minPriority = MAX_PRIORITY;int minIndex = -1;for (i = 0; i < processCount; i++) {if (processes[i].arrivalTime <= 0 && processes[i].priority < minPriority) {minPriority = processes[i].priority;minIndex = i;}}if (minIndex != -1) {processes[minIndex].state = 1; // 设置为运行状态printf("正在运行进程:%s\n", processes[minIndex].processName);processes[minIndex].usedTime++;processes[minIndex].priority--;processes[minIndex].serviceTime--;if (processes[minIndex].serviceTime <= 0) {processes[minIndex].state = 2; // 设置为完成状态printf("进程:%s 完成\n", processes[minIndex].processName); }}}```4. 模拟进程执行过程:```cvoid simulateProcess() {printf("请选择调度算法(1:FCFS,2:RR,3:DP):");int choice;scanf("%d", &choice);switch (choice) {case 1:fcfsScheduling();break;case 2:rrScheduling();break;case 3:dpScheduling();break;default:printf("无效的调度算法选择。
使用动态优先权的进程调度算法的模拟实验
使用动态优先权的进程调度算法的模拟实验进程调度算法是操作系统中对进程进行调度的一种策略,动态优先权调度算法是其中一种常用的调度算法。
下面将对动态优先权调度算法进行模拟实验,并对实验结果进行分析。
首先,我们定义进程的属性包括进程编号、到达时间、服务时间、优先权和完成时间等。
动态优先权调度算法的基本思想是根据进程的优先权决定下一个被调度的进程,优先权越高,被调度的机会越大。
实验过程如下:1.创建一个进程队列,用来存放待调度的进程。
2.输入进程的个数,并依次输入每个进程的到达时间、服务时间和优先权。
3.将所有进程按照到达时间进行排序。
4.从排好序的进程队列中选择优先权最高的进程,即优先权最大的进程。
5.通过执行该进程进行模拟,更新进程队列中的进程信息。
6.根据更新后的进程信息,重新选择下一个被调度的进程。
7.重复步骤5和6,直到所有进程执行完毕。
对于每个进程,我们可以记录其等待时间、周转时间和带权周转时间。
等待时间即为该进程在就绪队列中等待的时间,周转时间是指从进程提交到完成的时间,即完成时间减去到达时间,带权周转时间是指每个进程的周转时间除以服务时间,用来评估进程的调度效果。
下面是一个动态优先权调度算法的模拟实验示例:```pythonclass Process:self.id = idself.priority = prioritydef __lt__(self, other):return self.priority < other.prioritydef dynamic_priority_scheduling(processes):queue = []while processes or queue:for process in processes:queue.append(process)processes.remove(process)queue.sort(reverse=True) # 根据进程的优先权进行排序if queue:process = queue.pop(0)for p in queue:if __name__ == '__main__':n = int(input("Enter the number of processes: "))processes = []for i in range(n):priority = int(input("Enter priority for process {}:".format(i+1)))dynamic_priority_scheduling(processes)```以上代码定义了一个Process类来表示进程,并使用动态优先权调度算法对进程进行调度。
操作系统实验——动态优先级进程调度实验报告
1.实验名称:动态优先权调度过程中就绪队列的模拟2.实验要求:采用动态优先权的进程调度算法,用C语言编程模拟调度过程中每个时间片内的就绪队列。
3.实验内容:(1)每个进程控制块PCB用结构描述,包括以下字段:*进程标识符id*进程优先数priority,并规定优先数越大的进程,其优先权越高。
*进程已占用的CPU时间cputime*进程还需占用的CPU时间alltime,当进程运行完毕时,aiitime变为0*进程的阻塞时间startblock,当进程再运行startblock个时间片后,进程将进入阻塞状态*进程被阻塞的时间blocktime,已阻塞的进程再等待blocktime个时间片后,将转换成就绪状态*进程状态state*队列指针next,将PCB排成队列。
2)调度前,系统中有五个进程,它们的初始状态如下:3)进程在就绪队列呆一个时间片,优先数增加1。
4)进程每运行一个时间片,优先数减3。
5)按下面格式显示每个时间片内就绪队列的情况:READY_QUEUE:->id1->id24.任务分析进程控制块用结构体来表示,包含它的各项属性。
建立两个队列:一个就绪队列,一个阻塞队列。
创建一个进程控制块表示当前正在运行的进程。
程序开始运行时,所有进程都在就绪队列中。
当startblock减少到0时,进程进入阻塞队列。
在阻塞队列中的进程,当blocktime减少到0时,转入就绪队列。
在就绪队列中的进程,如果优先级比当前正在执行的进程高,就可以取代当前进程获取时间片。
当前进程如果运行完毕,就绪队列中优先级最高的进程就可以成为新当前进程。
5.程序流程图#include〈iostream〉#include〈string〉usingnamespace std;#define LEN5typedefenum STATE{READYBLOCKEND}STATE;//定义进程控制块typedefstruct PCB{int id;int priority;int cputime;int alltime;int startblock;int blocktime;STATE state;}PCB;//定义队列typedefstruct queue{int si ze;PCB*data[LEN];}Queue;PCB ps[LEN];PCB*cp; //进程最大数量//进程状态//就绪//阻塞//完成//进程标识符//进程优先级//已占用的CPU时间//还需占用的CPu时间//阻塞时间//被阻塞时间//进程状态//队列中进程的数量//进程的指针//进程数组//当前正在运行的进程6.程序清单Queue rQueue,bQueue;//就绪队列和阻塞队列//就绪队列按优先级降序排序(使用了冒泡排序法)void rQueueSort(){ PCB*temp;for(int i=0;i<rQueue.size-1;i++){for(int j=0;j<rQueue.size-1-i;j++){if(rQueue.data[j]-〉priority<rQueue.data[j+1]-〉priority){temp=rQueue.data[j];rQueue.data[j]=rQueue.data[j+1];}}rQueue.dataj+1]=temp;}}//初始化void init(){//给进程赋值for(int i=0;i<LEN;i++){ps[i].id=i;ps[i].state=READY;ps[i].cputime=0;ps[i].alltime=3;ps[i].blocktime=0;ps[i].startblock=T;}ps[0].priority=9;ps[1].priority=38;ps[2].priority=30;ps[3].priority=29;ps[4].priority=0;ps[2].alltime=6;ps[4].alltime=4;ps[0].startblock=2;ps[0].blocktime=3;cp=NULL;//当前进程赋空bQueue.size=0;//阻塞队列没有进程for(int i=0;i<LEN;i++){bQueue.data[i]=NULL;rQueue.data[i]=&ps[i];}rQueue.size=5;//所有进程全部进入就绪队列rQueueSort();//对就绪队列排序}//打印void print(){cout〈〈"\nRUNNINGPROG:";if(cp!=NULL){cout〈〈cp->id;}cout<<"\nREADY_QUEUE:";for(int i=0;i<rQueue.size;i++){cout〈〈"-〉"〈〈rQueue.data[i]-〉id; }cout<<"\nBLOCK_QUEUE:";for(int i=0;i<bQueue.size;i++){cout〈〈"-〉"〈〈bQueue.data[i]-〉id; }cout〈〈"\n"<<endl;cout<<"ID\t\t";for(int i=0;i<LEN;i++){cout〈〈ps[i].id<<"\t";}cout<<"\nPRI0RITY\t";for(int i=0;i<LEN;i++){cout〈〈ps[i].priority〈〈"\t";}cout<<"\nCPUTIME\t\t";for(int i=0;i<LEN;i++){cout〈〈ps[i].cputime〈〈"\t";}cout<<"\nALLTIME\t\t";for(int i=0;i<LEN;i++){cout〈〈ps[i].alltime〈〈"\t";}cout<<"\nSTARTBLOCK\t";for(int i=0;i<LEN;i++){cout〈〈ps[i].startblock<<"\t";}cout<<"\nBLOCKTIME\t";for(int i=0;i<LEN;i++){cout〈〈ps[i].blocktime<<"\t";}cout<<"\nSTATE\t\t";for(int i=0;i<LEN;i++){if(ps[i].state==READY){cout<<"READY"<<"\t";}elseif(ps[i].state==BLOCK){cout<<"BLOCK"<<"\t";}elseif(ps[i].state==END){cout〈〈"END"<<"\t";}}cout〈〈endl;}//出队,返回进程指针PCB*pop(Queue*q){PCB*temp;if(q-〉size>0){temp=q-〉data[0];//取出队首进程for(int i=0;i<q-〉size-1;i++){q-〉data[i]=q-〉data[i+1];//其他进程依次向前移动}q->size__;return temp;//返回队首进程}return NULL;}//入队void push(Queue*q,PCB*p){if(q_>size<LEN){q_>data[q_〉size]=p;//将入队的进程放在队尾q_>size++;}return;}//运行进程void run(){if(rQueue.size〉0||bQueue.size〉0){if(cp==NULL){//程序一开始运行时,从就绪队列取出首进程cp=pop(&rQueue);}//当前进程没有结束,但优先级比就绪队列首进程低if(cp_〉alltime〉0&&cp_>priority<rQueue.data[0]_〉priority){}push(&r Queue,c//改变进程状态//从就绪队列取出新的当前进程//修改当前进程的状态 //将当前进程加入阻塞队列 //从就绪队列取出新的当前进程{//当前进程的startblock 为正数时//运行一次减一个时间片//减到0时,修改进程状态//每运行一个时间片//就绪队列中的进程优先级+1//每运行一个时间片//阻塞队列中的进程blocktime-1//将当前进程放入就绪队列 //就绪队列队首进程成为当前进程if (cp-〉alltime==0){cp->state =END ;cp=pop(&rQueue); }//如果当前进程运行结束//startblock 为0,标志着当前进程要进入阻塞状态if (cp —>startblock==0&&cp —>blocktime>0){cp —>state=BLOCK ; push(&bQueue,cp); cp=pop(&rQueue); }elseif (cp —>startblock>0)cp —>st artblock 一; }cp —>alltime ——;if (cp —>alltime==0){cp —>state=END ;for (int i=0;i<rQueue.size;i++){rQueue.data[i]-〉priority++; }for (int i=0;i<bQueue.size;i++){if (bQueue.data[i]-〉blocktime>0){bQueue.data[i]-〉blocktime--; }//当阻塞队列队首进程blocktime 为0时if (bQueue.size 〉0&&bQueue.data[0]-〉blocktime==0){bQueue.data[0]-〉state=READY ;//修改进程状态push(&rQueue,pop(&bQueue));//将阻塞队列首进程取出,放入就绪队列cp —〉priority-=3;//修改当前进程的优先级cp —>cputime++; //当前进程占用CPU 时间片+1 if (cp —>alltime>0){//当前进程还需运行的时间片-1}//每运行一个时间片,就绪队列排一次序rQueueSort();} }//主函数int main(){init();//初始化 print();//打印进程信息 while (1){_sleep(1000);if (rQueue.size==0&&bQueue.size==0){//当两个队列都为空时,结束程序cp-〉state=END ;break ; }run();//运行进程 print();//打印进程信息 }return 0; }7.实验过程记录m 匚:\WINDQWS\system32\cmd.exe程序开始执行,当前进程是优先级最高的1号进程,1号进程的优先级减3、cputime++、执行几次之后,1号进程执行完毕而且优先级也不是最高的了,所以优先级为33的2号进程成为当前进程,开始执行。
实验三使用动态优先权的进程调度算法的模拟
实验三使用动态优先权的进程调度算法的模拟概述:在计算机操作系统中,进程调度算法是一种非常重要的组成部分。
进程调度算法决定了系统中各个进程的执行顺序和时间分配,直接影响到系统的性能和资源利用率。
本实验将模拟一种动态优先权的进程调度算法,通过动态地调整进程的优先级来控制执行顺序。
实验目的:1.理解动态优先权的进程调度算法的原理;2.掌握模拟进程的创建、调度和执行的方法;3.通过实验模拟,对进程调度算法的性能进行评估。
实验背景:动态优先权的进程调度算法是基于进程优先级的调度算法。
每个进程被赋予一个初始优先级,随着时间的推移,根据进程的行为和状态,动态地调整进程的优先级。
实验实施步骤:1.定义进程的数据结构,包括进程ID、进程优先级、进程状态等信息;2.创建多个进程,并初始化前述的进程数据结构;3.模拟进程的执行过程,按照一定的规则和时间片来调度执行进程;4.根据进程的行为和状态,动态地调整进程的优先级;5.模拟多轮进程调度,记录进程的执行情况和性能指标;6.结果分析和实验总结。
实验具体实施:1.定义进程的数据结构:进程的数据结构可以使用类或者结构体来定义,包括进程ID(PID)、进程优先级(priority)、进程状态(state)等字段。
进程状态可以包括"就绪"、"运行"和"完成"等状态。
2.创建多个进程:创建多个进程,并为每个进程初始化进程数据结构,包括PID、priority和state等字段。
可以使用数组、链表或队列等数据结构来管理多个进程的信息。
3.模拟进程的执行过程:在模拟的过程中,将进程按照一定的规则和时间片来调度执行。
可以采用循环方式,循环执行每个进程的一小段代码,模拟进程在CPU上的执行过程。
4.动态地调整进程的优先级:根据进程的行为和状态,动态地调整进程的优先级。
例如,当进程执行完成后,将其优先级降低;当进程等待很长时间后,在没有获得CPU资源的情况下,将其优先级提高。
模拟调度实验报告(3篇)
第1篇一、实验背景进程调度是操作系统核心功能之一,它负责在多道程序环境下,按照一定的策略对进程进行调度,以确保系统资源的合理分配和高效利用。
为了加深对进程调度算法的理解,本次实验采用模拟的方式,实现了先来先服务(FCFS)、时间片轮转(RR)和动态优先级调度(DP)三种算法,并对实验过程进行了详细记录和分析。
二、实验目的1. 理解进程调度的基本原理和不同调度算法的特点。
2. 掌握进程控制块(PCB)的设计与实现。
3. 通过模拟实验,验证三种调度算法的执行效果。
三、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发环境:Visual Studio 2019四、实验内容1. 定义进程控制块(PCB)进程控制块是操作系统用于描述和管理进程的实体,它包含了进程的基本信息。
本实验中,PCB包含以下字段:- 进程ID:唯一标识一个进程。
- 到达时间:进程进入就绪队列的时间。
- 需要运行时间:进程完成所需的时间。
- 已运行时间:进程已运行的时间。
- 状态:进程当前的状态(就绪、运行、阻塞、完成)。
2. 实现三种调度算法(1)先来先服务(FCFS)算法FCFS算法按照进程到达就绪队列的顺序进行调度,先到先服务。
具体实现如下:- 将进程按照到达时间排序,形成就绪队列。
- 遍历就绪队列,依次执行进程,直到进程完成或被阻塞。
(2)时间片轮转(RR)算法RR算法将CPU时间划分为时间片,每个进程运行一个时间片后,让出CPU,等待下一个时间片。
具体实现如下:- 设置一个时间片大小。
- 将进程按照到达时间排序,形成就绪队列。
- 遍历就绪队列,每个进程执行一个时间片,如果进程未完成,则将其加入就绪队列队尾。
(3)动态优先级调度(DP)算法DP算法根据进程的优先级进行调度,优先级高的进程优先执行。
具体实现如下:- 设置一个优先级阈值,当进程的优先级高于阈值时,将其加入就绪队列。
- 遍历就绪队列,选择优先级最高的进程执行,直到进程完成或被阻塞。
使用动态优先权的进程调度算法的模拟
PRIORITY 9 38 30 29 0
CPUTIME 0 0 0 0 0
ALLTIME 3 3 6 3 4
STARTBLOCK 2 -1 -1 -1 -1
BLOCKTIME 3 0 0 0 0
STATE ready ready ready ready ready
(5)为了清楚的观察各进程的调度过程,程序应将每个时间片内的情况显示出来,参照的具体格式如下:
if(i==0) //如果创建的是第一个结点
{
head=temp1;
head->next=NULL;
continue;
}
if(head->priority < temp1->priority) //如果创建结点中所保存的数比头结点所保存的数要大,则直
接把该结点插入到头结点之前
{
temp1->next=head;
进程标识数ID。
进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
进程已占用的CPU时间CPUTIME。
进程还需占用的CPU时间ALLTIME。当进程运行完毕时,ALLTIME变为0。
进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,将进入阻塞状态。
int startblock; //进程的阻塞时间
int blocktime; //进程被阻塞的时间
char state[10]; //进程状态
struct node *next; //队列指针
}PCB;
PCB *CreatQueue(int num) //创建一个就绪队列
{
int i; //i为循环计数器
学生进程调度实验报告(3篇)
第1篇一、实验目的本次实验旨在通过模拟操作系统中的进程调度过程,加深对进程调度算法的理解,提高程序设计能力。
通过实现不同调度算法,学习如何根据进程的优先级、到达时间和服务时间等因素,合理分配CPU资源,提高系统的吞吐量和响应速度。
二、实验内容1. 实验环境:Windows操作系统,C/C++编程环境。
2. 实验内容:(1)设计进程调度算法:FCFS(先来先服务)、SJF(最短作业优先)、RR(轮转法)和优先级调度算法。
(2)实现进程控制块(PCB)数据结构,包括进程名、到达时间、服务时间、优先级、状态等信息。
(3)模拟进程调度过程,根据调度算法选择合适的进程运行。
(4)打印进程调度结果,包括运行进程、就绪队列和完成进程等信息。
三、实验原理1. 进程调度算法(1)FCFS:按照进程到达时间顺序进行调度,先到达的进程先执行。
(2)SJF:优先选择执行时间最短的进程执行。
(3)RR:将CPU时间划分为若干个时间片,每个进程运行一个时间片,然后根据进程优先级重新排队。
(4)优先级调度算法:优先选择优先级最高的进程执行。
2. 进程控制块(PCB)PCB是进程的实体,用于描述进程的状态、控制信息和资源等信息。
PCB主要包括以下内容:(1)进程名:唯一标识进程。
(2)到达时间:进程进入就绪队列的时间。
(3)服务时间:进程执行所需的时间。
(4)优先级:表示进程的优先程度。
(5)状态:表示进程的当前状态,如就绪、运行、阻塞等。
四、实验步骤1. 定义PCB数据结构,包括进程名、到达时间、服务时间、优先级、状态等信息。
2. 设计调度算法,实现进程调度功能。
3. 模拟进程调度过程,包括进程到达、就绪、运行、阻塞和完成等状态转换。
4. 打印进程调度结果,包括运行进程、就绪队列和完成进程等信息。
五、实验结果与分析1. FCFS调度算法:按照进程到达时间顺序进行调度,可能导致短作业等待时间过长。
2. SJF调度算法:优先选择执行时间最短的进程执行,但可能存在饥饿现象。
基于动态优先权调度算法的模拟
计算机学院设计性实验报告一、实验目的通过动态优先权调度算法和时间片轮转调度算法的模拟加深进程概念和进程调度过程的理解。
二、实验仪器或设备一台笔记本电脑或者是一台台式机三、总体设计(设计原理、设计方案及流程等)本实验的目的就是用在Linux下用C语言编程模拟N个进程采用高优先权优先(要求采用动态优先权)进程调度算法。
已知时间片轮转算法,可以根据时间片轮转的思路加以修改就行了。
时间轮转调度算法与动态优先权的区别就是时间片轮转是在FIFO进程调度的基础上,队列中的进程按照进入的顺序,每个进程每次都执行一个时间片;如果运行完就把该进程释放掉,如果在一个时间片内未结束就插到队列尾部。
而动态优先权进程调度算法就是按照优先权的大小运行进程,如果一个时间片内未运行完,则将优先权数减3后再插入到队列中(不是队尾而是队列中的适当位置,该位置前面的节点的优先级数大于该节点的优先级数,后面的节点的count值小于该节点的count值)。
四、实验要求:(1)在Linux下用C语言编程模拟N个进程采用高优先权优先(要求采用动态优先权)进程调度算法。
为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程情况显示出来;(2)进程控制块是进程存在的唯一标志,因此,在模拟算法中每一个进程用一个进程控制块PCB来代表,PCB用一结构体表示。
包括以下字段:●进程标识数id,或者进程的名称name;●进程优先数priority,并规定优先数越大的进程,其优先权越高;●进程需要运行的CPU时间ntime;●进程的运行时间rtime;●进程状态state;●队列指针next,用来将PCB排成队列。
(3)进程在运行过程中其状态将在就绪、执行、阻塞(可选)、完成几种状态之间转换,同时进程可能处于不同的队列中,如就绪队列、阻塞队列(可选)。
在两种调度算法中,考虑分别可以选择什么样的队列及如何实现进程的入队、出队操作;(4)为了便于处理,优先权调度每次也仅让进程执行一个时间片,若在一个时间片内未运行结束,调整进程优先级将其插入就绪队列,进行新一轮调度;(5)优先数改变原则:●进程每运行若一个时间单位,优先数减3;●进程在就绪队列中呆一个时间片,优先数增加1。
使用动态优先权的进程调度算法的模拟
3实验结果
(1)流程图
操作系统实验报告
%操作系统实验报告
(2)程序源代码
include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node
{
int id;〃进程标识数
int priority;〃进程优先数,优先数越大优先级越高
(
int i;//i为循环计数器
PCB *head, *templ, *temp2, *temp3;//head为就绪队列的头指针,tempi为创建进程结点的指针,
temp2、temp3分别为比较结点的前驱结点和比较结点for(i=0; i<num; i++)〃根据进程的个数创建结点并按从大到小的顺序进行排序
if(i==0)〃如果创建的是第一个结点
{
head=templ;
head->next=NULL;
continue;
}
if(head->priority < templ->priority)〃如果创建结点中所保存的数比头结点所保存的数要大,则直
接把该结点插入到头结点之前
(
templ->next=head; head=templ;
te m p=temp->next;
)
while(alltime > 0)
(
if(head!=NULL)
{
run=head;〃把就绪队列中的第一个进程取出来执行
head=head->next;〃就绪队列的头指针指向下一个结点
动态高优先权优先
《操作系统》课程实验报告实验名称:动态高优先权优先调度班级:****************学号:*************姓名:**************指导老师:***************成绩:一、实验目的:1.测试数据可以随即输入或从文件中读入。
2.必须要考虑到作业的到达时间3.最终能够计算每一个作业的周转时间。
二、实验内容:模拟实现动态高优先权优先(若数值越大优先权越高,每运行一个时间单位优先权-n,若数值越小优先权越高,没运行一个时间单位优先权+n),具体如下:设置作业体:作业名,作业的到达时间,服务时间,初始优先权,作业状态(W ——等待,R——运行,F——完成),作业间的链接指针作业初始化:由用户输入作业名、服务时间、初始优先权进行初始化,同时,初始化作业的状态为W。
显示函数:在作业调度前、调度中和调度后进行显示。
排序函数:对就绪状态的作业按照优先权排序。
优先权相同时进入等待队列时间早的作业在前。
注意考虑到达时间调度函数:每次从等待队列队首调度优先权最高的作业执行,状态变化。
并在执行一个时间单位后优先权变化,服务时间变化,状态变化。
当服务时间为0时,状态变为F。
删除函数:撤销状态为F的作业。
三、实验代码#include<stdio.h>#include<string.h>#include<stdlib.h>typedefstruct PCB2{char name[10];//进程名int runtime;//要求运行时间intfrist;//定义优先数char zhuangtai; //定义状态,R为就绪,F为完成};struct PCB2 PCBcontrol[4];//定义进程控制块数组void youxian()//构造优先函数{inti,n;printf("请输入进程的个数:\n");scanf("%d",&n);printf("请输入进程的名字、优先权、运行时间\n");printf("\n");for(i=0;i<n;i++){printf("请输入第%d个进程的信息:\n",i+1);scanf("%s%d%d",&PCBcontrol[i].name,&PCBcontrol[i].frist,&PCBcontrol[i].ru ntime);PCBcontrol[i].zhuangtai='R';//进程初始状态均为就绪getchar();//等待回车进入下一次运行}}intmax_frist_process()//确定最大优先级进程子程序{int max=-10;//max为最大优先数,初始化为-10inti,key;for(i=0;i<5;i++){if(PCBcontrol[i].zhuangtai=='r')//r表示正在运行return -1;//返回-1elseif(max<PCBcontrol[i].frist&&PCBcontrol[i].zhuangtai=='R')//从就绪进程中选取优先数最大的进程{max=PCBcontrol[i].frist;//max存放每次循环中的最大优先数key=i;//将进程号赋给key}}if(PCBcontrol[key].zhuangtai=='F')//具有最大优先数的进程若已运行完毕return -1;//则返回-1elsereturn key;//将key作为返回值返回}void show()//显示函数{int i;printf("\n进程名优先级运行时间当前状态\n");printf("*****************************************\n");for(i=0;i<5;i++)//依次显示每个进程的名、优先数、要求运行时间和状态{printf(" %s\t %d\t %d\t %s\t\n",&PCBcontrol[i].name,PCBcontrol[i].frist, PCBcontrol[i].runtime,&PCBcontrol[i].zhuangtai);}printf("\n请按回车键进行查看");}void run()//进程运行子程序{inti,j;int t=0;//t为运行次数for(j=0;j<5;j++){t+=PCBcontrol[j].runtime;}//运行次数即为各个进程运行时间之和printf("\n进程没运行前,当前的状态是:\n");show(); //调用show()子程序显示运行前PCB的情况getchar();//等待回车进入下一次运行for(j=0;j<t;j++){while(max_frist_process()!=-1)//具有最大优先数的进程没有运行完,让其运行{PCBcontrol[max_frist_process()].zhuangtai='r';//将其状态置为r,表示其正在运行}for(i=0;i<5;i++){if(PCBcontrol[i].zhuangtai=='r'){PCBcontrol[i].frist-=1;//将当前运行进程的优先数减1PCBcontrol[i].runtime--;//要求运行时间减1{if(PCBcontrol[i].runtime==0)PCBcontrol[i].zhuangtai='F';//运行完则将该进程状态置为结束elsePCBcontrol[i].zhuangtai='R';//未运行完将其状态置为就绪}show();//显示每次运行后各PCB的情况getchar();//等待回车进入下一次运行}}}}void main(){int N;int number;char Tishikuang;//提示框do{printf(" ★*********★********★*******★******★********★*********★************★\n");printf("*************嵌入式软件14-01班****51********杨霖***************************\n");printf(" ** 输入1—高优先权优先服务法*\n");printf(" ** 输入0—退出该程序*\n");printf("********************************************************************* **\n");printf("\n注:请根据自己的需求选择相应的操作数:\n");scanf("%d",&number);/*提示输入字母,用switch语句存入到case中,最后增加提示框是否继续*/switch(number){case 0:break;case 1:printf("\n您选择的是“优先服务项目”,本程序可提供5个进程的调度。
调度算法实验报告总结(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算法在进程数量较多时,可能会导致调度开销较大。
实验3高优先权优先的进程调度算法模拟
实验3高优先权优先的进程调度算法模拟引言:进程调度算法是操作系统中非常重要的一部分,它能够有效地利用计算机资源,提高系统的运行效率。
高(动态)优先权优先的进程调度算法是一种根据进程的优先权动态地进行进程调度的算法。
它根据进程的优先权来决定进程被调度的顺序,优先权高的进程将优先被调度执行。
本实验旨在模拟高(动态)优先权优先的进程调度算法。
实验目的:1.了解高(动态)优先权优先的进程调度算法的原理。
2.了解高(动态)优先权优先的进程调度算法的特点。
3.掌握高(动态)优先权优先的进程调度算法的实现过程。
4.通过实验模拟的方式加深对高(动态)优先权优先的进程调度算法的理解。
实验内容:1.设计进程调度的数据结构,包括进程的类(包含进程的名称、到达时间、服务时间、优先权、开始时间、完成时间、周转时间等信息)、进程队列等。
2.根据进程的到达时间,将进程按顺序加入到进程队列中。
3.根据高(动态)优先权优先的进程调度算法,根据进程的优先权确定进程的调度顺序。
4.模拟进程调度的过程,计算进程的开始时间、完成时间、周转时间等信息。
5.最终输出每个进程的调度结果。
实验步骤:第一步:设计进程调度的数据结构首先,我们需要设计进程调度的数据结构,包括进程的类和进程队列。
进程的类包含进程的名称、到达时间、服务时间、优先权、开始时间、完成时间、周转时间等信息。
进程队列用于存储待调度的进程。
第二步:加入进程到进程队列中在模拟进程调度的过程中,我们需要按照进程的到达时间将进程按顺序加入到进程队列中。
根据实际需求,可以手动输入进程的信息或者随机生成进程的信息。
第三步:根据优先权确定进程的调度顺序在高(动态)优先权优先的进程调度算法中,进程的调度顺序是根据进程的优先权确定的。
优先权高的进程将优先被调度执行。
因此,我们需要根据进程的优先权对进程队列进行排序。
第四步:模拟进程调度的过程在实验中,我们需要模拟进程调度的过程。
根据调度算法,选择优先权最高的进程进行调度。
操作系统实验——动态优先级进程调度实验报告
1. 实验名称:动态优先权调度过程中就绪队列的模拟2. 实验要求:采用动态优先权的进程调度算法,用C语言编程模拟调度过程中每个时间片内的就绪队列。
3. 实验内容:(1)每个进程控制块PCB用结构描述,包括以下字段:*进程标识符id*进程优先数priority,并规定优先数越大的进程,其优先权越高。
*进程已占用的CPU时间cputime*进程还需占用的CPU时间alltime,当进程运行完毕时,aiitime变为0*进程的阻塞时间startblock,当进程再运行startblock个时间片后,进程将进入阻塞状态*进程被阻塞的时间blocktime,已阻塞的进程再等待blocktime 个时间片后,将转换成就绪状态*进程状态state*队列指针next,将PCB排成队列。
(2)调度前,系统中有五个进程,它们的初始状态如下:(3)进程在就绪队列呆一个时间片,优先数增加1。
(4)进程每运行一个时间片,优先数减3。
(5)按下面格式显示每个时间片内就绪队列的情况:READY_QUEUE :->id1->id24. 任务分析进程控制块用结构体来表示,包含它的各项属性。
建立两个队列:一个就绪队列,一个阻塞队列。
创建一个进程控制块表示当前正在运行的进程。
程序开始运行时,所有进程都在就绪队列中。
当startblock减少到0时,进程进入阻塞队列。
在阻塞队列中的进程,当blocktime减少到0时,转入就绪队列。
在就绪队列中的进程,如果优先级比当前正在执行的进程高,就可以取代当前进程获取时间片。
当前进程如果运行完毕,就绪队列中优先级最高的进程就可以成为新当前进程。
5. 程序流程图6. 程序清单#include<iostream>#include<string>using namespace std;#define LEN 5 // 进程最大数量typedef enum STATE// 进程状态{READY, // 就绪BLOCK, // 阻塞END// 完成}STATE;// 定义进程控制块typedef struct PCB {int id; // 进程标识符int priority; // 进程优先级int cputime; // 已占用的CPU时间int alltime; // 还需占用的CPU时间int startblock; // 阻塞时间int blocktime; // 被阻塞时间STATE state; // 进程状态}PCB;// 定义队列typedef struct queue {int size; // 队列中进程的数量PCB *data[LEN]; // 进程的指针}Queue;PCB ps[LEN]; // 进程数组PCB *cp; // 当前正在运行的进程Queue rQueue, bQueue; // 就绪队列和阻塞队列// 就绪队列按优先级降序排序(使用了冒泡排序法)void rQueueSort() {PCB *temp;for (int i = 0; i < rQueue.size - 1; i++) {for (int j = 0; j < rQueue.size - 1 - i; j++) {if (rQueue.data[j]->priority < rQueue.data[j + 1]->priority) { temp = rQueue.data[j];rQueue.data[j] = rQueue.data[j + 1];rQueue.data[j + 1] = temp;}}}}// 初始化void init() {// 给进程赋值for (int i = 0; i < LEN; i++) {ps[i].id = i;ps[i].state = READY;ps[i].cputime = 0;ps[i].alltime = 3;ps[i].blocktime = 0;ps[i].startblock = -1;}ps[0].priority = 9;ps[1].priority = 38;ps[2].priority = 30;ps[3].priority = 29;ps[4].priority = 0;ps[2].alltime = 6;ps[4].alltime = 4;ps[0].startblock = 2;ps[0].blocktime = 3;cp = NULL; // 当前进程赋空bQueue.size = 0; // 阻塞队列没有进程for (int i = 0; i < LEN; i++) {bQueue.data[i] = NULL;rQueue.data[i] = &ps[i];}rQueue.size = 5; // 所有进程全部进入就绪队列rQueueSort(); // 对就绪队列排序}// 打印void print() {cout <<"\nRUNNING PROG: ";if (cp != NULL) {cout<< cp->id;}cout <<"\nREADY_QUEUE:";for (int i = 0; i < rQueue.size; i++) {cout<<"->"<< rQueue.data[i]->id;}cout <<"\nBLOCK_QUEUE:";for (int i = 0; i < bQueue.size; i++) {cout <<"->"<< bQueue.data[i]->id;}cout <<"\n-------------------------------------------------------"<< endl;cout <<"ID\t\t";for (int i = 0; i < LEN; i++) {cout << ps[i].id <<"\t";}cout <<"\nPRIORITY\t";for (int i = 0; i < LEN; i++) {cout << ps[i].priority <<"\t";}cout <<"\nCPUTIME\t\t";for (int i = 0; i < LEN; i++) {cout << ps[i].cputime <<"\t";}cout <<"\nALLTIME\t\t";for (int i = 0; i < LEN; i++) {cout << ps[i].alltime <<"\t";}cout <<"\nSTARTBLOCK\t";for (int i = 0; i < LEN; i++) {cout << ps[i].startblock <<"\t";}cout <<"\nBLOCKTIME\t";for (int i = 0; i < LEN; i++) {cout << ps[i].blocktime <<"\t";}cout <<"\nSTATE\t\t";for (int i = 0; i < LEN; i++) {if (ps[i].state == READY) {cout <<"READY"<<"\t";}else if (ps[i].state == BLOCK) {cout <<"BLOCK"<<"\t";}else if (ps[i].state == END) {cout <<"END"<<"\t";}}cout << endl;}// 出队,返回进程指针PCB* pop(Queue *q) {PCB *temp;if (q->size > 0) {temp = q->data[0]; // 取出队首进程for (int i = 0; i < q->size - 1; i++) {q->data[i] = q->data[i + 1]; // 其他进程依次向前移动}q->size--;return temp; // 返回队首进程}return NULL;}// 入队void push(Queue *q, PCB *p) {if (q->size < LEN) {q->data[q->size] = p; // 将入队的进程放在队尾q->size++;}return;}// 运行进程void run() {if (rQueue.size > 0 || bQueue.size > 0) {if (cp == NULL) { // 程序一开始运行时,从就绪队列取出首进程cp = pop(&rQueue);}// 当前进程没有结束,但优先级比就绪队列首进程低if (cp->alltime > 0 && cp->priority < rQueue.data[0]->priority) {push(&rQueue, cp); // 将当前进程放入就绪队列cp = pop(&rQueue); // 就绪队列队首进程成为当前进程}if (cp->alltime == 0) { // 如果当前进程运行结束cp->state = END; // 改变进程状态cp = pop(&rQueue); // 从就绪队列取出新的当前进程}cp->priority -= 3; // 修改当前进程的优先级// startblock为0,标志着当前进程要进入阻塞状态if (cp->startblock == 0 && cp->blocktime > 0) {cp->state = BLOCK; // 修改当前进程的状态push(&bQueue, cp); // 将当前进程加入阻塞队列cp = pop(&rQueue); // 从就绪队列取出新的当前进程}else if (cp->startblock > 0) { // 当前进程的startblock为正数时cp->startblock--; // 运行一次减一个时间片}cp->cputime++; // 当前进程占用CPU时间片+1if(cp->alltime > 0){ // 当前进程还需运行的时间片-1cp->alltime--;if (cp->alltime == 0) { // 减到0时,修改进程状态cp->state = END;}}for (int i = 0; i < rQueue.size; i++) { // 每运行一个时间片rQueue.data[i]->priority++; // 就绪队列中的进程优先级+1 }for (int i = 0; i < bQueue.size; i++) { // 每运行一个时间片if (bQueue.data[i]->blocktime > 0) { // 阻塞队列中的进程blocktime-1 bQueue.data[i]->blocktime--;}}// 当阻塞队列队首进程blocktime为0时if (bQueue.size > 0 && bQueue.data[0]->blocktime == 0) {bQueue.data[0]->state = READY; // 修改进程状态push(&rQueue, pop(&bQueue)); // 将阻塞队列首进程取出,放入就绪队列}// 每运行一个时间片,就绪队列排一次序rQueueSort();}}// 主函数int main() {init(); // 初始化print(); // 打印进程信息while (1) {_sleep(1000);if (rQueue.size == 0 && bQueue.size == 0) { // 当两个队列都为空时,结束程序cp->state = END;break;}run(); // 运行进程print(); // 打印进程信息}return 0;}7. 实验过程记录程序开始执行,当前进程是优先级最高的1号进程,1号进程的优先级减3、cputime++、alltime--。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
华北电力大学
实验报告
实验名称动态优先权进程调度算法模拟课程名称计算机操作系统
专业班级:学生姓名:
学号:成绩:
指导教师:实验日期:
一﹑实验目的:
通过动态优先权算法的模拟加深对进程概念和进程调度过程的理解。
二﹑实验内容:
(1)用C语言(或其它语言,如Java)实现对N个进程采用某种进程调度算法(如动态优先权调度)的调度。
(2)每个用来标识进程的进程控制块PCB可用结构来描述,包括以下字段:进程标识数ID。
进程优先数PRIORITY,并规定优先数越大的进程,其优先权越高。
进程已占用CPU时间CPUTIME。
进程还需占用的CPU时间ALLTIME。
当进程运行完毕时,ALLTIME变为0。
进程的阻塞时间STARTBLOCK,表示当进程再运行STARTBLOCK个时间片后,进程将进入阻塞状态。
进程被阻塞的时间BLOCKTIME,表示已阻塞的进程再等待BLOCKTIME个时间片后,将转换成就绪状态。
进程状态STATE。
队列指针NEXT,用来将PCB排成队列。
(3)优先数改变的原则:
进程在就绪队列中呆一个时间片,优先数增加1。
进程每运行一个时间片,优先数减3。
(4)为了清楚地观察每个进程的调度过程,程序应将每个时间片内的进程的情况显示出来,包括正在运行的进程,处于就绪队列中的进程和处于阻塞队列中的进程。
(5)分析程序运行的结果,谈一下自己的认识。
三、设计思路和方法
通过VC++程序模拟动态优先权程序调度算法,主要思路和方法就是,通过结构体模拟计算机的控制模组,构造一个PCB结构体即进程控制块结构体,用来记录当前进程的的。