Системные вызовы 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 | Следующая страница