Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архив2 / курсовая docx200 / Rubaev_Erik_MM-11-1_kursovaya_rabota_po_OS.docx
Скачиваний:
49
Добавлен:
07.08.2013
Размер:
111.88 Кб
Скачать
  1. Описание программы

    1. Формулировка задания

Разработать программу, моделирующую обслуживание множества вычислительных процессов в системе с 4 очередями, определяемыми значениями приоритетов.

    1. Описание алгоритма

В первую очередь попадают процессы со значениями приоритетов от 1 до 5, во вторую – от 6 до 10, в третью – от 11 до 15 и последнюю (четвертую) – от 16 до 20. В системе не могут появиться процессы с приоритетами большими 20 и меньшими 1. Все процессы без прерывания обслуживаются одним устройством. Определено следующее правило выбора очередного процесса. Сначала поочередно (в порядке поступления) обрабатываются все процессы из четвертой очереди. Заметим, что они имеют наивысший приоритет. Если в этой очереди нет процессов, то обрабатываются процессы из третей очереди. Их приоритет больше, чем у процессов первой и второй очереди, но меньше чем у четвертой. Они обрабатываются, так же как и остальные процессы из одной очереди, в порядке поступления. Если третья и четвертая очереди пусты, то выполняются процессы второй очереди. И, наконец, когда в системе не обработаны процессы только из перовой очереди, то выполняются они.

Исходные данные: поток заявок на выполнение процессов (имя заявки, время поступления, приоритет, время исполнения).

Пример набора исходных данных и результата работы программы.

имя заявки, время поступления, приоритет, время исполнения (a,0,9,3); (b,1,3,3); (c,8,18,5); (d,9,6,3); (e,10,12,3) (f,11,11,3).

Имеется класс Process, который имеет четыре поля: с именем, приоритетом, временем запуска процесса и длительностью работы. Так же в классе описаны два открытых метода: конструктор с параметрами (для инициализации данных), конструктор по умолчанию, метод ToString(для вывода инициализированных значений наших полей). В классе Program имеются четыре очереди(экземпляры библиотечного класса Queue). После, в цикле, повторения которого зависят от количества процессов, происходит инициализация данных из файла test.txt и с помощью четырех условий процессы распределяются по очередям, в зависимости от приоритетов. В Console выводится таблица с результатами заполненных данных. Далее создается еще один цикл, в котором проверяются четыре условия(сравнивание поля startTime у всех процессов), для того, чтобы распределить поочередность работы процессов и если выполняется одно из условий, то к строке(в которой, показывается работа программы) прибавляется имя данного процесса(поле name) столько раз, сколько секунд он должен длиться и в итоге строка, принимает следующее значение: “aaabbbccceeeddd” (пример). После чего происходит вывод этой строки в Console.

    1. Исходный код программы(c#)

Проект типа ConsoleApplication:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.IO;

namespace ConsoleApplication3

{

class Process

{

public string name;//имя процесса Gname

public int priority;//приоритет Gpriority

public int startTime;//время запуска процесса GStart

public int executeTime;//длительность работты процесса GexecTime

public Process(string name, int startTime, int priority, int executeTime)//конструктор

{

this.startTime = startTime;

this.executeTime = executeTime;

this.name = name;

this.priority = priority;

}

public Process()

{

}

public override string ToString()//метод вывода

{

return String.Format("{0} {1} {2} {3}", name, priority, startTime, executeTime);

}

}

class Program

{

static void Main(string[] args)

{

//создаём 4 очереди

Queue<Process> Queue1 = new Queue<Process>();

Queue<Process> Queue2 = new Queue<Process>();

Queue<Process> Queue3 = new Queue<Process>();

Queue<Process> Queue4 = new Queue<Process>();

Console.WriteLine("\t\t\tИсходные данные:");

Console.WriteLine();

//заполняем из файла

StreamReader koren = new StreamReader("test.txt", Encoding.GetEncoding(1251));

int number = int.Parse(koren.ReadLine());

int length = 0;

int start = 0;

for (int i = 0; i < number; i++)

{

string newLine = koren.ReadLine();

string[] proc = newLine.Split(' ');

Process DoProc = new Process(proc[0], int.Parse(proc[1]), int.Parse(proc[2]), int.Parse(proc[3]));

length += DoProc.executeTime;

start = DoProc.startTime;

//расставляем по приоритетам процессы

if (DoProc.priority >= 15)

{

Queue4.Enqueue(DoProc);

}

if (DoProc.priority >= 10 && DoProc.priority < 15)

{

Queue3.Enqueue(DoProc);

}

if (DoProc.priority >= 5 && DoProc.priority < 10)

{

Queue2.Enqueue(DoProc);

}

if (DoProc.priority >= 0 && DoProc.priority < 5)

{

Queue1.Enqueue(DoProc);

}

}

int[] graph = new int[(length + start) * 10];

string[] name = new string[(length + start) * 10];

for (int i = 0; i < graph.Length; i++)

{

graph[i] = -1;

}

Console.WriteLine("______________________________________________________________________________");

for (int currentStep = 0; Queue1.Count != 0 || Queue2.Count != 0 || Queue3.Count != 0 || Queue4.Count != 0; currentStep++)

{

graph[currentStep] = 0;

Process process4 = new Process();

Process process3 = new Process();

Process process2 = new Process();

Process process1 = new Process();

if (Queue4.Count != 0) process4 = Queue4.Peek();

if (Queue3.Count != 0) process3 = Queue3.Peek();

if (Queue2.Count != 0) process2 = Queue2.Peek();

if (Queue1.Count != 0) process1 = Queue1.Peek();

if (process4.startTime < currentStep && Queue4.Count > 0)

{

int busyTime = process4.executeTime;

Console.WriteLine("имя процесса: {0} \t старт: {1}\t время работы: {2}\t приоритет: {3} ", process4.name, process4.startTime, process4.executeTime, process4.priority);

Console.WriteLine("_______________________________________________________________________________");

for (int i = currentStep; i < currentStep + busyTime; i++)

{

graph[i] = 4;

name[i] = process4.name;

}

Queue4.Dequeue();

currentStep += busyTime;

continue;

}

if (process3.startTime < currentStep && Queue3.Count > 0)

{

int busyTime = process3.executeTime;

Console.WriteLine("имя процесса: {0} \t старт: {1}\t время работы: {2}\t приоритет: {3} ", process3.name, process3.startTime, process3.executeTime, process3.priority);

Console.WriteLine("_______________________________________________________________________________");

for (int i = currentStep; i < currentStep + busyTime; i++)

{

graph[i] = 3;

name[i] = process3.name;

}

Queue3.Dequeue();

currentStep += busyTime;

continue;

}

if (process2.startTime < currentStep && Queue2.Count > 0)

{

int busyTime = process2.executeTime;

Console.WriteLine("имя процесса: {0} \t старт: {1}\t время работы: {2}\t приоритет: {3} ", process2.name, process2.startTime, process2.executeTime, process2.priority);

Console.WriteLine("______________________________________________________________________________");

for (int i = currentStep; i < currentStep + busyTime; i++)

{

graph[i] = 2;

name[i] = process2.name;

}

Queue2.Dequeue();

currentStep += busyTime;

continue;

}

if (process1.startTime < currentStep && Queue1.Count > 0)

{

int busyTime = process1.executeTime;

Console.WriteLine("имя процесса: {0} \t старт: {1}\t время работы: {2}\t приоритет: {3} ", process1.name, process1.startTime, process1.executeTime, process1.priority);

Console.WriteLine("_______________________________________________________________________________");

for (int i = currentStep; i < currentStep + busyTime; i++)

{

graph[i] = 1;

name[i] = process1.name;

}

Queue1.Dequeue();

currentStep += busyTime;

continue;

}

}

Console.WriteLine();

string graphik = ""; //переменная в которою собираем процессы, для результата

for (int current = 0; current < graph.Length; current++)

{

if (graph[current] == 1)

{

graphik += name[current];

}

if (graph[current] == 2)

{

graphik += name[current];

}

if (graph[current] == 3)

{

graphik += name[current];

}

if (graph[current] == 4)

{

graphik += name[current];

}

}

Console.WriteLine("\n");

Console.WriteLine("\t\t\tРезультат работы процессов: ");

Console.WriteLine();

Console.WriteLine(" \t\t\t{" + graphik + "}");

Console.ReadKey();

}

}

}

Соседние файлы в папке курсовая docx200