时间片轮转进程调度模拟算法的实现

合集下载

实验二带优先级的时间片轮换的进程调度算法的实现

实验二带优先级的时间片轮换的进程调度算法的实现


struct pcb *p;

for (i=0;i<MAXPIOR;i++)

{p=array[i];

while (p!=NULL)

{printf("id:%d,state:%d,pior:%d,life:%d\n",p->ident,p->state,p->pior,p->life);

p=p->next;
• {int i=0,ii=0;
• for (i=0;i<7;i++)

if (stricmp(str,command[i])==0)

break;
• switch(i)

{case 0:printf("thank you for using the program!\n");exit(0);

break;
•{

int i=MAXPIOR-1,pior=0,t;

struct pcb *pp,*qq,*pr,*r;

do

{

while (i>=0 && array[i]==NUf (i<0)

{

printf("NO process,please create it! \n");
第1个,再降低其优先级,插入到相应的队列中。 C)ps 查看当前进程状态 D)sleep 命令将进程挂起 E)awake 命令唤醒1个被挂起的进程 F)kill 命令杀死进程 G)quit命令退出 (4)选用面向对象的编程方法。

进程调度算法实验报告

进程调度算法实验报告

进程调度算法实验报告进程调度算法实验报告一、引言进程调度算法是操作系统中的重要组成部分,它决定了进程在CPU上的执行顺序。

合理的进程调度算法能够提高系统的性能和效率,使得多个进程能够公平地共享CPU资源。

本实验旨在通过实际操作和数据分析,探究不同的进程调度算法对系统性能的影响。

二、实验方法1. 实验环境本次实验使用了一台配置较高的计算机作为实验环境,操作系统为Windows 10。

实验中使用了C语言编写的模拟进程调度程序。

2. 实验步骤(1)编写模拟进程调度程序,实现常见的进程调度算法,包括先来先服务(FCFS)、最短作业优先(SJF)、时间片轮转(RR)和优先级调度(Priority)。

(2)设计一组测试用例,包括不同执行时间的进程和不同优先级的进程。

(3)运行模拟进程调度程序,记录每个进程的等待时间、周转时间和响应时间。

(4)根据实验结果分析不同进程调度算法的性能差异。

三、实验结果与分析1. 先来先服务(FCFS)调度算法先来先服务调度算法按照进程到达的先后顺序进行调度,即先到达的进程先执行。

实验结果显示,该算法对于执行时间较短的进程表现良好,但对于执行时间较长的进程则存在明显的不公平性。

长作业的等待时间较长,导致整体执行效率较低。

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

实验结果显示,该算法能够最大程度地减少平均等待时间和周转时间,提高系统的执行效率。

然而,该算法对于执行时间较长的进程存在饥饿问题,即长作业可能一直等待短作业的执行,导致长作业的等待时间过长。

3. 时间片轮转(RR)调度算法时间片轮转调度算法将CPU的执行时间划分为固定长度的时间片,每个进程按照轮流执行的方式进行调度。

实验结果显示,该算法能够保证每个进程都能够获得一定的执行时间,提高了系统的公平性。

然而,对于执行时间较长的进程而言,由于需要等待其他进程的轮转,其执行效率相对较低。

操作系统实验二报告-时间片轮转进程调度算法1

操作系统实验二报告-时间片轮转进程调度算法1

操作系统实验报告实验二时间片轮转进程调度算法学号:班级:姓名:【实验题目】: 时间片轮转进程调度算法【实验目的】通过这次实验, 加深对进程概念的理解, 进一步掌握进程状态的转变、进程调度的策略与对系统性能的评价方法。

【实验内容】问题描述:设计程序模拟进程的时间片轮转RR 调度过程。

假设有n 个进程分别在T1, … ,Tn 时刻到达系统, 它们需要的服务时间分别为S1, … ,Sn 。

分别利用不同的时间片大小q, 采用时间片轮转RR 进程调度算法进行调度, 计算每个进程的完成时间, 周转时间和带权周转时间, 并且统计n 个进程的平均周转时间和平均带权周转时间。

程序要求如下:1)进程个数n ;每个进程的到达时间T 1, … ,T n 和服务时间S 1, … ,S n ;输入时间片大小q 。

2)要求时间片轮转法RR 调度进程运行, 计算每个进程的周转时间, 带权周转时间, 并且计算所有进程的平均周转时间, 带权平均周转时间;3)输出: 要求模拟整个调度过程, 输出每个时刻的进程运行状态, 如“时刻3: 进程B开始运行”等等;4)输出:要求输出计算出来的每个进程的周转时间, 带权周转时间, 所有进程的平均周转时间, 带权平均周转时间。

实现提示:用C++语言实现提示:1)程序中进程调度时间变量描述如下:int ArrivalTime[100];int ServiceTime[100];int PServiceTime[100];int FinishTime[100];int WholeTime[100];double WeightWholeTime[100];double AverageWT,AverageWWT;bool Finished[100];➢2)进程调度的实现过程如下:➢变量初始化;➢接收用户输入n, T1, … ,Tn, S1, … ,Sn;时间片大小q;➢按照时间片轮转RR算法进行进程调度, 计算进程的完成时间、周转时间和带权周转时间;➢计算所有进程的平均周转时间和平均带权周转时间;➢按格式输出调度结果。

时间片轮转调度算法实验

时间片轮转调度算法实验

时间片轮转调度算法实验时间片轮转调度算法是一种基于时间片轮转的进程调度算法,它按照轮转的方式,将每个进程分配一个时间片,如果该进程在时间片结束前未完成其任务,则该进程将被挂起,然后下一个进程继续执行。

下面将从实验过程、结果分析和算法优缺点三个方面回答该问题。

实验过程:本次实验使用C语言编写程序,模拟了一个简单的时间片轮转调度算法。

实验环境为Windows 10操作系统,使用了Dev-C++ 5.11编译器。

实验流程如下:1.首先定义了一个进程的结构体,其中包括了进程的名称、进程需要执行的时间片以及已经执行的时间片。

2.定义一个队列来存储进程,为了方便起见,队列采用了循环存储结构。

3.在主函数中,首先输入需要执行的进程数和一个时间片长度,接着依次输入每个进程的名称和需要执行的时间。

程序会根据输入的信息初始化进程,并将进程加入队列。

4.最后,程序开始模拟调度器的调度过程。

每次从队列中取出一个进程,将其执行时间减去一个时间片。

如果执行时间为0,则代表该进程已经完成任务,将其移出队列。

如果执行时间大于0,则将该进程重新加入队列尾部,然后下一个进程开始执行。

结果分析:在进行实验的过程中,我们发现时间片轮转调度算法可以很好地实现多进程的调度。

通过不断地轮转时间片,每个进程都有机会被执行。

此外,该算法具有良好的响应时间和公平性,能够确保每个进程都能够在一定时间内执行一定的任务,从而提高了系统的利用率和效率。

算法优缺点:时间片轮转调度算法具有以下几个优点:1. 公平性:每个进程都能够在一定时间内获得相同的可执行时间。

2. 可控性:时间片长度可以根据需要自行改变。

3. 高效性:可以很好地支持多进程的调度,提高了系统的利用率和效率。

同时,该算法也存在一些缺点:1.时间片的长度可能对进程的执行效率产生影响,长度过长会导致进程轮转过于缓慢,降低了系统的响应速度,长度过短则会增加进程上下文切换的次数。

2. 由于算法本身的局限性,它可能无法解决一些与进程先后顺序等有关的问题,例如死锁或者资源争用等。

用c语言实现时间片轮转调度算法

用c语言实现时间片轮转调度算法

用c语言实现时间片轮转调度算法时间片轮转调度算法是一种常见的进程调度算法,其主要思想是将所有就绪进程按顺序排列,每个进程分配一个时间片,当时间片用尽后,进程被送到队列的末尾,然后下一个进程被执行。

本文将介绍如何使用C语言实现时间片轮转调度算法。

首先,我们需要定义进程控制块(PCB),包括进程的ID、状态、优先级和时间片等信息。

可以使用结构体来表示PCB,代码如下:```typedef struct PCB {int pid; // 进程IDint status; // 进程状态(就绪、运行、等待、结束) int priority; // 进程优先级int time_slice; // 时间片} PCB;```接下来,我们需要创建一个就绪队列和一个等待队列来存储所有进程。

可以使用链表来实现队列,代码如下:```typedef struct Node {PCB *pcb; // PCB指针struct Node *next; // 指向下一个节点的指针} Node;// 就绪队列Node *ready_queue = NULL;// 等待队列Node *wait_queue = NULL;```然后,我们需要编写一个函数来创建进程并添加到就绪队列中。

该函数接受进程的ID、优先级和时间片作为参数,并返回一个指向新进程PCB的指针。

代码如下:```PCB *create_process(int pid, int priority, int time_slice) {PCB *pcb = (PCB*)malloc(sizeof(PCB));pcb->pid = pid;pcb->status = 0; // 就绪状态pcb->priority = priority;pcb->time_slice = time_slice;// 将新进程添加到就绪队列末尾Node *p = (Node*)malloc(sizeof(Node));p->pcb = pcb;p->next = NULL;if (ready_queue == NULL) {ready_queue = p;} else {Node *q = ready_queue;while (q->next != NULL) {q = q->next;}q->next = p;}return pcb;}```接下来,我们需要编写一个函数来模拟时间片轮转调度算法。

实验进程调度的实验报告

实验进程调度的实验报告

一、实验目的1. 加深对进程概念和进程调度算法的理解。

2. 掌握进程调度算法的基本原理和实现方法。

3. 培养编程能力和系统分析能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019三、实验内容1. 实现进程调度算法2. 创建进程控制块(PCB)3. 模拟进程调度过程四、实验原理进程调度是操作系统核心功能之一,负责将CPU分配给就绪队列中的进程。

常见的进程调度算法有先来先服务(FCFS)、短作业优先(SJF)、优先级调度、时间片轮转(RR)等。

1. 先来先服务(FCFS)算法:按照进程到达就绪队列的顺序进行调度。

2. 短作业优先(SJF)算法:优先调度运行时间最短的进程。

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

4. 时间片轮转(RR)算法:每个进程分配一个时间片,按顺序轮流执行,时间片结束后进行调度。

五、实验步骤1. 定义进程控制块(PCB)结构体,包含进程名、到达时间、运行时间、优先级、状态等信息。

2. 创建进程队列,用于存储就绪队列、等待队列和完成队列。

3. 实现进程调度算法:a. FCFS算法:按照进程到达就绪队列的顺序进行调度。

b. SJF算法:优先调度运行时间最短的进程。

c. 优先级调度算法:根据进程的优先级进行调度。

d. 时间片轮转(RR)算法:每个进程分配一个时间片,按顺序轮流执行。

4. 模拟进程调度过程:a. 初始化进程队列,将进程添加到就绪队列。

b. 循环执行调度算法,将CPU分配给就绪队列中的进程。

c. 更新进程状态,统计进程执行时间、等待时间等指标。

d. 当进程完成时,将其移至完成队列。

六、实验结果与分析1. FCFS算法:按照进程到达就绪队列的顺序进行调度,简单易实现,但可能导致短作业等待时间过长。

2. SJF算法:优先调度运行时间最短的进程,能提高系统吞吐量,但可能导致进程饥饿。

进程的调度实验报告(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("无效的调度算法选择。

时间片轮转调度算法实验报告

时间片轮转调度算法实验报告

时间片轮转调度算法实验报告一、引言时间片轮转调度算法是一种常见的操作系统调度算法,它的主要思想是将CPU时间分成若干个时间片,每个进程在一个时间片内执行一定的时间,然后切换到下一个进程执行。

本实验通过使用C语言模拟实现时间片轮转调度算法,并对其进行评估和比较,以便更好地理解该调度算法的性能和特点。

二、实验目的1.理解时间片轮转调度算法的原理和实现方式;2.实现一个简单的时间片轮转调度算法模拟程序;3.比较时间片长度对调度算法性能的影响;4.分析时间片轮转调度算法的优缺点。

三、实验过程1.设计数据结构和算法在开始实验之前,我们首先需要设计数据结构和算法。

在本实验中,我们使用一个队列来表示就绪队列,并使用一个指针来标记当前执行的进程。

2.实现时间片轮转调度算法模拟程序根据设计的数据结构和算法,我们使用C语言编写了一个简单的时间片轮转调度算法模拟程序。

程序首先会要求用户输入进程数量和每个进程的执行时间,然后根据输入的信息,使用时间片轮转调度算法对进程进行调度并统计各个进程的等待时间和周转时间。

3.进行实验和分析我们进行了多组实验,通过改变时间片的长度,观察时间片轮转调度算法的性能。

并对实验结果进行统计和分析,比较不同时间片长度下的平均等待时间和平均周转时间。

四、实验结果和分析在本节,我们将介绍实验的结果和分析。

1.实验结果我们使用不同时间片长度进行了多组实验,得到了如下的结果:时间片长度,平均等待时间,平均周转时间------------,-------------,-------------1,5,152,3,134,2,128,1,112.结果分析通过对实验结果的分析,我们可以得出以下结论:-随着时间片长度的增加,进程的平均等待时间和平均周转时间都呈现下降的趋势。

这是因为时间片越长,每个进程执行的时间就越长,进程切换的次数就越少,从而提高了系统的效率。

-当时间片长度较小时,进程的平均等待时间和平均周转时间较长。

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

武汉理工大学华夏学院课程设计报告书课程名称:操作系统原理题目:时间片轮转进程调度模拟算法的实现系名:信息工程系专业班级:计算机1132班*名:**学号: *********** ****: ***2015年 6 月 26日武汉理工大学华夏学院信息工程系课程设计任务书课程名称:操作系统原理课程设计指导教师:司晓梅班级名称:计算机1131-2 开课系、教研室:自动化与计算机一、课程设计目的与任务操作系统课程设计是《操作系统原理》课程的后续实践课程,旨在通过一周的实践训练,加深学生对理论课程中操作系统概念,原理和方法的理解,加强学生综合运用操作系统原理、Linux系统、C语言程序设计技术进行实际问题处理的能力,进一步提高学生进行分析问题和解决问题的能力,包含系统分析、系统设计、系统实现和系统测试的能力。

学生将在指导老师的指导下,完成从需求分析,系统设计,编码到测试的全过程。

二、课程设计的内容与基本要求1、课程设计题目时间片轮转进程调度模拟算法的实现2、课程设计内容用c/c++语言实现时间片轮转的进程调度模拟算法。

要求:1.至少要有5个以上进程2.进程被调度占有CPU后,打印出该进程正在运行的相关信息提示:时间片轮转调度算法中,进程调度程序总是选择就绪队列中的第一个进程,也就是说按照先来先服务原则调度,但一旦进程占用处理机则仅使用一个时间片。

在使用完一个时间片后,进程还没有完成其运行,它必须释放出处理机给下一个就绪的进程,而被抢占的进程返回到就绪队列的末尾重新排队等待再次运行。

1)进程运行时,只打印出相关提示信息,同时将它已经运行的时间片加1就可以了。

2)为进程设计出PCB结构。

PCB结构所包含的内容,有进程名、进程所需运行时间、已运行时间和进程的状态以及指针的信息等。

3、设计报告撰写格式要求:1设计题目与要求 2 设计思想3系统结构 4 数据结构的说明和模块的算法流程图5 使用说明书(即用户手册):内容包含如何登录、退出、读、写等操作说明6 运行结果和结果分析(其中包括实验的检查结果、程序的运行情况)7 自我评价与总结 8 附录:程序清单,注意加注释(包括关键字、方法、变量等),在每个模块前加注释;三、课程设计步骤及时间进度和场地安排本课程设计将安排在第17周, 现代教育技术中心。

具体安排如下:课程设计集中时间安排:四、课程设计考核及评分标准课程设计考核将综合考虑学生的系统设计方案、运行结果、课程设计报告书的质量、态度、考勤、答辩情况等各因素。

具体评分标准如下:(1)设计方案正确,具有可行性、创新性; 30分(2)系统开发效果较好; 20分(3)设计报告规范、课程设计报告质量高、参考文献充分 20分(4)课程设计答辩时,问题回答正确; 20分(5)态度认真、刻苦钻研、遵守纪律; 10分按上述五项分别记分后求和,总分按五级制记载最后成绩。

优秀(100~90分),良好(80~89分),中等(70~79分),及格(60~69分),不及格(0~59分)一、设计题目与要求:进程时间片轮转调度算法。

要求:用C++语言编写程序完成单处理机的进程调度,要求采用时间片轮转调度算法。

实验具体要求包括:首先确定作业控制块的内容和组成方式;然后完成作业调度;最后编写主函数,并对所做工作进行测试。

二、设计思想:在多道程序系统中,一个作业被提交后必须经过处理机调度后,方能获得处理机执行。

对调度的处理又都可采用不同的调度方式和调度算法。

调度算法是指:根据系统的资源分配策略所规定的资源分配算法。

三、系统结构处理机管理模拟系统由创建进程、运行程序和显示结果三部分组成。

而它们又分别包括输入进程信息、创建结点和插入结点三个步骤。

系统功能说明:创建进程模块在输入进程页面输入要创建的进程数,输入后逐个将进程信息录入插入到就绪队列中,完成进程的创建过程。

运行程序模块:此模块实现时间片轮转调度算法,从就绪队列中取出进程结点,并模拟运行该进程,反复循环,直至进程全部运行结束。

每次运行进程后,将运行信息存入到文件中,实现信息的持久化。

方便信息的记录,系统功能的分析和出错时便于检查错误。

现实结果模块:从文件读入进程运行的结果,在图形界面下操作,提供友好的用户操作方式,方便直观了解进程呢过的调度过程,便于数据的分析和研究。

算法描述:1、在创建进程界面将进程信息录入,将进程控制块进行包装,插入到循环队列中;2、当运行程序时,每次从就绪队列队首取出一个进程,判断是P进程是否到达。

到达则运行该进程;3、若P进程为首次运行,则记录进程开始运行时间;4、运行完P进程后,输入进程运行信息,并将此进程移动至队尾;5、若循环队列长度大于1,则返回执行B,否则结束程序。

四、数据结构的说明和模块的算法流程图typedef struct jcb{char name[N];int prio;int round;int cputime;int needtime;int count;char state;struct node *next;}PCB图1流程图五、使用说明(1)建立一个进程控制块PCB来代表。

PCB包括:进程名、链接指针、到达时间、估计运行时间、剩余时间和进程状态。

进程状态分为就绪(W)、运行(R)和完成(F)。

(2)为每个进程任意确定一个要求运行时间和到达时间。

(3)按照进程到达的先后顺序排成一个循环队列。

再设一个对首指针指向第一个到达进程的首址。

(4)执行处理机调度时,开始选择对首的第一个进程运行。

另外再设一个当前运行进程的指针,指向当前正运行的进程。

(5)执行:a)预计运行时间减1;b)输出当前运行进程的名字。

(6)进程执行一次后,若该进程的剩余运行时间为零,则将该进程的状态置为完成态F,并退出循环队列;若不为空,则将其移至队尾。

继续在运行队首的进程。

(7)若就绪队列不空,则重复上述的(5)和(6)步骤直到所有进程都运行完为止。

在所设计的调度程序中,要求包含显示或打印语句。

以便显示或打印每次选操作系统课程设计中进程的名称及运行一次后队列的变化情况。

六、运行结果1、输入数据图2 输入数据2、运行结果示例(1)数据输入完成后的初始状态,进程标识为x1的进程首先得到调度,运行10个时间单位。

图3运行结果1(2)进程标识为x2的进程得到调度,从就绪态“W”改为运行态“R”,运行10个时间单位。

图4运行结果2(3)进程标识为x3的进程得到调度,从就绪态“W”改为运行态“R”,运行10个时间单位。

图5运行结果3(4)进程标识为x4的进程得到调度,从就绪态“W”改为运行态“R”,运行10个时间单位。

图6运行结果4(5)进程标识为x5的进程得到调度,从就绪态“W”改为运行态“R”,运行10个时间单位。

图7运行结果5(6)进程标识为x1的进程再次得到调度,从就绪态“W”改为运行态“R”,因进程x1只剩下5个单位时间,所以进程x1只运行5个单位时间。

图8运行结果6(7)进程标识为x2的进程得到调度,从就绪态“W”改为运行态“R”,运行10个时间单位。

进程x1已运行完,从运行态“R”改为运行结束状态“F”。

图9运行结果7(8)进程标识为x3的进程得到调度,从就绪态“W”改为运行态“R”,运行10个时间单位。

图10运行结果8(9)进程标识为x4的进程得到调度,从就绪态“W”改为运行态“R”,运行10个时间单位。

图11运行结果9(10)进程标识为x5的进程得到调度,从就绪态“W”改为运行态“R”,运行10个时间单位。

图12运行结果10(11)进程标识为x2的进程得到调度,从就绪态“W”改为运行态“R”,运行5个时间单位。

进程x5已运行完,从运行态“R”改为运行结束状态“F”。

图13运行结果11(12)进程标识为x3的进程得到调度,从就绪态“W”改为运行态“R”,运行10个时间单位。

进程x2已运行完,从运行态“R”改为运行结束状态“F”。

图14运行结果12(13)进程标识为x4的进程得到调度,从就绪态“W”改为运行态“R”,运行10个时间单位。

图15运行结果13(14)进程标识为x3的进程得到调度,从就绪态“W”改为运行态“R”,运行5个时间单位。

进程x4已运行完,从运行态“R”改为运行结束状态“F”。

图16运行结果14(15)所有进程都已运行完,状态都为“F”。

图17运行结果15七、小结在这次实验中,我能够正确分析实验过程和实验结果,思路清晰,能够比较好的理解进程按时间片轮转算法这一调度过程,加深了我对进程时间片轮转调度过程的理解。

但是还有很多不足。

我自己的C++基础差,不能够自己编写这一调度算法的程序,只能通过网络和同学、老师的帮忙得到正确的程序编码;另外一开始输入进程运行需要的时间时,由于输入运行时间的数值较大,导致后面进程繁多,但后来及时改正,走了弯路,也增加了理解。

因此以后要加强自己在C++方面的学习,能够理解源程序;并且要多上机操作,多调试多尝试,争取能理解好了解透。

本次实验题需要详细阅读题目和不断地尝试才能找到简便的过程,能加强学生的上机操作能力。

八、参考源程序#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream.h>typedef struct node{char name[10];int prio;int round;int cputime;int needtime;int count;char state;struct node *next;}PCB;PCB *finish,*ready,*tail,*run; //队列指针int N; //进程数void firstin(){run=ready; //就绪队列头指针赋值给运行头指针run->state='R'; //进程状态变为运行态]ready=ready->next; //就绪队列头指针后移到下一进程}//输出标题函数void prt1(char a){if(toupper(a)=='P') //优先级法cout<<" "<<endl;cout<<"进程名占用CPU时间到完成还要的时间轮转时间片状态"<<endl;}//进程PCB输出void prt2(char a,PCB *q){if(toupper(a)=='P') //优先级法的输出cout<<q->name<<" "<<q->cputime<<" "<<q->needtime<<" "<<q->round<<" "<<q->state<<endl;}//输出函数void prt(char algo){PCB *p;prt1(algo); //输出标题if(run!=NULL) //如果运行指针不空prt2(algo,run); //输出当前正在运行的PCBp=ready; //输出就绪队列PCBwhile(p!=NULL){prt2(algo,p);p=p->next;}p=finish; //输出完成队列的PCBwhile(p!=NULL)prt2(algo,p);p=p->next;}getchar(); //按住任意键继续}//时间片轮转的插入算法void insert(PCB *q){PCB *p1,*s,*r;s=q; //待插入的PCB指针p1=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 *p;int i,time;char na[10];ready=NULL;finish=NULL;run=NULL;cout<<"输入进程名及其需要运行的时间:"<<endl; for(i=1;i<=N;i++){p=new PCB;cin>>na;cin>>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;}cout<<"输入进程名及其需要运行的时间:"<<endl; }prt(alg);run=ready;ready=ready->next;run->state='R';}void timeslicecycle(char alg){while(run!=NULL){run->cputime=run->cputime+10;run->needtime=run->needtime-10;run->round=run->round+10;if(run->needtime<=0){run->next=finish;finish=run;run->state='F';run=NULL;if(ready!=NULL)firstin();}else{run->state='W';insert(run);firstin();}prt(alg);}}//主函数void main(){char algo='P'; //算法标记cout<<"输入进程的个数:"; cin>>N; //输入进程数create(algo); //创建进程timeslicecycle(algo); //优先级法调度} //main()。

相关文档
最新文档