1.2 Организация очередей процессов
Для управления процессами ОС организует следующие очереди:
1. Очередь заданий (job queue) – cодержит множество всех процессов в системе. В нее попадает каждый новый процесс и остается в ней в течение всего пребывания в системе.
2. Очередь готовых процессов (ready queue) – наиболее часто используемая и изменяемая очередь, содержащая множество всех процессов, находящихся в основной памяти и готовых к выполнению. В нее попадает каждый новый процесс, который система допускает к выполнению, а также каждый процесс после выполнения ввода-вывода или наступление ожидаемого события.
3. Очереди процессов, ожидающих ввода-вывода (device queues) – множества процессов, ожидающих результата работы устройств ввода-вывода (для каждого устройства организуется своя очередь).
Элементами очередей на “физическом уровне” являются дескрипторы задач.
На 1.2 изображена схема организации очереди готовых процессов и очередей к устройствам ввода-вывода.
Рис. 1.2 – Очередь готовых процессов и очереди к устройствам ввода-вывода.
Как видно из схемы, в очереди готовых процессов находятся те процессы, ввод-вывод в которых завершен. Процессы, выполняющие ввод-вывод или ждущие возможности его выполнить (освобождения соответствующего устройства) стоят в очереди к устройству. Некоторые устройства могут быть свободны, другие – содержать более одного процесса в очереди. Следует также обратить внимание на организацию очереди, с точки зрения представления данных. Полезный прием состоит в том, что для очереди хранится не только ссылка на начало (голову), но и ссылка на конец (хвост), что позволяет более эффективно управлять очередями (например, быстро добавить элемент в конец очереди). Место процесса в очереди определяется его приоритетом.
1.3 Пример реализации класса процесса
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace WinQueue
{
public class TProcess<T>
{
public enum status { ready, wait, run, created };
public enum priority { easy, middle, hight };
private static int UniqCounter = 0;
public int PID; // идентификатор
public string Name; // имя
public priority ProcPriority; // приоритет процесса
public int arrivalTime; // такт создания процесса
public int burstTime; // требуемое время работы на ЦП
public int CPUTime; // реальное время непрерывной работы на ЦП на ЦП
public string ProcStatus; // состояние процесса
public TProcess(int arrT)
{
PID = UniqCounter++;
Name = "P" + PID.ToString();
arrivalTime = arrT;
ProcStatus = status.created.ToString();
Random rnd = new Random();
ProcPriority = (priority)rnd.Next(3);
Random rand = new Random();
burstTime = rand.Next(100);
CPUTime = 0;
}
public void incCPUTime()
{
CPUTime++;
}
public bool IsFinish()
{
return (CPUTime == burstTime);
}
public string[] ToArray()
{
string[] StArr = new string[7];
StArr[0] = String.Format("{0}: {1}", "Идентификатор", PID.ToString());
StArr[1] = String.Format("{0}: {1}", "Имя", Name);
StArr[2] = String.Format("{0}: {1}", "Приоритет", ProcPriority);
StArr[3] = String.Format("{0}: {1}", "Такт создания процесса",
arrivalTime.ToString());
StArr[4] = String.Format("{0}: {1}", "Требуемое время работы на ЦП",
burstTime.ToString());
StArr[5] = String.Format("{0}: {1}", "Реальное время непрерывной работы на
ЦП", CPUTime.ToString());
StArr[6] = String.Format("{0}: {1}", "Состояние процесса", ProcStatus);
return StArr;
}
public override string ToString()
{
return "Process ID = " + PID.ToString() + " Process Name = " + Name +
" Process Pririty = " + ProcPriority.ToString();
}
}
}