我的大学之操作系统(三)

实验三

【实验题目】:高响应比优先调度和时间片轮转RR进程调度算法

【实验目的】
通过这次实验,加深对进程调度概念的理解,进一步掌握比FCFS和SJF更为复杂的进程调度算法的实现方法。

【实验内容及要求】
算法思路:
时间片轮转RR进程调度算法:用于分时系统中的进程调度。每次调度时,总是选择就绪队列的队首进程,让其在CPU上运行一个系统预先设置好的时间片。一个时间片内没有完成运行的进程,返回到绪队列末尾重新排队,等待下一次调度。
给每个进程固定的执行时间,根据进程到达的先后顺序让进程在单位时间片内执行,执行完成后便调度下一个进程执行,时间片轮转调度不考虑进程等待时间和执行时间,属于抢占式调度。优点是兼顾长短作业;缺点是平均等待时间较长,上下文切换较费时。适用于分时系统。
高响应比优先算法:①当等待时间相同时,短进程的优先权高;②当需要运行时间相同时,作业的优先权又取决于等待时间,相当于先到先服务;③长作业的优先级可以随着等待时间的增加而提高,因此长作业等待一段时间后仍能得到调度。
使用的公式:
完成时间 = 开始时间 + 需要运行时间
周转时间 = 完成时间 - 到达时间
带权周转时间 = 周转时间 / 需要运行时间
等待时间 = 当前时间 - 到达时间
优先权 = (等待时间 + 需要运行时间) / 需要运行时间
问题描述:
设计程序模拟进程的高响应比优先调度和时间片轮转RR调度过程。假设有n个进程分别在T1, … ,Tn时刻到达系统,它们需要的服务时间分别为S1, … ,Sn。如果选择RR算法,则需要指定时间片大小q,采用时间片轮转RR进程调度算法进行调度,如果选择高响应比优先调度算法,则可以直接调度,计算每个进程的完成时间,周转时间和带权周转时间,并且统计n个进程的平均周转时间和平均带权周转时间。
程序要求如下:
1)进程个数n;每个进程的到达时间T1, … ,Tn和服务时间S1, … ,Sn;如果选择时间片轮转法,则要输入时间片大小q。
2)要求高响应比优先和时间片轮转法RR调度进程运行,计算每个进程的周转时间,带权周转时间,并且计算所有进程的平均周转时间,带权平均周转时间;
3)输出:要求模拟整个调度过程,输出每个时刻的进程运行状态,如“时刻3:进程B开始运行”等等;
4)输出:要求输出计算出来的每个进程的周转时间,带权周转时间,所有进程的平均周转时间,带权平均周转时间。
【流程图】
在这里插入图片描述

【实验结果】
核心代码:
时间片轮转RR进程调度:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

高响应比优先调度:
在这里插入图片描述

可读文本文件:

在这里插入图片描述

实验结果截图:
时间片轮转RR进程调度:
在这里插入图片描述

高响应比优先调度:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

【源代码】

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <queue>
#include <iomanip>
#include <fstream>
using namespace std;
#define WAIT "Wait"//就绪状态 
#define RUN "Run"//运行状态 
#define FINISH "Finish"//完成状态 
#define JOBNUMBER 5 //设置进程测试数为5  

//存放每个进程信息的结构体
typedef struct{
   
   
    char name;//进程名字
    int ArrivalTime;//到达时间
    int ServiceTime;//服务时间
    int FinishedTime;//完成时间
    int WholeTime;//周转时间
    double WeightWholeTime;//带权周转时间
}RR;
 
static queue<RR>RRqueue;  //用来模拟进程执行RR调度算法的队列
static double SumWT=0,SumWWT=0,AverageWT =0,AverageWWT=0;//平均周转时间、平均带权周转时间
static int q;  //时间片数
static int n;  //进程个数
static RR RRarray[100];  //进程结构体
static RR temp;  //进程结构
 
void Enter();//输入时间片、到达时间、服务时间等
void RRfunction();//执行RR调度算法
void display();//显示各时间执行情况,以及各个时间值
 
//输入时间片、到达时间、服务时间等
void Enter(){
   
   
    int i,j;
    cout<<"Enter n: ";
    cin>>n;
    cout<<"Enter TimeSlice q: ";
    cin>>q;
 
    for (i=0;i<n;i++){
   
   
      RRarray[i].name=i+65;//自动将进程名字顺序编号为A、B、C、D、E等
    }
 
    cout<<"Enter ArrivalTime: ";
    for (i=0;i<n;i++){
   
   
      cin>>RRarray[i].ArrivalTime;
    }
 
    cout<<"Enter ServiceTime: ";
    for (i=0;i<n;i++){
   
   
      cin>>RRarray[i].ServiceTime;
    }
 
    //根据达时间排序
    for(i=0;i<n;i++) {
   
   
        for(j=i+1;j<n;j++) {
   
   
            if(RRarray[i].ArrivalTime > RRarray[j].ArrivalTime) {
   
   
                temp = RRarray[i];
                RRarray[i] = RRarray[j];
                RRarray[j] = temp;
            }
        }
    }
}
 
//执行RR调度算法
void RRfunction(){
   
   
    char Moment[100];   //存储每个时间片p对应的进程名称
    RRqueue.push(RRarray[0]);   //第一个进程进队列
 
    int MomentPoint = 0;
    int CurrentTime=0;
    int tempTime;   //控制CurrentTime的累加时间,当前进程的服务时间小于时间片q的时候,起到重要作用
    int i=1,j;  //指向还未处理的进程的下标
    int finalNumber = 0;   //执行RR算法后,进程的个数
    int Time[50];
    bool canAdd=false;//用于解决CurrentTime在第一个进程完成计算时多加了一次服务时间的问题
 
    //判断第一个进程的服务时间是否大于时间片,如果大于CurrentTime=q,如果小于CurrentTime=服务时间
    if (RRarray[0].ServiceTime>=q)
        CurrentTime = q;
    else
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值