Функция move_tasks
Функция move tasks о переносит процессы из исходной очереди на выполнение в локальную. Она принимает шесть параметров: this rq и this cpu (дескриптор локальной очереди и индекс локального процессора), busiest (дескриптор исходной очереди), max nr move (максимальное количество переносимых процессов), sd (адрес дескриптора области планирования, в которой происходит данная операция балансировки) и флаг idle (кроме значений sched_idle и not_idle, он может получить значение newly_idle, когда функция вызывается неявно функцией idlejoalance ()).
Функция вначале просматривает процессы с истекшими квантами времени в очереди на выполнение busiest, начиная с тех, у которых приоритет выше. Перебрав все процессы с истекшими квантами времени, функция переходит к просмотру активных процессов в той же очереди busiest. Для каждого про- цесса-кандидата на перенос функция вызывает функцию can migrate tasko, которая возвращает , если выполнены все перечисленные условия:
- процесс не выполняется в данный момент на другом процессоре;
- локальный процессор включен в битовую маску cpus aiiowed дескриптора процесса;
- выполнено одно из следующий условий:
• локальный процессор свободен. Если ядро поддерживает Hyper- Threading, все логические процессоры локального физического процессора должны быть свободны;
• ядро испытывает проблемы с балансировкой области планирования, потому что многократные попытки переместить процессы закончились неудачно;
• процесс, подлежащий переносу, не является горячим в кэше” (он не выполнялся в последнее время на удаленном процессоре, и можно предположить, что в аппаратном кэше удаленного процессора нет данных этого процесса).
Если функция can migrate tasko возвращает , функция move taskso вызывает функцию puii tasko, чтобы перенести процесс-кандидат в локальную очередь на выполнение. Говоря кратко, функция puii tasko вызывает функцию dequeue tasko, чтобы убрать процесс из удаленной очереди на выполнение, затем вызывает функцию enqueue_task, чтобы поставить его в локальную очередь, и, наконец, если у перемещенного процесса динамический
Приоритет ВЫШе, Чем у процесса current, ВЫЗЫВаеТ фуНКЦИЮ resched_task,чтобы вытеснить текущий процесс локального процессора.
Системные вызовы, относящиеся к планированию
Чтобы позволить процессам менять свои приоритеты и выбирать политику планирования, было создано несколько системных вызовов. В порядке общего правила, пользователям всегда разрешено понижать приоритеты своих процессов. Если же они захотят изменить приоритеты процессов, принадлежащих другим пользователям или повысить приоритеты своих процессов, то им потребуются привилегии суперпользователя.
Системный вызов nice
позволяет процес- су менять базовый приоритет. Целое значение, передаваемое с параметром increment, служит для корректировки поля nice дескриптора процесса. Команда nice операционной системы Unix, позволяющая пользователям запускать программы с модифицированным приоритетом планирования, основана на этом системном вызове.
Служебная процедура sys nice о обрабатывает системный вызов nice о. Хотя параметр increment может иметь любое значение, значения, превышаю
щие по абсолютной величине 40, усекаются до 40. По традиции отрицательные значения соответствуют запросам на повышение приоритета и требуют суперпользовательских привилегий, а положительные обозначают понижение приоритета. Если параметр отрицательный, служебная процедура вызывает функцию capable о, чтобы проверить, есть ли у процесса способность CAP SYS NICE. Кроме ТОГО, вызывается функция-перехватчик security_task_ setnice о. Если окажется, что пользователь обладает привилегией, необходимой для изменения приоритетов, служебная процедура sys niceo преобразует значение поля current->static_ prio в интервал nice-значений, прибавляет значение параметра increment и вызывает функцию set user nice о. Эта функция получает блокировку на локальную очередь на выполнение, обновляет статический приоритет текущего процесса, вызывает функцию resched taskO, чтобы позволить другим процессам вытеснить текущий, и освобождает блокировку очереди на выполнение.
Системный вызов nice о поддерживается исключительно в целях обратной совместимости. Он уже заменен системным вызовом setpriorityO, описанным в следующем разделе.
Предыдущая страница | 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 | Следующая страница