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