操作系统实验三时间片轮转法完成进程调度
操作系统时间片轮转法调度
时间片轮转法模拟进程调度
一、基本原理
在时间片轮转法中,系统将所有的就绪进程按先来先服务的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片。当执行的时间片用完时,中断请求,将该程序送往就绪队列的队尾,并把处理机分配给新的队首进程,同时让它也执行一个时间片。这样就保证就绪队列中的所有进程在一给定的时间内均能获得一时间片的处理机执行时间。
二、设计思路
首先,创建进程3-5,置低优先级,并依次插入低优先级队列,每次调度时,把处理器分配给队首进程,并给其一个随机数作为时间片的大小,当随机数小于300时令其等待,插入等待队列。当随机数大于300时,进程执行,并令其执行五个时间片。时间片耗尽时由一个计时器发出时钟中断请求,该进程转为低优先级就绪状态,插入到低优先级就绪队列的队尾,并将处理器分配给下一个进程。当高优先级队列和低优先级队列都为空时,则循环执行进程唤醒,执行等待队列里的进程。
三、运行结果(不唯一)
在运行结果中,按进程插入就绪队列的先后顺序进行调度,进程3先运行,其时间片耗尽后让其插入低优先级就绪队列的队尾,然后进程4开始运行,时间片耗尽后进程5开始运行,在进程5运行完第四个时间片后,分配给它的第五个时间片大小小于300,所以进程5
等待,插入等待队列。继续调度进程3,直到就绪队列里的进程都由于时间片大小小于300被插入等待队列后,开始唤醒进程5,并将其插入高优先级就绪队列,分配两个时间片,如此循环。
三、源代码:
#include
#include
#include
/*********************以下是全局数据结构和变量***********************/
进程调度实验报告
进程调度实验报告
实验名称实验三进程调度
⼀.实验⽬的
了解进程的调度机制,掌握短作业优先算法、时间⽚轮转算法(RR)和优先数算法,并理解响应时间和周转时间的意义。
⼆.实验内容
模拟短作业优先算法、时间⽚轮转算法(RR)和优先数算法的执⾏情况,并动态画出其进程执⾏的 Gantt 图,计算以上算法的每个进程的响应时间和周转时间。
三.实验步骤和结果
1、需要模拟执⾏的进程序列如下:
进程名到达时间运⾏时间优先数
P1 0 7 5
P2 1 1 1
P3 1 3 4
P4 2 5 3
P5 4 4 2
假设:优先数越⼩优先级越⾼;所有进程都是纯 CPU 型进程。
请把上表的数据按照你⾃⼰设计的格式存为⼀个⽂本⽂件 JOB1.TXT。
2、编写⼀个模拟程序,可以读⼊⽂本⽂件 JOB1.TXT 中描述的进程序列,然后模拟短作业优先算法、时间⽚轮转算法(RR)和优先数算法的执⾏情况,并动态画出其进程执⾏的 Gantt 图,计算以上算法的每个进程的响应时间和周转时间。
3、读⼊⽂本⽂件 JOB1.TXT 中描述的进程序列,按照短作业优先算法执⾏程序。
4、按照时间⽚轮转算法执⾏程序时间⽚⼤⼩分布为 1、2 和 3。
5、按照优先数算法执⾏程序。
程序执⾏结果见下图:
第1页,共2页
教务处制
四.实验总结
通过这次试验,我们更加深刻地理解了有关于进程调度的内容,响应时间就是进程刚开始被执⾏的时间,等待时间就是进程在就绪队列中等待的时间,周转时间就是进程被执⾏完毕的时间(包括等待进⼊内存的时间,在就绪队列中的等待时间,执⾏时间,I/O时间)。
操作系统实验三 时间片轮转法完成进程调度
实验三:时间片轮转法完成进程调度
一、实验目的:
(1)加深对进程的理解
(2)理解进程控制块的结构
(3)理解进程运行的并发性
(4)掌握时间片轮转法进程调度算法
实验内容:
(1)建立进程控制块
(2)设计三个链队列,分别表示运行队列、就绪队列和完成队列
(3)用户输入进程标识符以及进程所需的时间,申请空间存放进程PCB信息。
(4)每一个时间片结束输出各进程的进程号,CPU时间(即已经占用的CPU时间),所需时间(即还需要的CPU时间),以及状态(即用W表示等待,R表示运行,F表示完成)
实验程序:
#include
#include
#include
typedef struct node
{
char name[10];/*进程标识符*/
int prio;/*进程优先数*/
int round;/*进程时间轮转时间片*/
int cputime; /*进程占用CPU时间*/
int needtime; /*进程到完成还要的时间*/
int count;/*计数器*/
char state; /*进程的状态*/
struct node *next; /*链指针*/
}PCB;
PCB *finish,*ready,*tail,*run; //队列指针
int N,t; //进程数,时间片的大小
void firstin()
{
run=ready;//就绪队列头指针赋值给运行头指针
run->state='R'; //进程状态变为运行态
ready=ready->next; //就绪队列头指针后移到下一进程
}
void prt1(char a)//输出标题函数
时间片轮转调度算法实验
时间片轮转调度算法实验
时间片轮转调度算法是一种广泛应用于计算机操作系统中的调度算法。本文将介绍时间片轮转调度算法的基本原理、特点以及实验过程。
一、时间片轮转调度算法的基本原理
时间片轮转调度算法是一种基于时间片的调度算法,它将CPU时间分配给多个进程,每个进程都被赋予一个时间片,当时间片用完后,该进程将被挂起,CPU时间将被分配给下一个进程。被挂起的进程将被放入一个就绪队列中,等待下一轮时间片到来。
二、时间片轮转调度算法的特点
1.公平性:时间片轮转调度算法可以保证每个进程都能够得到一定的CPU时间,从而保证了公平性。
2.响应时间快:时间片轮转调度算法可以保证进程的响应时间快,因为每个进程都会被分配一定的CPU时间。
3.适用性广:时间片轮转调度算法适用于多种场景,包括多用户、多任务、实时任务等。
4.实现简单:时间片轮转调度算法的实现比较简单,可以通过一个就绪队列和一个定时器来实现。
三、时间片轮转调度算法的实验过程
1.实验环境:本次实验使用了Linux操作系统,编程语言为C++。
2.实验步骤:
(1)创建进程:首先需要创建多个进程,并将它们放入就绪队列中。
(2)分配时间片:为了模拟时间片轮转调度算法,需要为每个进程分配一个时间片。
(3)执行进程:按照就绪队列中的顺序,依次执行每个进程,并在执行完一个时间片后,将进程放回就绪队列中。
(4)更新进程状态:根据进程的执行情况,更新进程的状态,包括运行中、就绪、阻塞等。
(5)输出结果:最后,输出每个进程的执行结果,包括进程的状态、执行时间等。
3.实验结果:
用时间片轮转法调度虚拟进程
用时间片轮转法调度虚
拟进程
文档编制序号:[KKIDT-LLE0828-LLETD29&POI08]
《操作系统课程设计》报告学号:
姓名:
班级:
指导教师:
报告日期:
一、课设目的
通过对操作系统课程的学习,熟悉进程的概念、进程的管理与存储、进程的调度,通过实践深入理解进程的调度算法。
二、课设任务
要求编写一个程序,可以创建若干个虚拟进程,并对若干个虚拟进程进行调度,调度策略为时间片轮转法,主要任务包括:
进程的个数,进程的内容(即进程的功能序列)来源于一个进程序列描述文件,另外调度运行结果输出到一个运行日志文件;
设计PCB适用于时间片轮转法;
建立进程队列;
实现时间片轮转调度算法,尽量可视化的展示调度的动态过程。
®总结程序设计的开发过程:需求分析、系统设计、系统实现及文档的收集和整理。
三、实验方法与设计分析
每个进程有一个进程控制块(PCB)表示。进程控制块可以包含如下信息:进程名、优先数、到达时间、需要运行时间、已用CPU时间、进程状态等等。
进程的优先数及需要的运行时间可以事先人为地指定(也可以由随机数产生)。进程的到达时间为输入进程的时间。
进程的运行时间以时间片为单位进行计算。
每个进程的状态可以是就绪W (Wait) s运行R (Run)、或完成F (Finish)三种状态之一。
就绪进程获得CPU后都只能运行一个时间片。用已占用CPU时间加1来表示。
如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行时间,也就是进程还需要继续运行,此时应将进程的优先数减1 (即降低一级),然后把它插入就绪队列等待CPU。
采用时间片轮转算法调度程序
采用时间片轮转算法调度程序
学号:
姓名:
专业:
指导教师:
日期:
目录
一、需求分析 (3)
1、设计要求: (3)
2、解决方案: (3)
二、课程设计简介 (4)
1、课程设计题目 (4)
2、课程设计目的 (4)
3、课程设计内容 (4)
4、时间安排 (4)
三、概要设计 (4)
1、基本原理 (4)
2、算法思想设计 (5)
3、数据结构及模块说明: (5)
四、主要函数及其说明 (6)
五、调试分析 (7)
1、调试过程及步骤 (7)
2、结果分析(以三个进程数为例) (8)
六、总结及参考文献 (9)
1、总结: (9)
2、参考文献 (9)
附录:程序源代码 (9)
一、需求分析
1、设计要求:
在多道程序或多任务系统中,系统同时处于就绪状态的进程有若干个。为了使系统中各进程能有条不紊地进行,必须选择某种调度策略,以选择一进程占用处理机。要求用时间片轮转算法模拟单处理机调度,以巩固和加深处理机调度的概念。
2、解决方案:
(1)、假设系统有5个进程,每个进程用一个进程控制块PCB来表示。PCB包括:进程名、链接指针、到达时间、估计运行时间和进程状态。其中,进程名即进程标识。链接指针指出下一个到达进程的进程控制块地址,按照进程到达的顺序排队,统设置一个队头和队尾指针分别指向第一个和最后一个进程,新生成的进程放队尾。估计运行时间:可由设计者任意指定一个时间值。到达时间:进程创建时的系统时间或由用户指定,调度时,总是选择到达时间最早的进程。进程状态:为简单起见,假定进程有三种状态,就绪、等待和完成,并假定进程一创建就处于就绪状态,用R表示,当一个进程运行结束时,就将其置成完成状态,用F表示。当一个进程未运行完成并且时间片不足时,就将其置成等待状态,用W表示。
操作系统进程调度模拟程序实验报告
操作系统进程调度模拟程序实验报告
实验目的:了解操作系统进程调度的基本原理和方法,通过编写模拟程序来验证调度算法的正确性。
实验内容:
1. 实现进程调度模拟程序,包括进程的创建、调度、挂起、恢复和销毁等基本操作。
2. 实现三种常用的调度算法:先来先服务(FCFS)、最短作业优先(SJF)和时间片轮转(RR)。
3. 对比不同调度算法的性能,包括平均等待时间、平均周转时间和平均响应时间等指标。
实验步骤:
1. 首先定义进程类Process,包括进程的ID、到达时间、执行时间和优先级等属性。
2. 实现创建进程的函数create_process,通过用户输入的方式创建多个进程,并保存到一个进程队列中。
3. 根据选择的调度算法,实现调度函数schedule,按照对应的算法对进程进行调度,并记录每个进程的执行时间和等待时间等信息。
4. 对于FCFS算法,按照进程的到达时间进行排序,然后按顺序执行。
5. 对于SJF算法,按照进程的执行时间进行排序,然后按顺序执行。
6. 对于RR算法,设定一个时间片大小,每个进程执行一个时间片后,将其放回队列末尾,然后继续执行下一个进程,直到所有进程都执行完毕。
7. 在各个调度算法中计算平均等待时间、平均周转时间和平均响应时间等指标,并输出结果。
实验结果:
通过对不同进程和不同调度算法的模拟,可以得到如下结果:1. FCFS调度算法的平均等待时间较长,不适用于执行时间较
长的任务。
2. SJF调度算法的平均等待时间和平均周转时间较短,适用于
执行时间较短的任务。
3. RR调度算法能够平均分配CPU时间,适用于执行时间较长的任务。
时间片轮转调度算法例题详解
时间片轮转调度算法例题详解
在计算机操作系统中,调度算法是非常重要的一部分。调度算法的作用是决定哪个进程可以获得 CPU 的使用权。其中,时间片轮转调度算法是一种常见的调度算法,它可以保证每个进程都能够获得一定的 CPU 时间,从而避免了某个进程长时间占用 CPU 的情况。
本文将对时间片轮转调度算法进行详细的介绍,并通过实例来说明如何使用该算法进行进程调度。
一、时间片轮转调度算法的原理
时间片轮转调度算法是一种抢占式的调度算法,它将 CPU 的使用时间划分为若干个时间片,每个进程在一个时间片内可以占用CPU 的时间是固定的。当一个进程占用 CPU 的时间超过了一个时间片,系统会将该进程挂起,并将 CPU 分配给下一个进程。
时间片轮转调度算法的优点在于可以保证公平性,每个进程都能够获得一定的 CPU 时间,从而避免了某个进程长时间占用 CPU 的情况。另外,该算法的实现比较简单,适用于多任务环境下的进程调度。
二、时间片轮转调度算法的实现
时间片轮转调度算法的实现需要使用一个队列来保存所有等待CPU 时间的进程。每个进程在队列中占据一个时间片的位置,当轮到该进程时,系统会将该进程从队列头部取出,并将其放到队列尾部。如果一个进程占用 CPU 的时间超过了一个时间片,系统会将该
进程挂起,并将其放到队列尾部。
下面是时间片轮转调度算法的具体实现步骤:
1. 将所有等待 CPU 时间的进程放入一个队列中。
2. 设置一个时间片的长度,例如 10 毫秒。
3. 从队列头部取出一个进程,并将其放到 CPU 中执行。
时间片轮转调度算法例题详解
时间片轮转调度算法例题详解
操作系统是计算机系统中的一个重要组成部分,它负责管理计算机系统的各种资源,协调各种应用程序的运行,保证计算机系统的高效稳定运行。操作系统中的进程调度是其中的一个重要内容,它决定了进程在CPU上的运行顺序,直接影响到计算机系统的性能。本文将详细介绍时间片轮转调度算法,并通过例题进行详解。
一、时间片轮转调度算法
时间片轮转调度算法是一种基于时间片的进程调度算法,它将CPU时间片分配给各个正在运行的进程,每个进程在一个时间片内运行一定的时间,然后被挂起,等待下一次调度。如果进程在一个时间片内没有完成运行,那么它将被挂起,等待下一次调度。这种调度算法适用于多道程序并发执行的情况,可以避免进程长时间占用CPU,保证进程的公平性和响应性。
时间片轮转调度算法的基本思想是将所有就绪进程按照先来先
服务的原则排队,每个进程在一个时间片内运行一定的时间,然后被挂起,等待下一次调度。时间片的大小可以根据系统的负载情况进行调整,一般情况下,时间片的大小为10ms~100ms之间。当一个进程在一个时间片内运行完成,它将被移到队列的末尾,等待下一次调度。如果进程在一个时间片内没有完成运行,那么它将被挂起,等待下一次调度。这样,所有进程都有机会获得CPU时间,避免了某个进程长时间占用CPU的情况。
时间片轮转调度算法的优点是简单易懂,易于实现,可以保证进
程的公平性和响应性。缺点是时间片的大小对系统的性能有较大影响,时间片过小会导致进程切换频繁,影响系统性能;时间片过大会导致进程响应时间增加,影响用户体验。
操作系统实验(时间片轮转)
操作系统
实
验
报
告
实验名称:时间片轮转调度
班级:
姓名:
学号:
实验目的:用高级语言编写和调试一个简单的时间片轮转调度程序,算法要求使用高优先权优先来进行进程调度。
实验内容:(1)用户输入进程名和优先级,并发执行的进程调度程序,每一个进程用一个进程控制块PCB 来代表。PCB中应包含下列信息:进程名、进
程优先数、进程需要运行的时间、占用CPU的时间及进程的状态等,
各进程的优先数以及进程运行需要地时间片数,由用户输入。
(2)根据先来先服务原则,执行进程,每执行一次,需要时间减1,CPU
时间片加1,在进程运行结束后,会显示进程的周转时间;
(3)每个进程处于运行R、就绪W和完成F 三种状态之一,假定初
始状态都为就绪状态W。
(4)系统能显示或打印各进程状态和参数的变化情况。
实验步骤:
一、输入运行进程数目(测试数据为3);
二、输入选择项(选择时间片轮转调度R);
三、输入进程名称和服务时间;
实验结果:
小结:
在这次试验中,主要掌握的是时间片轮转算法的执行过程,按照先来先服务原则,将进程排成一个队列,进程在所分配的时间片内运行的时候,修改自己的状态位,还有计数器加1操作,所需时间减1操作,时间片用完后,排在进程执行队列的尾部,处理机进行切换。在进程运行结束后打印周转时间。在最初实现算法的时候,没有添加计算周转时间的函数,后来通过在修改状态位的循环中添加计数器的累加语句,实现了在进程将状态位修改为“F”的时候系统输出周转时间。
源码:
#include
#include
#include
typedef struct node
时间片轮转进程调度实验报告
时间片轮转进程调度实验报告
实验目的
通过实验,掌握时间片轮转调度算法的原理和实现方法,了解进程调度的过程,掌握进程调度的基本要素和调度过程,并能够通过编程实现时间片轮转调度算法。
实验要求
1. 理解时间片轮转调度的基本原理;
2. 编程实现时间片轮转进程调度算法;
3. 运行程序,观察并分析进程的执行情况。
实验设备
计算机一台,支持多进程操作系统。
实验原理
时间片轮转调度算法是一种基于时间片的进程调度算法,主要应用于多道程序环境下。它的基本原理是将CPU的运行时间划分为一段段的时间片,在每个时间片结束时,如果进程还未完成,就将该进程挂起,将CPU分配给下一个进程执行。通过快速切换进程,使得每个进程都能平等地获得CPU时间。
实验过程
1. 定义进程控制块(PCB)的数据结构,包括进程的ID、优先级、状态、已执行时间等;
2. 定义进程队列的数据结构,使用循环队列实现,用于存储待调度的进程;
3. 初始化进程队列,将待调度的进程加入队列中;
4. 设置时间片大小;
5. 开始执行进程调度算法:
a) 从队列中取出一个进程,将其状态设置为运行状态;
b) 执行该进程,计算其已执行时间;
c) 如果已执行时间小于时间片大小,将进程重新加入队列;
d) 如果已执行时间等于时间片大小,将进程的状态设置为
挂起,并将其放回队列;
6. 重复步骤5,直到队列中所有进程都执行完毕。
实验结果
运行该程序,可以观察到进程按照时间片轮转调度算法依次执行,每个进程都能获得一段时间的CPU执行时间,保证了进
程执行的公平性。
实验总结
通过本次实验,我深入了解了时间片轮转调度算法的原理和实现方法。时间片轮转调度算法采用了循环队列的数据结构,通过设置时间片大小来控制进程的执行时间。该算法能够使进程获得公平的CPU时间,并且能够保证每个进程都能得到一定
操作系统综合性实验报告-进程调度(含代码)
第2 页
````````
( 3 )时间片轮转调度 void RoundRun() {
int flag = 1;
GetFirst();
while(run != NULL) {
Output();
while(flag) {
run->count++; run->cputime++; run->needtime--;
// 计数器清零,为下次做准备
InsertTime(run); flag = 0; } } flag = 1;
} }
GetFirst();
第3 页
````````
4. 流程图:
开始 界面显示
输入进程数目
进程信息输入并初始化 将进程插入就绪队列 设标志 flag=1
取就绪队列首节点
N Y
结束
Run!=null 输出各队列进程信息
XXXXXX 计算机系综合性实验 实验 报告
课程名称
操作系统 B
实验学期 XXXX
至 XXXX
学年 第 X
学期
学生所在系部
计算机系
年级 XXXX
专业班级
XXXXXX
学生姓名
XXXX
学号 XXXXXXXXXXXX
任课教师
XXX
实验成绩
操作系统原理与实践教程(第三版)第3章习题答案
第3章处理器管理
(1) 为什么程序并发执行会产生间断性特征,并失去封闭性和可再现性?
解:
之所以产生间断性特征是因为多个程序在并发执行时,需要为了完成同一项任务而相互合作,并发执行的程序间的这种相互制约导致了“暂停—执行—暂停”的间断性运行规律。
失去封闭性是因为程序在并发执行时,多个程序需要共享系统中的多种资源。所以,这些资源的状态是由多个程序改变的,从而使程序的运行失去了封闭性。
失去可再现性是因为程序在并发执行时,由于失去了封闭性,从而导致其失去可再现性。
(2) 什么是进程?为什么要在操作系统中引入进程?
解:
进程是可并发执行且具有独立功能的程序在一个数据集合上的运行过程,它是操作系统进行资源分配和调度的基本单位。“进程”概念是人们为了使程序能够并发执行,并且能对并发的程序加以描述和控制而引入的。
(3) 试从并发性、独立性、动态性上比较程序和进程的不同。
解:
●并发性是进程的重要特征,同时也是OS 的重要特征。引入进程的目的正是为了
使其程序能和其它进程的程序并发执行,而程序是不能并发执行的。
●独立性是指进程实体是一个能独立运行的基本单位,同时也是系统中独立获得资
源和独立调度的基本单位。而对于未建立任何进程的程序,都不能作为一个独立
的单位参加运行。
●动态性是进程最基本的特性,可表现为由创建而产生,由调度而执行,因得不到
资源而暂停执行,以及由撤销而消亡,因而进程有一定的生命期;而程序只是一
组有序指令的集合,是静态实体。
(4) 什么是PCB?它具有什么作用?为什么说PCB是进程存在的唯一标识?
实验一 时间片轮转进程调度算法
实验一时间片轮转进程调度算法
时间片轮转是一种常用的进程调度算法,它的基本思想是将CPU的使用时间分成若干个时间片,每个进程在一个时间片内运行一段时间。当一个时间片用完后,就将当前进程放入就绪队列的末尾,然后选择就绪队列中的下一个进程来执行。
下面是一个简单的时间片轮转算法的实验:
1. 首先,定义一个进程结构体,包括进程ID、执行时间、剩余时间等属性。
```c++
struct Process {
int id; // 进程ID
int executionTime; // 执行时间
int remainingTime; // 剩余时间
Process(int id, int executionTime) {
this->id = id;
this->executionTime = executionTime;
this->remainingTime = executionTime;
}
};
```
2. 定义一个就绪队列,用于存放所有待执行的进程。
```c++
queue<Process> readyQueue;
```
3. 定义一个时间片大小,例如设为1。
```c++
int timeSlice = 1;
```
4. 创建一些进程,并将它们加入就绪队列。
```c++
Process p1(1, 5);
Process p2(2, 3);
Process p3(3, 2);
Process p4(4, 4);
readyQueue.push(p1);
readyQueue.push(p2);
readyQueue.push(p3);
时间片轮转调度算法实验报告
******************************************** 测试数据2:
2 3 1
1 2 3
5 4 2
测试数据3:
【结论】(结果)
测试数据1的运行结果(截图):
测试数据2的运行结果:
测试数据3的运行结果:
源程序代码:
#include"stdio.h"
#include"stdlib.h" struct stud
{
错误分析:链表初始化排序过程中:指针p=Null时,不能执行q->arrive等命令;错误解决方法:
将while(q->arrive<p->arrive &&q)
{t=q;
q=q->next;}
改为:while(q&&q->arrive<p->arrive)
{t=q;
q=q->next;}
2、进程运行时间大于时间片时,程序进入死循环:
当进程所需时间等于时间片时,运行结果正确:
进程运行时间大于时间片时,程序进入死循环:
错误分析:
进程所需剩余时间计算错误;
错误修改:
即进入死循环。
当进程所需时间小于时间片时,应立即跳出进程就绪对列。错误修改:
在output()子函数中p->rest=p->rest-slice;
后面加上一个语句:
if(p->rest<0)
p->rest=0;
实验运行结果为:
实验的体会及收获:
通过这次试验,我对处理机的调度算法---基于时间片轮转调度算法思想有了更深的理解;另
外使我对链表的知识有了更深的理解,而且锻炼了我的思维能力,使我能更全面地思考问题,以后还需要多做些这方面的练习。
进程调度算法实验报告
实验报告
实验一:进程调度算法
一、实验目的
1.利用高级语言实现三种不同及进程调度算法:
短作业优先算法、时间片轮转调度算法和优先级调度算法。
2.通过实验理解有关进程控制块,进程队列等的概念。
二、实验原理
各调度算法思想:
1.先来先服务算法(FCFS):
按照进程进入就绪队列的先后次序来分配CPU,一旦一个进程占有CPU,就一直运行下去,知道该进程完成工作,才释放CPU。
2.时间片轮转算法:
系统将所有就绪进程按到达时间的先后次序排成一个队列,进程调度程序总是选择队列中的第一个进程执行,且仅能执行一个时间片,在使用完一个时间片后,即使进程并未完成其运行,也必须将CPU交给下一个进程;如果一个时间片未使用完就完成了该进程,则剩下的时间分配给下一个进程。
3.优先权调度算法;
在创建进程时就确定优先权,确定之后在整个程序运行期间不再改变,根据优先级排列,系统会把CPU分配给优先权最高的进程。
三、实验步骤、数据记录及处理
1、算法流程
抽象数据类型的定义:PCB块结构体类型
struct PCB
{
int name;
int arrivetime; //到达时间
int servicetime; //服务时间
//int starttime[max]; //开始时间
int finishtime; //完成/结束时间
int turntime; //周转时间
int average_turntime; //带权周转时间
int sign; //标志进程是否完成
int remain_time; //剩余时间
int priority; //优先级
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三:时间片轮转法完成进程调度
一、实验目的:
(1)加深对进程的理解
(2)理解进程控制块的结构
(3)理解进程运行的并发性
(4)掌握时间片轮转法进程调度算法
实验内容:
(1)建立进程控制块
(2)设计三个链队列,分别表示运行队列、就绪队列和完成队列
(3)用户输入进程标识符以及进程所需的时间,申请空间存放进程PCB言息。
(4)每一个时间片结束输出各进程的进程号,CPU时间(即已经占用的CPU时间),所需时间(即还需要的CPU时间),以及状态(即用W表示等待,R表示运行,F表示完成)
实验程序:
#include
#include
#include
typedef struct node
{
char name[10];/* 进程标识符*/ int prio;/* 进程优先数*/
int round;/* 进程时间轮转时间片*/
int cputime; /*进程占用CPU时间*/
int needtime; /* 进程到完成还要的时间*/
int count;/* 计数器*/
char state; /* 进程的状态*/
struct node *next; /* 链指针*/
}PCB;
PCB *finish,*ready,*tail,*run; // 队列指针
int N,t; // 进程数,时间片的大小
void firstin()
{
run二ready;//就绪队列头指针赋值给运行头指针
run->state='R'; //进程状态变为运行态
ready=ready->next; //就绪队列头指针后移到下一进程
}
void prt1(char a)// 输出标题函数
{
if(toupper(a)=='P')// 优先级法
\n");} printf("进程名占用CPU时间到完成还要的时间轮转时间片状态
void prt2(char a,PCB *q)〃进程PCB输出
if(toupper(a)=='P')// 优先级法的输出
printf("%4s %8d %12d %14d %8c\n",q->name,q->cputime,q->needtime,q->roun d,q->state);
}
void prt(char algo)// 输出函数二、
{
PCB *p;
prt1(algo);// 输出标题
if(run!=NULL)// 如果运行指针不空prt2(algo,run);// 输出当前正在运行的PCB p=ready;// 输出就绪队列PCB while(p!=NULL)
{
prt2(algo,p);
p=p->next;
}
p=finish;// 输出完成队列的PCB while(p!=NULL)
{
prt2(algo,p);
p=p->next;
}
getchar(); // 按住任意键继续
}
void insert(PCB *q)// 时间片轮转的插入算法
{
PCB *p1,*s,*r;
s=q;〃待插入的PCB指针
p仁ready;//就绪队列头指针
r=p1;//*r做pl的前驱指针
while(p1!=NULL)
if(p1->round<=s->round)
{
r=p1;
p1=p1->next;
}
if(r!=p1)
{
r->next=s;
s->next=p1;
else
{
s->next=p1;// 否则插入在就绪队列的头
ready=s;
}
}
void create(char alg)// 时间片轮转法创建链表进程PCB {
PCB *p;
int i,time;
char na[10];
ready=NULL;
finish=NULL;
run=NULL;
printf(" 输入进程名及其需要运行的时间(中间以空格隔开):\n");
for(i=1;i<=N;i++)
{
p=new PCB;
scanf("%s %d",&na,&time); strcpy(p->name,na);
p->cputime=0;
p->needtime=time;
p->state='W';// 进程的状态
p->round=0;
if(ready!=NULL)
insert(p);
else
{ p->next=ready; ready=p;
}
}
printf("************* 时间片轮转法进程调度过程*************\n");
prt(alg);
run=ready;
ready=ready->next;
run->state='R';
}
void timeslicecycle(char alg)〃时间片轮转法