Читаем Linux API. Исчерпывающее руководство полностью

Однако существует атрибут, значение nice, который позволяет процессу опосредованно влиять на алгоритм планирования ядра. Каждый процесс имеет значение nice в диапазоне от –20 (высокий приоритет) до +19 (низкий приоритет); по умолчанию оно равно 0 (рис. 35.1). В традиционных реализациях UNIX только привилегированные процессы могут назначать себе (или другим процессам) отрицательный (высокий) приоритет (в подразделе 35.3.2 будут описаны некоторые особенности, характерные для Linux). Непривилегированные процессы могут только понижать свой приоритет, делая значение nice больше нуля. Делая это, они ведут себя «хорошо» (от англ. nice) по отношению к другим процессам, от чего и происходит название данного атрибута.

Значение nice наследуется потомком, созданным с помощью fork(), и сохраняется на протяжении работы вызова exec().

Вместо непосредственного значения nice системный вызов getpriority() возвращает число в диапазоне от 1 (низкий приоритет) до 40 (высокий приоритет), вычисленное по формуле unice = 20 — knice. Это делается для того, чтобы избежать возвращения отрицательных значений, которые используются в системных вызовах для обозначения ошибок (описание работы системных вызовов ищите в разделе 3.1). Приложения не знают о том, что результатом работы системного вызова getpriority() является измененное значение, так как одноименная функция-обертка из библиотеки Си делает обратное вычисление, возвращается значение 20 — unice.



Рис. 35.1.Диапазон и интерпретация значений nice


Эффект от значения nice

Значение nice не устанавливает четкой иерархии планирования процессов; вместо этого она играет роль весового коэффициента, на основе которого планировщик ядра выдает повышенные приоритеты. Процесс с низким приоритетом (то есть с высоким значением nice) не лишится процессорного времени полностью, но будет получать его в относительно меньших объемах. Степень влияния значения nice на планирование процессов зависит от версии ядра Linux или от конкретной UNIX-системы.

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


Получение и изменение приоритетов

Системные вызовы getpriority() и setpriority() позволяют процессу получать и изменять свое собственное или чужое значение nice.

#include


int getpriority(int which, id_t who);

Возвращает (возможно, отрицательное) значение nice заданного процесса или –1, если случилась ошибка

int setpriority(int which, id_t who, int prio);

Возвращает 0 при успешном завершении или –1, если произошла ошибка

Оба системных вызова принимают аргументы which и who, определяющие процесс (-ы), приоритет которого (-ых) нужно получить или изменить. Первый влияет на то, как будет интерпретирован второй. Аргумент which может иметь одно из следующих значений.

• PRIO_PROCESS — работать с процессом, чей идентификатор равен who. Если who равен 0, используется идентификатор вызывающего процесса.

• PRIO_PGRP — работать со всеми участниками группы процессов, чей идентификатор PGID равен who. Если who равен 0, используется группа вызывающего процесса.

• PRIO_USER — работать со всеми процессами, реальный пользовательский идентификатор которых равен who. Если who равен 0, берется пользовательский идентификатор вызывающего процесса.

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

Системный вызов getpriority() возвращает значение nice процесса, указанного с помощью аргументов which и who. Если заданным критериям отвечает сразу несколько процессов (это бывает, когда аргумент which равен PRIO_PGRP или PRIO_USER), берется процесс с самым высоким приоритетом. Поскольку getpriority() при успешном выполнении может вернуть –1, перед вызовом следует присваивать переменной errno значение 0 и затем, если мы получили –1, проверять, чему равна переменная errno после вызова.

Системный вызов setpriority() устанавливает значение nice(prio) для процесса (-ов), заданного (-ых) с помощью аргументов which и who. Если попытаться установить число, которое выходит за допустимые рамки (от –20 до +19), оно будет автоматически подогнано под корректное значение.

Изначально для изменения значений nice использовался вызов nice(incr), который добавлял incr к текущему значению. Эта функция все еще доступна, но ей на смену пришел более универсальный вызов, setpriority().

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных
1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных