Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Очередь процессов.docx
Скачиваний:
2
Добавлен:
20.11.2019
Размер:
105.72 Кб
Скачать

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();

}

}

}