一、 需求分析
说明程序设计的任务和目的,明确规定下述内容:
模拟时间片轮转算法,理解进程调度的策略
(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(); } }}