操作系统课程设计报告_进程调度算法

合集下载

操作系统实验报告进程调度

操作系统实验报告进程调度

操作系统实验报告进程调度操作系统实验报告:进程调度引言在计算机科学领域中,操作系统是一个重要的概念,它负责管理和协调计算机系统中的各种资源,包括处理器、内存、输入/输出设备等。

其中,进程调度是操作系统中一个非常重要的组成部分,它负责决定哪个进程在何时获得处理器的使用权,以及如何有效地利用处理器资源。

实验目的本次实验的目的是通过对进程调度算法的实验,深入理解不同的进程调度算法对系统性能的影响,并掌握进程调度算法的实现方法。

实验环境本次实验使用了一台配备了Linux操作系统的计算机作为实验平台。

在该计算机上,我们使用了C语言编写了一些简单的进程调度算法,并通过模拟不同的进程调度场景进行了实验。

实验内容1. 先来先服务调度算法(FCFS)先来先服务调度算法是一种简单的进程调度算法,它按照进程到达的顺序进行调度。

在本次实验中,我们编写了一个简单的FCFS调度算法,并通过模拟多个进程同时到达的情况,观察其对系统性能的影响。

2. 短作业优先调度算法(SJF)短作业优先调度算法是一种根据进程执行时间长度进行调度的算法。

在本次实验中,我们编写了一个简单的SJF调度算法,并通过模拟不同长度的进程,观察其对系统性能的影响。

3. 时间片轮转调度算法(RR)时间片轮转调度算法是一种按照时间片大小进行调度的算法。

在本次实验中,我们编写了一个简单的RR调度算法,并通过模拟不同时间片大小的情况,观察其对系统性能的影响。

实验结果通过实验,我们发现不同的进程调度算法对系统性能有着不同的影响。

在FCFS 算法下,长作业会导致短作业等待时间过长;在SJF算法下,长作业会导致短作业饥饿现象;而RR算法则能够较好地平衡不同进程的执行。

因此,在实际应用中,需要根据具体情况选择合适的进程调度算法。

结论本次实验通过对进程调度算法的实验,深入理解了不同的进程调度算法对系统性能的影响,并掌握了进程调度算法的实现方法。

同时,也加深了对操作系统的理解,为今后的学习和研究打下了良好的基础。

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

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

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

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

常见的调度算法有先来先服务(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)算法的平均等待时间最短,说明该算法在短作业的情况下能够有效地减少等待时间。

操作系统课程设计报告进程调度

操作系统课程设计报告进程调度
intpriority;//优先级
intnumber;//进程编号
floatcome_T;//到达时间
floatrun_begin_T;//开始运行时间
floatrun_end_T;//结束运行时间
floatrun_T;//运行时间
intorder;//运行次序
intrun_flag;//调度标志
}PCB[MAX];
经过多次测试后,在每个算法的子函数中加入,状态初始化语句,使得程序能以正常运行,得出正确的数据。
5.2.2输出数据时显示不全且乱
输出是开始时做的函数,然而就遇到了挺烦的困难,因为每个进程的数据项多且格式,采用|将其分隔。使其看上去更加严谨,美观。其实很多小细节也要处理好才能更好体现出这个系统的优点。
#include<iostream>
usingnamespacestd;//这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。
#defineMAX10
structPCB_struct
{
charname[10];//进程名称
intnumber;//进程编号
intpriority;//优先级
图4.3.2“高响应比优先调度算法”运行结果图
图4.3.3“高响应比优先调度算法”流程图
4.4“优先级调度(非抢占式)算法”
优先级调度算法也成优先权调度算法,本次采用非抢占式优先级算法,在进程输入时确定进程的优先级,数字越大优先级别越高。
进入该函数后读取每个进程控制块中的到达时间come_T,选取最早的,若时间相同则选优先级别高的的进程进行调度,记录开始运
6心得体会
通过这次课程设计,使我更加扎实的掌握了有关操作系统方面的知识,特别是进程以及各种调度算法。进程调度虽然是在系统内部的低级调度,但进程调度的优劣直接影响作业调度的性能。反映作业调度优劣的周转时间和平均周转时间只在某种程度上反映了进程调度的性能,例如,其执行时间部分中实际上包含有进程等待(包括就绪状态时的等待)时间,而进程等待时间的多少是要依靠进程调度策略和等待事件何时发生等来决定的。因此,进程调度性能的商量是操作系统设计的一个重要指标。所以进程调度的重要性也是不可忽视的。

操作系统课程设计报告-进程调度算法模拟

操作系统课程设计报告-进程调度算法模拟

1.课程设计的目的《操作系统原理》课程设计我们专业实践性环节之一,是学习完《操作系统原理》课程后进行的一次较全面的综合练习。

其目的在于加深对操作系统的理论、方法和基础知识的理解,掌握操作系统结构、实现机理和各种典型算法,系统地了解操作系统的设计和实现思路,培养学生的系统设计能力,并了解操作系统的发展动向和趋势。

2.课程设计的内容及要求先来先服务、短作业优先、时间片轮转、基于静态优先级的调度,基于高响应比优先的动态优先级调度算法实现,能够输出调度情况,并计算周转时间和平均周转时间。

要求使用链表,进程个数由用户提供,按照进程的实际个数生成PCB,程序能够让用户选择使用哪种调度算法,能够在Linux环境运行并验证结果。

程序要考虑用户界面的友好性和使用方便性。

进程基本信息可从文件读入,也可手动输入。

3、设计原理3.1先来先服务调度算法每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源创建进程,然后放入就绪队列3.2短作业优先调度算法短作业优先调度算法是从就绪队列中选出一个估计运行时间最短的进程,将处理机分配给它,使它立即执行并一直执行到完成,或发生某事件而被阻塞放弃处理机时再重新调度。

3.3时间片轮转调度算法系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。

时间片的大小从几ms到几百ms。

当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片。

3.4静态优先级调度算法把处理机分配给优先级最高的进程,使之执行。

但在其执行期间,只要出现了另一个比其优先级更高的进程,调度程序就将处理机分配给新到的优先级最高的进程。

这样就可以保证紧迫性作业优先运行。

3.5最高响应比优先的动态优先级调度算法优先权调度算法是为了照顾紧迫型作业,使之在进入系统后便获得优先处理,引入最高优先权优先调度算法。

操作系统课程设计报告进程调度算法

操作系统课程设计报告进程调度算法

操作系统课程设计报告进程调度算法Minix 操作系统实践计算机科学与技术题 目 :姓 名 : 学 号 : 专业 : 指导教师 :实验一1.实验目的通过优先权法和轮转算法的模拟加深对进程概念和进程调度过程的理解,掌握进程状态之间的切换,同时掌握进程调度算法的实现方法和技巧。

2.实验内容1.用C++语言来实现对n 个进程采用优先权优先算法以及轮转算法的进程调度。

2.每个用来标识进程的进程控制块PCB 用结构来描述,包括以下字段:(1)进程标识ID,其中0 为闲逛进程,用户进程的标识数为1,2,3⋯。

(2)进程优先级Priority ,闲逛进程(idle)的优先级为0,用户进程的优先级大于0,且随机产生,标识数越大,优先级越高。

(3)进程占用的CPU时间CPUtime,进程每运行一次,累计值等于4。

(4)进程总共需要运行时间Alltime ,利用随机函数产生。

(5)进程状态,0-就绪态;1-运行态;2-阻塞态。

(6)队列指针next,用来将多个进程控制块PCB 链接为队列。

3.优先数改变的原则(1)进程在就绪队列中每呆一个时间片,优先数增加1。

(2)进程每运行一个时间片,优先数减3。

4.在调度前,系统中拥有的进程数PCB_number 由键盘输入,经初始化后,所有的进程控制块PCB 链接成就绪队列。

5.为了清楚地观察诸进程的调度过程,程序应将每个时间片内的进程的情况显示出来,3.实验步骤进程调度的思想(1)当系统空闲(就绪队列为空)时,系统运行闲逛进程,否则运行其他进程,发生变迁1(就绪→运行)。

(2)在运行进程(包括闲逛进程)的过程中,可能发生变迁2(运行→阻塞),即将运行进程插入到阻塞队列(闲逛进程不能被阻塞),可能有其他新的进程创建PCB,还可能唤醒阻塞队列中的某些进程PCB,发生变迁3(阻塞→就绪),即从阻塞队列中移出并插入就绪队列中。

(3)时间片运行结束后,若进程累计占用CPU 时间大于等于进程需要运行的时间,则进程执行结束,释放其PCB。

《操作系统》上机实验报告—进程调度

《操作系统》上机实验报告—进程调度

《操作系统》上机实验报告实验算法主体内容及#include<stdio.h>#include<dos.h>#include<stdlib.h>#include<conio.h>#include<iostream.h>#define P_NUM 5 // 共有5 个进程#define P_TIME 50 //作为优先数计算时所用的值enum state{ready,execute,block, finish};//进程的状态,使用枚举struct pcb{char name[4]; // 进程名称int priority; //进程优先级int cputime; //已经占有cpu运行的时间int needtime; //还需要运行的时间int count; //在时间片轮转法中使用的int round; //在时间片轮转法中使用的state process; //进程的状态pcb *next; //指向下一个进程的pcb};pcb *get_process() //通过输入各进程的值来建立pcb队列,并返回其首元素的指针{pcb *q;pcb *t;pcb *p;int i=0;coutvv"请输入进程名与时间"<<endl;while(i<P_NUM){q=(struct pcb *)malloc(sizeof(pcb));cin>>q->name; cin>>q->needtime; q->cputime=O;q->priority=P_TIME-q->needtime;q->round=0; q->count=0;q->process=ready;q->next=NULL;if (i==0){p=q;t=q;}else{ t->next=q; t=q; } i++;}return p;}void display(pcb *p) //显示本轮运行后的进程各状态情况{coutvv" 进程各状态情况"vvendl;coutvv"名称"vv" "vv"进入时间"vv" "vv"还需时间"vv" "vv"优先级"vv" "vv"状态"vvendl;while(p){coutvvp->name;coutvv" ";coutvvp->cputime;coutvv" ";coutvvp->needtime;coutvv" ";cout<vp_>priority;coutvv"";switch(p->process) //对枚举类型的输出方法{case ready:cout< <"就绪"<<endl;break;case execute:cout< <"执行"<<endl;break;case block:cout<<"阻塞"<<endl;break;case finish:cout<<"完成"<<endl;break;} p=p->next;}}int process_finish(pcb *q) //判断所有的进程是否运行结束{ -int b=1;while(q&&b){b=b&&q->needtime==O; q=q_>next;} return b;}void cpuexe(pcb *q) //优先级调度算法的一次执行{pcb *t;t=q;int i=0;while(q){if (q->process!=finish){q_>process=ready;if(q->needtime==0) q->process=finish;} if(i<q->priority) if(q->process!=finish){ t=q;i=q->priority;} q=q->next;}t->needtime-=1;t_>priority_=3; if(t->needtime==0)t->process=finish; t->cputime+=1;}void priority_cal() //优先级调度算法{pcb *p;P=get_process();〃取得进程队列int cpu=0;while(!process_finish(p)) //若进程并未全部结束,则还需要执行{cpu++;coutvv"运行次数:"vvcpuwendl; cpuexe(p);//一次cpu的执行display(p);//显示本次执行结果}}pcb * get_process_round()Jpcb *q;pcb *t;pcb *p;int i=0;coutvv"请输入进程名与时间"《endl;while (i<P_NUM){q=(struct pcb *)malloc(sizeof(pcb));cin>>q->name;cin>>q->needtime; q->cputime=O;q->round=0;q->count=0;q_>process=ready; q->next=NULL; if(i==0){p=q;t=q;}else{} i++; } return p;} t->next=q; t=q;void cpu_round(pcb *q){-q->count++;q->cputime+=2;q->needtime-=2;if(q->needtime<0)q->needtime=0;q->round++;q->process=execute;}pcb *get_next(pcb *k,pcb *head){ -pcb *t;t=k; do{t=t->next;}while (t && t->process==finish);if(t==NULL){} return t; t=head;while (t->next!=k && t->process==finish) {t=t->next;}void set_state(pcb *p){-while(p){if (p->needtime==O){p->process=finish;}if (p->process==execute){p_>process=ready;} p=p_>next;}}void display_round(pcb *p){ -cout«" 进程各状态情况"vvendl;coutvv"名称"vv" "vv"进入时间"vv" "vv"还需时间"vv" "vv"时间片"vv"" vv"次数"vv""vv"状态"vvendl;while(p){coutvvp->name;coutvv" ";coutvvp->cputime;coutvv" ";coutvvp->needtime;coutvv" ";coutvvp->round;coutvv"";coutvvp->count;coutvv"";switch(p->process){case ready:coutv v"就绪"vvendl;break;case execute:coutvv'执行"vvendl;break;case finish:coutvv"完成"vvendl;break;}p=p->next;}}void round_cal(){pcb *p;pcb *r;p=get_process();int cpu=0;r=p;while(!process_finish(p)){cpu+=2;cpu_round(r);r=get_next(r,p);coutvv"运行次数"vvcpuvvendl;display_round(p);set_state(p);} }-void display_menu(){ -coutvv"进程调度算法操作:"vvendl;coutvv"1 优先数"vvendl;coutvv"2 时间片轮转"vvendl;coutvv"3 退出"vvendl;}void main(){display_menu();int k;printf("请选择:");scanf("%d",&k);switch(k){case 1:priority_cal();break;case 2:round_cal();break;case 3:break;}} ----------------------------------------------------------------------------------------------------------测试数据:¥间出择1A.时退选r 5642 3込簷运行结果:1优先数S却曰石石<奪--a S 亠 亡疋出尢尤扫 亡、 ^a ^T B a 抄各时 各时 进还进还称进入时|可0 3 0I! IS 运行次数 “称进入时间II态成養成成忧完就完完完&0 94 2R p f c 32 3 4 3 % 扰冋运行次数心 泊称进入吋冋R5 R 5 C4 卜2佳行次数陰态成成成成成状§_f c s ^H Z B6 4 28尸尤32 3 4结果截图与分析2、时间片轮转10 0名称进入时问64 42 运行次数t k 称进入吋间A称进入时间竇鶴躺翻聶s _^->4p 者者者奁廿者_J-^□者者HiH8 数 謝还轎時 0 00 0 0次数0 口2 1 21 2 3 3216 6 42 2 1 20 Q 0D F次数3 E34 4 1 1 e s 02 0 0态成成态成衣成成些兀执完lla兀。

操作系统课程设计进程调度

操作系统课程设计进程调度
每个进程的状态可以是就绪 W(Wait)、运行R(Run)、或完成F (Finish)三种状态之一。
静态最高优先数调度算法的流程图如下:
开始
创建PCB
将PCB挂入就绪队 列中,优先级高的
放在队首
是 就绪队列空
否 从队首取下最高优
先级进程运行
结束
进程运行完成,撤 销
时间片轮转调度算法 就绪进程获得 CPU后都只能运行一个时间片。 如果运行一个时间片后,进程的已占用 CPU时间已达到所
课程实验的目的和意义
培养程序设计的方法和技巧 掌握操作系统的原理和功能
进程调度实验
目的要求
用高级语言编写和调试一个进程调度程序, 以加深对进程的概念及进程调度算法的理解。 (注意:这里只是模拟的进程调度程序,用 一个链表结点模拟一个进程,而不用我们之 前用过的createprocess函数创建进程)
进程调度实验
用三个队列,就绪、运行、完成来表示进程 的不同状态。当新来一个进程时,若采用静 态优先级,则根据优先级插入就绪队列中不 同位置(若队列为空,则直接插入)。若采 用时间片,则直接插入就绪队列队尾。
实验例题
设计一个有 N个进程共行的进程调度程序
链表中每一个结点包括两部分:
(1)用户需要用的实际数据;( name[10]; int prio; int round; int cputime; int needtime; 需自己输入)
需要的运行时间,则撤消该进程; 如果进程在所分的时间片内没有运行完成,则把它重新插
入就绪队列等待CPU。
时间片轮转调度算法的流程图如下:
开始
创建PCB
将PCB挂入就绪队 列中,先来的放在 队首,后来的放队

进程的调度实验报告(3篇)

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

1.实验目的通过优先权法和轮转算法的模拟加深对进程概念和进程调度过程的理解,掌握进程状态之间的切换,同时掌握进程调度算法的实现方法和技巧。

2.实验内容1.用C++语言来实现对n个进程采用优先权优先算法以及轮转算法的进程调度。

2.每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:(1)进程标识ID,其中0为闲逛进程,用户进程的标识数为1,2,3…。

(2)进程优先级Priority,闲逛进程(idle)的优先级为0,用户进程的优先级大于0,且随机产生,标识数越大,优先级越高。

(3)进程占用的CPU时间CPUtime,进程每运行一次,累计值等于4。

(4)进程总共需要运行时间Alltime,利用随机函数产生。

(5)进程状态,0-就绪态;1-运行态;2-阻塞态。

(6)队列指针next,用来将多个进程控制块PCB链接为队列。

3.优先数改变的原则(1)进程在就绪队列中每呆一个时间片,优先数增加1。

(2)进程每运行一个时间片,优先数减3。

4.在调度前,系统中拥有的进程数PCB_number由键盘输入,经初始化后,所有的进程控制块PCB链接成就绪队列。

5.为了清楚地观察诸进程的调度过程,程序应将每个时间片内的进程的情况显示出来,3.实验步骤进程调度的思想(1)当系统空闲(就绪队列为空)时,系统运行闲逛进程,否则运行其他进程,发生变迁1(就绪→运行)。

(2)在运行进程(包括闲逛进程)的过程中,可能发生变迁2(运行→阻塞),即将运行进程插入到阻塞队列(闲逛进程不能被阻塞),可能有其他新的进程创建PCB,还可能唤醒阻塞队列中的某些进程PCB,发生变迁3(阻塞→就绪),即从阻塞队列中移出并插入就绪队列中。

(3)时间片运行结束后,若进程累计占用CPU时间大于等于进程需要运行的时间,则进程执行结束,释放其PCB。

若进程累计占用CPU时间小于进程需要运行时间,发生变迁4(运行→就绪),即将当前运行的进程插入就绪队列中。

程序流程图1.动态优先权的进程调度算法模拟流程2.轮转法进程调度算法模拟流程程序代码/*以下程序在C++环境调试通过*/#define NULL 0#include <stdio.h>#include <stdlib.h>#include<iostream>using namespace std;/*以下仅列出动态优先权的进程调度算法模拟*//*进程PCB结构*/struct Pcb{int ID;//进程标识ID,其中0为闲逛进程,用户进程的标识数为1,2,3…int priority;//进程优先级Priority,闲逛进程(idle)的优先级为0,用户进程的优先级大于0,且随机产生,标识数越大,优先级越高。

int CPUtime;//进程占用的CPU时间CPUtime,进程每运行一次,累计值等于4int ALLtime;//进程总共需要运行时间Alltimeint State;//进程状态,0-就绪态;1-运行态;2-阻塞态。

struct Pcb *next;//队列指针next,用来将多个进程控制块PCB链接为队列};typedef struct Pcb PCB;void init(); /*产生idle进程,输入用户进程数目,调用insert()*/void print(PCB *pcb); /*输出进程属性信息*/void print_init(PCB *pcb); /*输出所有PCB的初始值*/void insert_queue(PCB *queue,PCB *item); /*动态优先权调试算法将item插入到队列中,使得插入后,队列中按照优先级从高到低有序*/void insert_queue1(PCB *queue,PCB *item); /*轮转法将item插入到队列末尾*/void pushback_queue(PCB *queue,PCB *item); /*将item插入到队列的尾部*/void insert(); /*动态优先权的进程调度算法生成进程属性信息,插入进程就绪队列*/void insert1(); /*轮转法的进程调度算法生成进程属性信息,插入进程就绪队列*/void run(PCB *pcb); /*运行进程,随机阻塞进程、产生新进程,插入就绪队列,唤醒阻塞进程*/void run1(PCB *pcb); /*轮转法试运行参数PCB所指的进程*/void block(PCB *pcb); /*调用destroy(),将进程插入阻塞队列*/void wakeup(); /*动态优先权的进程调度算法唤醒进程,插入就绪队列*/ void wakeup1(); /*轮转法的进程调度算法唤醒进程,插入就绪队列*/void proc_priority(); /*优先权调度算法模拟*/void proc_loop(); /*轮转法调度算法模拟*/void update(PCB *pcb); /*更新进程信息*/PCB *ready_queue,*block_queue,*idleprocess; /*就绪队列,阻塞队列及闲逛进程指针变量*/ void main(){int i=0;while(1){cout<<("\n Please select a number (1,2,0) ");cout<<("\n 1-- priority ");cout<<("\n 2-- loop");cout<<("\n 0-- exit\n");cin>>i;if(i==1){cout<<("\nThis is an example for priority processing:\n");init();::proc_priority();}else if (i==2){cout<<("\nThis is an example for round robin processing:\n");init();proc_loop();}else if(i==0)exit(1);}}/*输出所有PCB的初始值,此函数用于测试程序*/void print_init(PCB *pcb){PCB *temp=pcb->next;cout<<("\n ID priority CPUtime ALLtime State\n");while(temp!=NULL){cout<<"\n"<<" "<<temp->ID<<" "<<temp->priority<<" "<<temp->CPUtime<<" "<<temp->ALLtime;if (temp->State==0)cout<<(" ready");else if (temp->State==1)cout<<(" running");elsecout<<(" blocked");temp=temp->next;}}/*输出进程属性信息*/void print(PCB *pcb){PCB *temp;temp=pcb;if (pcb->ID==0)cout<<("\n\tThe idle process is running!");else{cout<<"\n"<<" "<<temp->ID<<" "<<temp->priority<<" "<<temp->CPUtime<<" "<<temp->ALLtime;if (temp->State==0)cout<<(" ready");else if (temp->State==1)cout<<(" running");elsecout<<(" blocked");}}void insert_queue(PCB *queue,PCB *item){//动态优先权调试算法将item插入到队列中,使得插入后,队列中按照优先级从高到低有序PCB *p,*q;q=queue;p=q->next;while(p!=0 &&p->priority>=item->priority ){q=p;p=p->next;}if(p==0){//在队尾插入item->next=0;q->next=item;}else{//在q之后、p之前插入item->next=p;q->next=item;}}void insert_queue1(PCB *queue,PCB *item){//轮转法将item插入到队列末尾PCB *p,*q;q=queue;p=q->next;item->next=0;q->next=item;}void pushback_queue(PCB *queue,PCB *item){//将item插入到队列的尾部PCB *p,*q;q=queue;p=q->next;while(p!=0 ){q=p;p=p->next;}item->next=q->next;q->next=item;}void sort_queue(PCB *&queue){//对queue中的结点进行排序,按照优先级从大到小PCB *temp=new PCB;temp->next=0;while(queue->next){PCB *p;p=queue->next;queue->next=p->next;::insert_queue(temp,p);}queue->next=temp->next;delete temp;}/*动态优先权的进程调度生成进程属性信息,插入进程就绪队列,显示进程信息*/void insert(){PCB *newp=0;static long id=0;newp=new PCB;id++;newp->ID=id;newp->State=0;newp->CPUtime=0;newp->priority=rand()%3+1;newp->ALLtime=rand()%3+1;newp->next=NULL;::pushback_queue(ready_queue,newp);//将新生成进程插入到就绪队列尾部print(newp);cout<<("\t建立:Creating -> ready\n");}/*轮转法的进程调度生成进程属性信息,插入进程就绪队列,显示进程信息*/ void insert1(){PCB *newp=0;static long id=0;newp=new PCB;id++;newp->ID=id;newp->State=0;newp->CPUtime=0;newp->ALLtime=rand()%3+1;newp->next=NULL;::pushback_queue(ready_queue,newp);//将新生成进程插入到就绪队列尾部print(newp);cout<<("\t建立:Creating -> ready\n");}/*生成n个进程属性信息,插入进程就绪队列,显示进程信息*/void insert(int n){for(int i=1;i<=n;i++){insert();}}/*动态优先权调度产生idle进程,输入用户进程数目,调用insert()*/void init(){//为每个队列设立头结点,便于插入删除操作block_queue=new PCB;block_queue->next=0;ready_queue=new PCB;ready_queue->next=0;int i,pcb_number=-1;idleprocess=NULL; /*设置闲逛进程PCB各字段值*/idleprocess=(PCB *)malloc(sizeof(PCB));idleprocess->ID=0;idleprocess->State=0;idleprocess->CPUtime=0;idleprocess->priority=0;idleprocess->ALLtime=1;idleprocess->next=NULL;//闲逛进程放入就绪队列idleprocess->next=ready_queue->next;ready_queue->next=idleprocess;//也可假定初始时系统中只有一个idle进程////输入初始时进程的个数//while (pcb_number<0)//{// cout<<("Input the number of the PCB to be started:");// cin>>pcb_number;//}//cout<<("\n ID priority CPUtime ALLtime State");//for (i=0;i<pcb_number;i++)// insert();cout<<"就绪队列初始化成功"<<endl;::print_init(ready_queue);cout<<endl;}/*调用destroy(),将进程插入阻塞队列*/void block(PCB *pcb){//将pcb插入到阻塞队列pcb->State=2; /*将PCB所指进程的状态设置为阻塞*/pcb->CPUtime-=2; /*设进程执行半个时间片单位后被阻塞*//*pcb->next=NULL;*/print(pcb);cout<<(" 变迁2:running -> blocked\n");//将pcb插入到阻塞队列//按照什么方式插入呢,需要参考唤醒条件//因为是随机唤醒一个进程,所以我们就简单地把它放置在阻塞队列的头部pcb->next=block_queue->next;block_queue->next=pcb;}void update(PCB *pcb){//就绪队列中进程的优先级均增加1PCB *temp=ready_queue->next;while(temp && temp->next ){//就绪队列的最后一个是闲逛进程temp->priority++;temp=temp->next;}}/*动态优先权调度试运行参数PCB所指的进程*/void run(PCB *pcb){//如果pcb是闲逛进程,则不做处理,再次放入就绪队列ready_queueif(pcb->ID==0){::insert_queue(ready_queue,pcb);print(pcb);cout<<" 变迁1:ready -> running\n";}else{//如果不是闲逛进程,则进行如下处理pcb->State=1;/*设置该进程的状态为"运行"*/pcb->CPUtime+=4;/*累计该进程占用CPU的时间*/pcb->priority=pcb->priority-3; /*每运行一个时间片,其优先数减3*/if(pcb->priority<1)pcb->priority=1;print(pcb);printf(" 变迁1:ready -> running\n");if (rand()%3==1 ) /*PCB不是闲逛进程,满足条件则阻塞此进程*/{if(pcb->CPUtime-2<pcb->ALLtime)block(pcb);else{//已经执行完毕,应该销毁进程cout<<endl;cout<<"\t the process no "<<pcb->ID<<" is completed! 销毁:running->Destroy"<<endl;delete pcb;}}else{//否则看改进程是否执行完毕,如果执行完,则释放,否则再次放入就绪队列if(pcb->CPUtime>=pcb->ALLtime){//释放cout<<endl;cout<<"\t the process no "<<pcb->ID<<" is completed! 销毁:running->Destroy"<<endl;delete pcb;}else{//再次放入就绪队列,按照优先级有序::insert_queue(ready_queue,pcb);}}}update(ready_queue);/*更新就绪队列进程优先数*/if (rand()%5==1){insert(3); /*创建3个新进程*/::sort_queue(ready_queue);}if (rand()%7==1)wakeup(); /*唤醒一个进程*//*返回当前进程是否被阻塞,1(已阻塞),0(未阻塞)*/}/*轮转法试运行参数PCB所指的进程*/void run1(PCB *pcb){//如果pcb是闲逛进程,则不做处理,再次放入就绪队列ready_queueif(pcb->ID==0){::insert_queue1(ready_queue,pcb);print(pcb);cout<<" 变迁1:ready -> running\n";}else{//如果不是闲逛进程,则进行如下处理pcb->State=1;/*设置该进程的状态为"运行"*/pcb->CPUtime+=4;/*累计该进程占用CPU的时间*/// if(pcb->priority<1)pcb->priority=1;// print(pcb);// printf(" 变迁1:ready -> running\n");if (rand()%3==1 ) /*PCB不是闲逛进程,满足条件则阻塞此进程*/{if(pcb->CPUtime-2<pcb->ALLtime)block(pcb);else{//已经执行完毕,应该销毁进程cout<<endl;cout<<"\t the process no "<<pcb->ID<<" is completed! 销毁:running->Destroy"<<endl;delete pcb;}}else{//否则看改进程是否执行完毕,如果执行完,则释放,否则再次放入就绪队列if(pcb->CPUtime>=pcb->ALLtime){//释放cout<<endl;cout<<"\t the process no "<<pcb->ID<<" is completed! 销毁:running->Destroy"<<endl;delete pcb;}else{//再次放入就绪队列::insert_queue1(ready_queue,pcb);}}}if (rand()%5==1){insert(3); /*创建3个新进程*///::sort_queue(ready_queue);}if (rand()%7==1)wakeup1(); /*唤醒一个进程*//*返回当前进程是否被阻塞,1(已阻塞),0(未阻塞)*/}/*唤醒,即从阻塞队列中选择一个PCB,且插入就绪队列中*/void wakeup(){//随机唤醒一个阻塞进程//这里采取的方法是遍历阻塞队列,每访问一个,就产生一个随机数//如果该随机数对20求余恰好是1,则当前结点被唤醒,就要纳入就绪队列if(block_queue->next==0)//此时没有被阻塞的进程,无所谓唤醒return;PCB *q,*p;//下面遍历阻塞队列,q永远指向p的前驱while(true){q=block_queue;p=q->next;while(p && rand()%20!=1){q=p;p=p->next;}if(p!=0){//p就是要唤醒的进程q->next=p->next;break;}}p->State=0;cout<<endl;::print(p);cout<<" 变迁3:blocked->ready"<<endl;::insert_queue(ready_queue,p);}void wakeup1(){//随机唤醒一个阻塞进程//这里采取的方法是遍历阻塞队列,每访问一个,就产生一个随机数//如果该随机数对20求余恰好是1,则当前结点被唤醒,就要纳入就绪队列if(block_queue->next==0)//此时没有被阻塞的进程,无所谓唤醒return;PCB *q,*p;//下面遍历阻塞队列,q永远指向p的前驱while(true){q=block_queue;p=q->next;while(p && rand()%20!=1){q=p;p=p->next;}if(p!=0){//p就是要唤醒的进程q->next=p->next;break;}}p->State=0;cout<<endl;::print(p);cout<<" 变迁3:blocked->ready"<<endl;::insert_queue1(ready_queue,p);}/*优先权优先调度算法*/void proc_priority(){::sort_queue(ready_queue);//对queue中的结点进行排序,按照优先级从大到小PCB *temp=0,*running=0; /*running的PCB指针*/int times;for(times=0;times<10;times++){//找到优先级最高的进程,并且从队列中删除cout<<"本次调度前:"<<endl;::print_init(ready_queue);running=ready_queue->next; /*running指向就绪队列队首PCB*/ready_queue->next=running->next;cout<<endl;cout<<"本次调度开始"<<endl;::run(running);cout<<"\n本次调度结束。

相关文档
最新文档