Таблица 4.10
Константа who
| Описание |
RUSAGE_SELF
| Возвращает данные о потреблении только для текущей программы |
RUSAGE_CHILDREN
| Возвращает данные о потреблении и для дочерних процессов |
Мы будем обсуждать дочерние процессы и приоритеты задач в главе 11, но для полноты картины мы здесь упоминаем об их причастности к потреблению системных ресурсов. Пока достаточно сказать, что у каждой выполняющейся программы есть ассоциированный с ней приоритет, и чем выше приоритет программы, тем больше ей выделяется доступного времени ЦП.
Примечание
Обычные пользователи могут только снижать приоритеты своих программ, а не повышать их.
Приложения могут определять и изменять свои (и чужие) приоритеты с помощью функций
getpriority
и
setpriority
. Процесс, исследуемый или изменяемый с помощью этих функций, может быть задан идентификатором процесса, группы или пользователя. Параметр
which
описывает, как следует интерпретировать параметр
who
(табл. 4.11).
Таблица 4.11
Параметр which
| Описание |
PRIO_PROCESS
| who — идентификатор процесса |
PRIO_PGRP
| who — идентификатор группы |
PRIO_USER
| who — идентификатор пользователя |
Итак, для определения приоритета текущего процесса вы можете выполнить следующий вызов:
priority = getpriority(PRIO_PROCESS, getpid());
Функция
setpriority
позволяет задать новый приоритет, если это возможно.
По умолчанию приоритет равен 0. Положительные значения приоритета применяются для фоновых задач, которые выполняются, только когда нет задачи с более высоким приоритетом, готовой к выполнению. Отрицательные значения приоритета заставляют программу работать интенсивнее, выделяя большие доли доступного времени ЦП. Диапазон допустимых приоритетов — от -20 до +20. Часто это приводит к путанице, поскольку, чем выше числовое значение, тем ниже приоритет выполнения.
Функция
getpriority
возвращает установленный приоритет в случае успешного завершения или -1 с переменной
errno
, указывающей на ошибку. Поскольку значение -1 само по себе обозначает допустимый приоритет, переменную
errno
перед вызовом функции
getpriority
следует приравнять нулю и при возврате из функции проверить, осталась ли она нулевой. Функция
setpriority
возвращает 0 в случае успешного завершения и -1 в противном случае.
Предельные величины, заданные для системных ресурсов, можно прочитать и установить с помощью функций
getrlimit
и
setrlimit
. Обе они для описания ограничений ресурсов используют структуру общего назначения
rlimit
. Она определена в файле sys/resource.h и содержит элементы, перечисленные в табл. 4.12.
Таблица 4.12
Элемент rlimit
| Описание |
rlim_t rlim_cur
| Текущее, мягкое ограничение |
rlim_t rlim_max
| Жесткое ограничение |
Определенный выше тип
rlim_t
— целочисленный тип, применяемый для описания уровней ресурсов. Обычно мягкое ограничение — это рекомендуемое ограничение, которое не следует превышать; нарушение этой рекомендации может вызвать возврат ошибок из библиотечных функций. При превышении жесткого ограничения система может попытаться завершить программу, отправив ей сигнал, например, сигнал
SIGXCPU
при превышении ограничения на потребляемое время ЦП и сигнал
SIGSEGV
при превышении ограничения на объем данных. В программе можно самостоятельно задать для любых значений собственные мягкие ограничения, не превышающие жесткого ограничения. Допустимо уменьшение жесткого ограничения. Увеличить его может только программа, выполняющаяся с правами суперпользователя.
Ограничить можно ряд системных ресурсов. Эти ограничения описаны в параметре
resource
функций
rlimit
и определены в файле sys/resource.h, как показано в табл. 4.13.
Таблица 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>