ЛАБОРАТОРНАЯ РАБОТА №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.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.