Программа реализации распределения процессорного времени - 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);
}
}
}