Программа реализации распределения процессорного времени - C#
Формулировка задачи:
Приветствую. Нужно решить абстрактную задачу по распределению процессорного времени. Наткнулся на старую тему на форуме, но там так и не доведено все до ума, а ошибки не знаю как исправить. К тому же нету всего кода что бы разобраться в нем.
Ссылка на старую тему :
Стек и очередь.
Решение задачи: «Программа реализации распределения процессорного времени»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Threading; namespace ConsoleApplication193 { class Program { static void Main(string[] args) { //создаем var gen = new TaskGenerator(); var p1 = new Processor(); var p2 = new Processor(); //задаем схему движения задач gen.TaskCreated += delegate { p1.AddTask(gen.CurrentTask);}; p1.TaskCompleted += delegate{ gen.InitRandomProcessingTime(p1.CurrentTask); p2.AddTask(p1.CurrentTask); }; //запускаем систему while(true) { //обновляем сосотяние системы p2.Update(); p1.Update(); gen.Update(); //отображаем состояние системы Show(p1, p2); //задержка Thread.Sleep(500); } } private static void Show(params Processor[] procList) { Console.Clear(); for(int i=0;i<procList.Length;i++) { var p = procList[i]; Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("Processor {0}\r\n", i +1); Console.ForegroundColor = ConsoleColor.Gray; Console.WriteLine("Current load: {0}%", p.CurrentTask == null ? 0 : 100); Console.WriteLine("High Priority Queue: {0}", p.HighPriorityTasks.Count); Console.WriteLine("Low Priority Queue: {0}", p.LowPriorityTasks.Count); Console.WriteLine("Awaiting: {0}", p.Awaiting.Count); Console.WriteLine("Completed: {0}", p.Completed); Console.WriteLine(); } } } class Task { public int TimeToProcessing = 10; public int Priority = 1; } class Processor { public Stack<Task> Awaiting = new Stack<Task>(); public Queue<Task> HighPriorityTasks = new Queue<Task>(); public Queue<Task> LowPriorityTasks = new Queue<Task>(); public Task CurrentTask { get; private set; } public int Completed { get; private set; } public event EventHandler TaskCompleted = delegate { }; public void AddTask(Task task) { if (task.Priority == 1) HighPriorityTasks.Enqueue(task); else LowPriorityTasks.Enqueue(task); } public void Update() { if(CurrentTask != null) { CurrentTask.TimeToProcessing--; if(CurrentTask.TimeToProcessing <= 0) { //задача выполнена TaskCompleted(this, EventArgs.Empty); Completed++; CurrentTask = null; } } if (CurrentTask != null && CurrentTask.Priority == 1) return;//продолжаем обрабатывать задачу высшего приоритета if(HighPriorityTasks.Count > 0) { //начинаем выполнять задачу высшего приоритета StartProcessTask(HighPriorityTasks.Dequeue()); return; } if(CurrentTask == null) { //начинаем выполнять отложенную задачу if (Awaiting.Count > 0) StartProcessTask(Awaiting.Pop()); else if(LowPriorityTasks.Count > 0) StartProcessTask(LowPriorityTasks.Dequeue());//выполняем задачу нисшего приоритета } } void StartProcessTask(Task task) { if (CurrentTask != null) Awaiting.Push(CurrentTask);//вытесяняем в стек CurrentTask = task; } } class TaskGenerator { private Random rnd = new Random(); public event EventHandler TaskCreated = delegate { }; public Task CurrentTask { get; private set; } public void Update() { if(rnd.Next(1, 11) == 1) { CurrentTask = new Task(){Priority = rnd.Next(1, 3)}; InitRandomProcessingTime(CurrentTask); TaskCreated(this, EventArgs.Empty); } } public void InitRandomProcessingTime(Task task) { task.TimeToProcessing = rnd.Next(5, 16); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д