Основы программирования в Linux
Таблица 4.10
Константа whoОписание RUSAGE_SELFВозвращает данные о потреблении только для текущей программы RUSAGE_CHILDRENВозвращает данные о потреблении и для дочерних процессов Мы будем обсуждать дочерние процессы и приоритеты задач в главе 11, но для полноты картины мы здесь упоминаем об их причастности к потреблению системных ресурсов. Пока достаточно сказать, что у каждой выполняющейся программы есть ассоциированный с ней приоритет, и чем выше приоритет программы, тем больше ей выделяется доступного времени ЦП.
ПримечаниеОбычные пользователи могут только снижать приоритеты своих программ, а не повышать их.
Приложения могут определять и изменять свои (и чужие) приоритеты с помощью функций
иgetpriority. Процесс, исследуемый или изменяемый с помощью этих функций, может быть задан идентификатором процесса, группы или пользователя. Параметрsetpriorityописывает, как следует интерпретировать параметрwhich(табл. 4.11).whoТаблица 4.11
Параметр whichОписание PRIO_PROCESS — идентификатор процессаwhoPRIO_PGRP — идентификатор группыwhoPRIO_USER — идентификатор пользователяwhoИтак, для определения приоритета текущего процесса вы можете выполнить следующий вызов:
priority = getpriority(PRIO_PROCESS, getpid());Функция
позволяет задать новый приоритет, если это возможно.setpriorityПо умолчанию приоритет равен 0. Положительные значения приоритета применяются для фоновых задач, которые выполняются, только когда нет задачи с более высоким приоритетом, готовой к выполнению. Отрицательные значения приоритета заставляют программу работать интенсивнее, выделяя большие доли доступного времени ЦП. Диапазон допустимых приоритетов — от -20 до +20. Часто это приводит к путанице, поскольку, чем выше числовое значение, тем ниже приоритет выполнения.
Функция
возвращает установленный приоритет в случае успешного завершения или -1 с переменнойgetpriority, указывающей на ошибку. Поскольку значение -1 само по себе обозначает допустимый приоритет, переменнуюerrnoперед вызовом функцииerrnoследует приравнять нулю и при возврате из функции проверить, осталась ли она нулевой. Функцияgetpriorityвозвращает 0 в случае успешного завершения и -1 в противном случае.setpriorityПредельные величины, заданные для системных ресурсов, можно прочитать и установить с помощью функций
иgetrlimit. Обе они для описания ограничений ресурсов используют структуру общего назначенияsetrlimit. Она определена в файле sys/resource.h и содержит элементы, перечисленные в табл. 4.12.rlimitТаблица 4.12
Элемент rlimitОписание rlim_t rlim_curТекущее, мягкое ограничение rlim_t rlim_maxЖесткое ограничение Определенный выше тип
— целочисленный тип, применяемый для описания уровней ресурсов. Обычно мягкое ограничение — это рекомендуемое ограничение, которое не следует превышать; нарушение этой рекомендации может вызвать возврат ошибок из библиотечных функций. При превышении жесткого ограничения система может попытаться завершить программу, отправив ей сигнал, например, сигналrlim_tпри превышении ограничения на потребляемое время ЦП и сигналSIGXCPUпри превышении ограничения на объем данных. В программе можно самостоятельно задать для любых значений собственные мягкие ограничения, не превышающие жесткого ограничения. Допустимо уменьшение жесткого ограничения. Увеличить его может только программа, выполняющаяся с правами суперпользователя.SIGSEGVОграничить можно ряд системных ресурсов. Эти ограничения описаны в параметре
функцийresourceи определены в файле sys/resource.h, как показано в табл. 4.13.rlimitТаблица 4.13
Параметр resourceОписание RLIMIT_COREОграничение размера файла дампа ядра, в байтах RLIMIT_CPUОграничение времени ЦП, в секундах RLIMIT_DATAОграничение размера сегмента , в байтахdata()RLIMIT_FSIZEОграничение размера файла, в байтах RLIMIT_NOFILEОграничение количества открытых файлов RLIMIT_STACKОграничение размера стека, в байтах RLIMIT_ASОграничение доступного адресного пространства (стек и данные), в байтах В упражнении 4.15 показана программа limits.c, имитирующая типичное приложение. Она также задает и нарушает ограничения ресурсов.
Упражнение 4.16. Ограничения ресурсов1. Включите заголовочные файлы для всех функций, которые вы собираетесь применять в данной программе:
#include <sys/types.h> \#include <sys/resource.h>#include <sys/time.h>#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <math.h>