Рекомендации по реализации подсистемы управления процессами
Модель операционной системы.Для создания модели операционной системы предлагается разработать класс 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.
Список команд может быть пополнен командами приостановки, возобновления процессов, вывода состояния критического ресурса и т.п.