Рекомендации по реализации подсистемы управления процессами

 

Модель операционной системы.Для создания модели операционной системы предлагается разработать класс OS, в интерфейс которого входят вышеперечисленные API-функции подсистемы управления процессами.

class OS {

OS() {...};

public int CreateProcess(int ProcType, int baseprior)

{

...

return pid;

}

public void MyResume(int pid) {

...

}

public void MySuspend(int pid){

...

} ...

}

 

}

В состав класса OS необходимо включить информацию об очереди процессов, ожидающих времени процессора. Как известно, процесс в реальных ОС, представляется двумя информационными структурами: дескриптором и контекстом. В нашей модели в состав дескриптора необходимо, как минимум, включить:

class Description {

int pid; //Уникальный идентификатор процесса

int state; //Состояние процесса

int prior; //Приоритет

MyProcess context; //Указатель на контекст процесса

...

}

 

Очередь дескрипторов рекомендуется реализовать одним из классов, реализующим интерфейс Collection или List, например ArrayList.

Модель процесса.Как следует из предыдущего раздела, в учебной операционной системе модель процесса представляет собой поток, который в вечном цикле выполняет действия, определенные вариантом задания, а также случайным образом вызывает API-функции управления процессами.

Приведем пример описания класса потока, который выводит в окно терминала текущее время:

class NTimerThread implements Runnable{

Thread t;

 

NTimerThread () //Конструктор класса

{

t = new Thread(this); //создаем новый поток

t.start(); //и запускаем его

}

 

public void run() //определяем действия, которые выполняет

//поток

{

try

{

while (true) //Поток выполняется в вечном цикле

{

Date d=new Date(); //Получаем текущую дату

System.out.println(d.toString()); //Переводим ее в

// строку

Thread.sleep(1000); //Приостанавливаем себя на

//секунду, чтобы дать возможность

//отработать другим и вывести

//следующее время ровно через секунду

}

} catch (InterruptedException e) {

System.out.println("Thread");

}

}

};

Данная модель процесса не имеет точек соприкосновения с моделью подсистемы управления процессами. Для реализации взаимодействия необходимо использовать вышеописанные функции управления процессами. Например, с вероятностью 0.2 поток-модель завершает свою работу:

while (true) //Поток выполняется в вечном цикле

{

Random rand= new Random();

Date d=new Date(); //Получаем текущую дату

System.out.println(d.toString()); //Переводим ее в

// строку

Thread.sleep(1000); //Приостанавливаем себя на

//секунду, чтобы дать возможность

//отработать другим и вывести

//следующее время ровно через секунду

if (rand.nextDouble()<0.2) os.myterminate(pid);

//С вероятностью 0.2 завершаем себя с помощью //API нашей операционной системы

}

Здесь os - объект типа OS, а pid - дескриптор модели процесса. Для того чтобы, модель процесса могла знать свой идентификатор, а планировщик процессов мог управлять процессами вне зависимости от их типов, предлагается использовать универсальный абстрактный класс для описания сущности "модель процесса (контекст)":

abstract class MyProcess implements Runnable

{

int pid;

Thread t;

...

public void resume()

{

t.start();

}

public void suspend()

{

t.suspend();

}

public void terminate()

{

t.stop();

}

...

 

}

 

Тогда,

class NThread extends MyProcess implements Runnable{

 

OS os;

 

NThread (OS myos, int apid){

os=myos;

pid=apid;

t = new Thread(this);

...

}

Планировщик процессов.В состав подсистемы управления процессами должна входить, функция void MainKernel (), которая реализует заданный вариантом задания алгоритм планирования процессов и распределяет процессорное время. Эта функция запускается автоматически после старта модели ОС и выполняется в вечном цикле до завершения работы. Рекомендуется помещать данную функцию в отдельный поток исполнения. Примерный алгоритм работы функции mainkernel:

1) Выбрать из очереди готовых процессов процесс, которому будет предоставлен квант машинного времени;

2) Перевести процесс в состояние выполнения. Для этого использовать метод MyProcess.resume( );

3) Предоставить квант времени для исполнения процесса (можно использовать Threed.sleep( ) для приостановки потока);

4) Остановить выбранный процесс по истечению его кванта, например использовать MyProcess.suspend( );

5) Проверить состояние процесса. Если он завершен – удалить дескриптор процесса из очереди.

6) Вызвать процедуру планирования для выбора очередного процесса, которому будет предоставлено машинное время. Перейти к п.1.

 

Интерфейс пользователя.Интерфейсная часть должна обеспечивать возможность создания новых процессов, вывод списка функционирующих процессов, приостановки и завершения процессов.

При реализации интерфейса необходимо, как минимум, разделить потоки сообщений, генерируемых моделями процессов и потоки команд управления операционной системой. В связи с этим, предлагается в потоках исполнения использовать вывод в консоль (System.out.println()).Интерфейс управления реализовать в виде фрейма

Рисунок 1.3 – Интерфейс подсистемы управления процессами

 

В командной строке пользователь модели вводит команду управления. Рекомендуется, как минимум, реализовать следующие команды:

1) Создание нового процесса: exec T P , где T - тип процесса, P - приоритет (Например, exec 1 6).

2) Уничтожение существующего процесса: kill PID, где PID - идентификатор уничтожаемого процесса.

3) Вывод списка процессов: ps.

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

 



php"; ?>