Linux Kernel (Ядро линукса) (часть 1)


Системные вызовы getpriorityO и setpriorityO

Системный вызов nice о затрагивает только процесс, который его сделал. Два других системных вызова, getpriority и setpriority , работают с базовыми приоритетами всех процессов в данной группе. Вызов getpriorityO возвращает 20 минус наименьшее значение полей nice всех приоритетов в этой группе, т. е. наивысший приоритет среди этих процессов. Вызов setpriorityO устанавливает в заданное значение базовый приоритет всех процессов в указанной группе.

Ядро реализует эти системные вызовы при помощи служебных процедур sys getpriority о и sys setpriority . Обе они принимают практически одинаковые наборы параметров:
-which — значение, идентифицирующее группу процессов, может быть одним из следующих:
• prio process — процессы выбираются по идентификаторам процессов (поле pid дескриптора процесса);
• prio pgrp— процессы выбираются по идентификаторам групп (поле pgrp дескриптора процесса);
• prio user — процессы выбираются по идентификаторам пользователей (поле uid дескриптора процесса);
- who — значение поля pid, pgrp или uid (в зависимости от значения параметра which), используемое для выбора процесса. Если параметр who равен 0, он устанавливается равным соответствующему полю процесса
current;
- nicevai— новый базовый приоритет (необходим только функции sys
setpriority ()). Он должен лежать в диапазоне от-20 (наивысший приоритет) до +19 (самый низкий).
Как было сказано ранее, только процессам со способностью cap sys nice разрешено повышать свой базовый приоритет или изменять приоритеты других процессов.

В главе 10 мы увидим, что системные вызовы возвращают отрицательные значения только при возникновении ошибки. По этой причине вызов getpriority возвращает не нормальное nice-значение из диапазона от -20 до +19, а неотрицательное значение от 1 до 40.

Системные вызовы sched_getaffinity() и sched_setaffinity

Системные ВЫЗОВЫ sched_getaffinity о И sched_setaff inity ВОЗВращаюТ И устанавливают, соответственно, маску привязки процессора к процессу, т. е. битовую маску процессоров, которым разрешено выполнять этот процесс. Эта маска хранится в поле cpus ai lowed дескриптора процесса.

Служебная процедура sys sched getaffinity о ищет дескриптор процесса с помощью функции find_task_by_pid, а затем возвращает результат операции ЛОГИЧЕСКОЕ И над соответствующим полем cpus ai lowed и битовой маской доступных процессоров.

Системный вызов sys sched setaffinity о устроен чуть сложнее. Помимо поиска дескриптора целевого процессора и обновления поля cpus ai lowed, эта функция должна проверить, стоит ли процесс в очереди на выполнение у процессора, который отсутствует в обновленной маске привязки. В худшем случае, придется перенести процесс в другую очередь на выполнение. Чтобы избежать проблем со взаимными блокировками и попытками одновременного обращения, эта работа перекладывается на потоки ядра migration (такой поток есть у каждого процессора). Если процесс подлежит переносу из очереди rqi в очередь rq2, системный вызов пробуждает поток migration очереди rql (rql->migration_thread), КОТОрыЙ удаляет процесс ИЗ rql И ставит его В очередь на выполнение rq2.

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без проблем

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга для вас. А так как к книге прилагается компакт- диск с готовой к работе операционной системой Knoppix Live CD, то лишь достаточно вставить его в привод и перегрузить компьютер,...

Linux Kernel (Ядро линукса) (часть 1)

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

Linux Kernel (Ядро линукса) (часть 2)

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно неуклюже: получив системный вызов fork о, ядро в буквальном смысле дублировало все адресное пространство родителя и присваивало копию процессу-потомку. Такая операция...

Linux Kernel (Ядро линукса) (часть 3)

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer head. Этот дескриптор содержит всю информацию, необходимую ядру для работы с блоком, так что перед обработкой блока ядро обязательно проверяет голову...