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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.5 из 5
Похожие ответы