Программирование планировщиков процессов. Разработка программы, осуществляющей моделирование работы планировщика заданий ОС в режиме разделения времени

Страницы работы

Содержание работы

ЛАБОРАТОРНАЯ РАБОТА №2

Программирование планировщиков процессов

Цель работы: разработать программу, осуществляющую моделирование работы планировщика заданий ОС в режиме разделения времени.

Задание

Необходимо разработать программу на языке С#, осуществляющую моделирование режима работы с разделением времени между независимыми процессами.

Моделирование режима разделения времени выполняется в соответствии с заданием (таблица 2.1).

На экран выводится следующая информация:

1. Номер текущего кванта времени процессора;

2. Таблица процессов с указанием их текущего состояния (исполнение, готовность, ожидание), их продолжительности, приоритета, оставшегося времени выполнения;

3. При не возможности поставить процесс в очередь выводится необходимо выводить соответствующее сообщение.

4. По окончанию работы процесса на экране должно выводится сообщение о его завер-шении «Процесс такой то завершен», при этом сам процесс удаляется из списка зада-ний.

Листинг программы:

Форма:

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

Process[] processes = new Process[8];

int processNumber = 0;

int currentKvant = 0;

private void AddProcess(Process process)

{

bool added = false;

for (int i = 0; i < processes.Length && added == false; i++ )

{

if(processes[i] == null)

{

processes[i] = process;

added = true;

}

}

if(added == false)

{

MessageBox.Show("Unable to add process");

}

}

//add process

private void button1_Click(object sender, EventArgs e)

{

processNumber++;

string name = textBox1.Text;

int duration = Convert.ToInt32(textBox3.Text);

int priority = Convert.ToInt32(textBox2.Text);

Process process = new Process(processNumber, name, "Г", duration, priority);

AddProcess(process);

ShowProcesses();

}

//delete process

private void button3_Click(object sender, EventArgs e)

{

int rowIndex = dataGridView1.SelectedCells[0].RowIndex;

int id = Convert.ToInt32(dataGridView1[0, rowIndex].Value);

bool isFound = false;

for (int i = 0; i < processes.Length && isFound == false; i++)

{

if(processes[i] != null && processes[i].id == id)

{

processes[i] = null;

isFound = true;

}

}

ShowProcesses();

}

//next kvant

private void button2_Click(object sender, EventArgs e)

{

Process process = Process.FindWithMaxPriority(processes);

process.state = "И";

process.toEnd--;

if (process.toEnd == 0)

{

Process.RemoveProcess(processes, process);

}

else

{

processes = Process.ChangeProcess(processes, process);

processes = Process.ChangeOldRunnedProcess(processes, process);

}

currentKvant++;

label4.Text = "Kvant: " + currentKvant;

ShowProcesses();

}

private void ShowProcesses()

{

dataGridView1.Rows.Clear();

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

{

if(processes[i] != null)

{

dataGridView1.Rows.Add(processes[i].id, processes[i].name, processes[i].state,

processes[i].duration, processes[i].priority, processes[i].toEnd);

}

}

}

private void Form1_Load(object sender, EventArgs e)

{

Process process = new Process(1, "Process1", "Г", 3, 111);

AddProcess(process);

process = new Process(2, "Process2", "Г", 4, 222);

AddProcess(process);

process = new Process(3, "Process3", "Г", 2, 333);

AddProcess(process);

dataGridView1.Rows.Add(1, "Process1", "Г", 3, 111, 3);

dataGridView1.Rows.Add(2, "Process2", "Г", 4, 222, 4);

dataGridView1.Rows.Add(3, "Process3", "Г", 2, 333, 2);

processNumber = 3;

}

}

Класс Process:

class Process

{

public int id;

public string name;

public string state;

public int duration;

public int priority;

public int toEnd;

public Process(int id, string name, string state, int duration, int priority)

{

this.id = id;

this.name = name;

this.state = state;

this.duration = duration;

this.priority = priority;

this.toEnd = duration;

}

public static Process FindWithMaxPriority(Process[] processes)

{

Process process = null;

int maxPriority = -1;

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

{

if(processes[i] != null && processes[i].priority > maxPriority)

{

maxPriority = processes[i].priority;

process = processes[i];

}

}

return process;

}

public static Process[] ChangeProcess(Process[] processes, Process process)

{

bool isFound = false;

for (int i = 0; i < processes.Length && isFound == false; i++)

{

if (processes[i] != null && processes[i].id == process.id)

{

processes[i] = process;

isFound = true;

}

}

return processes;

}

public static Process[] RemoveProcess(Process[] processes, Process process)

{

bool isFound = false;

for (int i = 0; i < processes.Length && isFound == false; i++)

{

if (processes[i] != null && processes[i].id == process.id)

{

processes[i] = null;

isFound = true;

}

}

return processes;

}

public static Process[] ChangeOldRunnedProcess(Process[] processes, Process newProcess)

{

bool isFound = false;

for (int i = 0; i < processes.Length && isFound == false; i++)

{

if (processes[i] != null && processes[i].id != newProcess.id && processes[i].state == "И")

{

processes[i].state = "Г";

processes[i].priority++;

isFound = true;

}

}

return processes;

}

}

Тесты:

Исполняется процесс 2. Попутно добавили процессы с более высокими приоритетами. При дальнейшем выполнение, ход перейдет к процессу с большим приоритетом, а приоритет  процесс который выполнялся, добавиться 1.

Похожие материалы

Информация о работе