淘小兔

一、  需求分析

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

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

(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)经验和体会。

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

五、  用户使用说明

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

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

六、  测试结果

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

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

 

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

 

七、  附录

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

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();        }    }}

 

下载仅供下载体验和测试学习,不得商用和正当使用。

下载体验

请输入密码查看内容!

如何获取密码?

 

点击下载