Функции работы с процессами.


 

В Unix используется в основном 4 функции:

 

    fork () – функция создания нового процесса, с новым идентификатором и копирования в него контекста вызывающего процесса. Функция выполняется следующим образом:

 

    В системной таблице процессов создается новый элемент для создаваемого процесса.

 

    Новому процессу выделяется память.

 

    В выделенную память нового процесса копируется контекст вызывающего процесса.

 

    Увеличивается счетчик во всех таблица работы с файлами для файлов вызывающего процесса (на единицу).

 

    Возвращается код завершения

 

 

    Два идентичных процесса, счетчики команд указывают на следующие команды:

 

    Fork родителя возвращает идентификатор дочернего процесса, а fork дочернего процесса возвращает 0.

 

    exec () – используется для запуска в рамках текущего процесса новой программы, загруженной из файла, указанного в качестве параметра при вызове этой функции.

 

    exit (status) – функция используется для завершения процесса. В качестве параметра можно задать код завершения (статус). Exit записывает этот код в элемент системной таблицы процессов, описывающих текущий процесс и посылает родительскому процессу специальный сигнал SIGCLD, извещающий о завершении дочернего процесса.

 

    wait () – используется для ожидания родительским процессом завершения дочернего процесса. Ставит родительский процесс в состояние ожидания до прихода сигнала SIGCLD, а после прихода, считывает код завершения дочернего процесса из элемента системной таблицы процессов.

 

    Возможны разные ситуации использования exit и wait в родительском процессе:

 

 

    Пример работы в оперативном режиме:

 

while(1)

{

cmd=prompt()

cmd=verify(cmd)

Rr=fork()

if(rv==0)

{

exec(cmd)

exit(1)

}

else

s=wait()

}

 

Планирование выполнения процессов.

 

Unix - система с разделением времени, поэтому время центрального процессора выделяется процессам квотами. Отличительной особенностью является то, что при выделении времени ЦП основным критерием является уже использованное процессом процессорное время. С каждым процессом связано понятие приоритета и использованного времени ЦП. Для хранения этих величин в СТП имеются специальные поля: PRTY, CPU.

 

    У пользовательских процессов приоритет периодически пересчитывается, причем при этом пересчете учитывается поле CPU. Обычно пересчет приоритета для пользовательских процессов происходит при переходе процесса из системного в пользовательский режим, а также периодически раз в секунду.

 

    В Unix используется круговая многоуровневая диспетчеризация, согласно которой планировщик планирует загрузку процессора следующим образом:

 

    после истечения квоты времени, выделенной процессу, его выполнение приостанавливается, если он до этого не был приостановлен или сам не перешел в режим ожидания, контекст процесса сохраняется и он переходит в конец очереди своего приоритета.

 

    из очереди готовых процессов выбирается наиболее высокоприоритетный, его контекст восстанавливается и запускается на выполнение.

 

    если имеется несколько процессов с одинаковым приоритетом, то выбирается тот, который ждет дольше (поле CPU которого меньше).

 

    Если в системе не ни одного готового процесса, планировщик переходит в состояние ожидания, и повторяет попытку планирования при следующем тике таймера или операции прерывания.

 

    Все приоритеты в системе разбиты на 2 класса:

 

    Системные

 

    Пользовательские

 

    Внутри каждого из классов существуют уровни приоритетов.

 

 

    Пользовательские уровни приоритета используются для процессов, работающих в пользовательском режиме, системные уровни – для процессов в системном режиме.

 

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

 

    При работе в пользовательском режиме для пересчета готовых пользовательских процессов планировщик выполняет следующие действия:

 

    при каждом прерывании от таймера планировщик добавляет единицу в поле CPU активного процесса.

 

    каждую секунду для всех готовых процессов планировщик выполняет следующие вычисления:

 

    CPU=CPU/2

 

    PRTY=CPU/2 + PUSER + [nice]

 

    PUSER – граничный приоритет, чем больше PRTY, тем ниже приоритет процесса.

 

    По этому же правилу происходи пересчет приоритета процесса, когда он переходит из системного в пользовательский. Обычно планировщик имеет маску, в которой для каждого уровня приоритета отводиться по 1 биту. Он устанавливается в 1, если в очереди готовых процессов есть процесс с данным уровнем приоритета и в 0, если таковых нет.

 

Планирование Unix.

Пусть есть 3 готовых процесса A,B,C. Они запущены в этом порядке, пограничный приоритет PUSER=60. Количество тиков в секунду – 60. Планировщик выполняет планирование по формулам: CPU=CPU/2, PRTY=CPU/2+PUSER.

 

 

    В Unix есть специальная команда: nice имя m. С ее помощью можно запускать программы и изменять их приоритет на некоторую величину m. Приоритет для задач запущенных с помощью nice вычисляется как: PRTY=CPU/2 + PUSER + m.

 

     Обычно пользователь в команде nice может использовать m>0, т.е. он может только увеличить PRTY (уменьшить приоритет). Суперпользователь может задавать m<0, т.е. увеличивать приоритет. Существует команда позволяющая изменить приоритет выполняющегося процесса: renice PID m.

 

    С помощью команды setpri() можно явно назначить уровень приоритета выполнения процесса. Если при этом приоритет становиться больше граничного, т.е. попадает системный класс, то процесс уже не будет прерываться планировщиком и будет выполняться по правилам процессов, работающих в системном режиме.

 



Дата добавления: 2020-10-01; просмотров: 174;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.01 сек.