首页 > 编程知识 正文

实验二 时间片轮转RR进程调度算法

时间:2023-05-04 04:45:31 阅读:235090 作者:3806


一、  需求分析

说明程序设计的任务和目的,明确规定下述内容:

模拟时间片轮转算法,理解进程调度的策略

(1)    输入的形式和输入值的范围;

 输入时间片为大于0的整数

 已在程序中预置好进程信息

(2)    输出的形式;

 进程调度过程的文字描述

(3)    程序所能达到的功能;

 模拟时间片轮转算法

(4)    测试数据,包括正确的输入及其输出结果和含有错误的输入及其输出结果。

测试正确输入为1、4,理论上支持任何大于0的整数

错误输入为任何非大于0的整数或其他字符

二、  概要设计

说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。

Process类

   ArrivalTime

   ServiceTime

   FinishTime

   WholeTime

   WeightWholeTime

三、  详细设计

实现程序模块的具体算法。

    publicstaticList<Process> FCFS(List<Process> ProcessList)

四、  调试分析

(1)    调试过程中遇到的问题以及解决方法,设计与实现的回顾讨论和分析;

开始时使用面向过程编程,发现思路很拥堵,后来改用C#用面向对象的方式编写,将进程定义为一个类,进程排序全部封装到进程内部,主函数复用了实验1的代码即可实现实验要求

(2)经验和体会。

优先采用面向对象的编程方式

五、  用户使用说明

程序的使用说明,列出每一步的操作步骤。

运行程序---输入时间片大小-----查看运行结果

六、  测试结果

列出测试结果,包括输入和输出。



 

七、  附录

带注释的源程序,注释应清楚具体;


using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace Lab2{ class Process { public string ID; public int ArrivalTime, ServiceTime, FinishTime, ServiceTimeBak; public double WholeTime, WeightWholeTime; public Process(string id, int arrivalTime, int serviceTime) { this.ID = id; this.ArrivalTime = arrivalTime; this.ServiceTime = serviceTime; this.ServiceTimeBak = serviceTime; } public static double Get_AverageWT(List<Process> ProcessList) { double sum = 0; for (int i = 0; i < ProcessList.Count; i++) { sum += ProcessList[i].WholeTime; } return sum / ProcessList.Count; } public static double Get_AverageWWT(List<Process> ProcessList) { double sum = 0; for (int i = 0; i < ProcessList.Count; i++) { sum += ProcessList[i].WeightWholeTime; } return sum / ProcessList.Count; } //先来后到 public static List<Process> FCFS(List<Process> ProcessList) { for (int i = 0; i < ProcessList.Count; i++) { for (int j = i; j < ProcessList.Count; j++) { if (ProcessList[i].ArrivalTime > ProcessList[j].ArrivalTime) { Process temp = ProcessList[i]; ProcessList[i] = ProcessList[j]; ProcessList[j] = temp; } } } return ProcessList; } }; class Program { static void Main(string[] args) { Console.Write(" -----------------时间片轮转RR进程调度算法: n"); //初始化 未就绪队列 List<Process> NotReadyedProcessList = new List<Process>(); NotReadyedProcessList.Add(new Process("A", 0, 4)); NotReadyedProcessList.Add(new Process("B", 1, 3)); NotReadyedProcessList.Add(new Process("C", 2, 4)); NotReadyedProcessList.Add(new Process("D", 3, 2)); NotReadyedProcessList.Add(new Process("E", 4, 4)); //打印进程列表 Console.Write(" -------进程列表如下: n"); for (int i = 0; i < NotReadyedProcessList.Count;i++ ) { Console.Write("进程名: " + NotReadyedProcessList[i].ID + " 到达时间: " + NotReadyedProcessList[i].ArrivalTime+" 服务时间: " + NotReadyedProcessList[i].ServiceTime+"n"); } //排序 Process.FCFS(NotReadyedProcessList); //声明 已就绪队列 List<Process> ReadyedProcessList = new List<Process>(); //声明 已完成队列 List<Process> FinishedProcessList = new List<Process>(); Process tempProcess = null; //计时器 int time = 0; //时间片 int q = 1; Console.Write(" 输入时间片大小: "); q = Convert.ToInt32(Console.ReadLine()); //Console.Clear(); Console.Write(" 时间片为: " + q + "n"); //结束标志 bool IsFinished = false; while (!IsFinished) { //当处理完所有未就绪和已就绪进程时结束 if (NotReadyedProcessList.Count == 0 && ReadyedProcessList.Count == 0) { IsFinished = true; break; } //循环是否有进程到达 for (int a = 0; a < NotReadyedProcessList.Count; a++) { if (time >= NotReadyedProcessList[a].ArrivalTime) { Console.Write("n 当前时刻:" + time + " 进程" + NotReadyedProcessList[a].ID + "进入就绪状态 "); //新到的加入尾部 ReadyedProcessList.Add(NotReadyedProcessList[a]); NotReadyedProcessList.Remove(NotReadyedProcessList[a]); a--; } } //循环结束后加入已处理过的进程 if (tempProcess != null) { ReadyedProcessList.Add(tempProcess); } //处理队头就绪队列 if (ReadyedProcessList.Count > 0) { Console.WriteLine("n 当前时刻:" + time + " 进程" + ReadyedProcessList[0].ID + "正在运行"); if (q >= ReadyedProcessList[0].ServiceTime) { //时间片富足 //增加时钟 time += (int)ReadyedProcessList[0].ServiceTime; //计算周转时间和完成时间 ReadyedProcessList[0].FinishTime = time; ReadyedProcessList[0].WholeTime = ReadyedProcessList[0].FinishTime - ReadyedProcessList[0].ArrivalTime; ReadyedProcessList[0].WeightWholeTime = ReadyedProcessList[0].WholeTime / ReadyedProcessList[0].ServiceTimeBak; //移动该进程到完成队列 ReadyedProcessList[0].ServiceTime = 0; FinishedProcessList.Add(ReadyedProcessList[0]); ReadyedProcessList.RemoveAt(0); //将缓存清空 tempProcess = null; Console.Write("n 当前时刻:" + time + " 【结束】进程" + FinishedProcessList[FinishedProcessList.Count - 1].ID); Console.Write(" 周转时间:" + FinishedProcessList[FinishedProcessList.Count - 1].WholeTime); Console.Write(" 带权周转时间:" + FinishedProcessList[FinishedProcessList.Count - 1].WeightWholeTime); } else { //时间片不足 //增加时钟 time += q; //移动该进程到缓存 ReadyedProcessList[0].ServiceTime -= q; tempProcess = ReadyedProcessList[0]; ReadyedProcessList.Remove(tempProcess); } } else { //就绪队列无进程则空闲 //增加时钟 Console.WriteLine("n当前时刻:" + time + " 空闲状态"); time++; } } Console.Write("n运行结束!完成顺序为:"); foreach (var item in FinishedProcessList) { Console.Write(item.ID + " "); } Console.Write("n平均周转时间为:" + Process.Get_AverageWT(FinishedProcessList)); Console.WriteLine("n平均带全周转时间为:" + Process.Get_AverageWWT(FinishedProcessList)); Console.ReadLine(); } }}


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。