Ограничения
Ограничения
UNIX является многозадачной системой. Это значит, что несколько процессов конкурируют между собой при доступе к различным ресурсам. Для "справедливого" распределения разделяемых ресурсов, таких как память, дисковое пространство и т.п., каждому процессу установлен набор ограничений. Эти ограничения не носят общесистемного характера, как, например, максимальное число процессов или областей, а устанавливаются для каждого процесса отдельно. Для получения информации о текущих ограничениях и их изменения предназначены системные вызовы getrlimit(2) и setrlimit(2):
#include <sys/time.h>
#include <sys/resource.h>
int getrlimit{int resource, struct rlimit *rlp);
int setrlimit(int resource, const struct rlimit *rlp);
Аргумент resource определяет вид ресурса, для которого мы хотим узнать или изменить ограничения процесса. Структура rlimit состоит из двух полей:
rlim_t rlim_cur;
rlim_t rlim_max;
определяющих, соответственно, изменяемое (soft) и жесткое (hard) ограничение. Первое определяет текущее ограничение процесса на данный ресурс, а второе — максимальный возможный предел потребления ресурса. Например, изменяемое ограничение на число открытых процессом файлов может составлять 64, в то время как жесткое ограничение равно 1024.
Любой процесс может изменить значение текущего ограничения вплоть до максимально возможного предела. Жесткое ограничение может быть изменено в сторону увеличения предела потребления ресурса только процессом с привилегиями суперпользователя. Обычные процессы могут только уменьшить значение жесткого ограничения. Обычно ограничения устанавливаются при инициализации системы и затем наследуются порожденными процессами (хотя в дальнейшем могут быть изменены).
Вообще говоря, максимальный возможный предел потребления ресурса может иметь бесконечное значение. Для этого необходимо установить значение rlim_max равным RLIM_INFINITY. В этом случае физические ограничения системы (например, объем памяти и дискового пространства) будут определять реальный предел использования того или иного ресурса.
Различные ограничения и связанные с ними типы ресурсов приведены в табл. 2.21.
Таблица 2.21. Ограничения процесса (значения аргумента resource)
Ограничение Тип ресурса Эффект RLIMIT_CORE Максимальный размер создаваемого файла core, содержащего образ памяти процесса. Если предел установлен равным 0, файл core создаваться не будет. После создания файла core запись в этот файл будет остановлена при достижении предельного размера. RLIMIT_CPU Максимальное время использования процессора в секундах. При превышении предела процессу отправляется сигнал SIGXCPU. RLIMIT_DATA Максимальный размер сегмента данных процесса в байтах, т.е. максимальное значение смещения брейк-адреса. При достижении этого предела последующие вызовы функции brk(2) завершатся с ошибкой ENOMEM. RLIMIT_FSIZE Максимальный размер файла, который может создать процесс. Если значение этого предела равно 0, процесс не может создавать файлы. При достижении этого предела процессу отправляется сигнал SIGXFSZ. Если сигнал перехватывается или игнорируется процессом, последующие попытки увеличить размер файла закончатся с ошибкой EFBIG. RLIMIT_NOFILE Максимальное количество назначенных файловых дескрипторов процесса. При достижении этого предела, последующие попытки получить новый файловый дескриптор закончатся с ошибкой EMFlLE. RLIMIT_STACK Максимальный размер стека процесса. При попытке расширить стек за установленный предел отправляется сигнал SIGSEGV. Если процесс перехватывает или игнорирует сигнал и не использует альтернативный стек с помощью функции sigaltstack(2), диспозиция сигнала устанавливается на действие по умолчанию перед отправкой процессу. RLIMIT_VMEM Максимальный размер отображаемой памяти процесса в байтах. (Предел определен в версиях System V.) При достижении этого предела последующие вызовы brk(2) или mmap(2) завершатся с ошибкой ENOMEM. RLIMIT_NPROC Максимальное число процессов с одним реальным UID. Определяет максимальное число процессов, которые может запустить пользователь. (Предел определен в версиях BSD UNIX.) При достижении этого предела, последующие вызовы fork(2) для порождения нового процесса завершатся с ошибкой EAGAIN. RLIMIT_RSS Максимальный размер в байтах резидентной части процесса (RSS — Resident Set Size). Определяет максимальное количество физической памяти, предоставляемой процессу. (Предел определен в версиях BSD UNIX.) Если система ощущает недостаток памяти, ядро освободит память за счет процессов, превысивших свой RSS. RLIMIT_MEMLOCK Максимальный физической памяти (физических страниц) в байтах, который процесс может заблокировать с помощью системного вызова mlock(2). (Предел определен в версиях BSD UNIX.) При превышении предела системный вызов mlock(2) завершится с ошибкой EAGAIN.В заключение приведем пример программы, выводящий на экран установленные ограничения для процесса:
#include <sys/types.h>
#include <sys/resource.h>
/* Процедура вывода на экран текущего и максимального
пределов потребления ресурса resource */
void disp_limit(int resource, char *rname) {
struct rlimit rim;
getrlimit(resource, &rlm);
printf("%-13s ", rname);
/* Значение изменяемого ограничения */
if (rlm.rlim_curr == RLIM_INFINITY)
printf("infinite ");
else
printf("%101d ", rlm.rlim_cur);
/* Значение жесткого ограничения */
if (rlm.rlim_max == RLIM_INFINITY)
printf("infinite ");
else
printf("%10ld ", rlm.rlim_max);
}
main() {
disp_limit(RLIMIT_CORE, "RLIMIT_CORE");
disp_limit(RLIMIT_CPU, "RLIMIT_CPU");
disp_limit(RLIMIT_DATA, "RLIMIT_DATA");
disp_limit(RLIMIT_FSIZE, "RLIMIT_FSIZE");
disp_limit(RLIMIT_NOFILE, "RLIMIT_NOFILE");
disp_limit(RLIMIT_STACK, "RLIMIT_STACK");
/* BSD */
#ifdef RLIMIT_NPROC
disp_limit(RLIMIT_NPROC, "RLIMIT_NPROC");
#endif
/* BSD */
#ifdef RLIMIT_RSS
disp_limit(RLIMIT_RSS, "RLIMIT_RSS");
#endif
/* BSD */
#ifdef RLIMIT_MEMLOCK
disp_limit(RLIMIT_MEMLOCK, "RLIMIT_MEMLOCK");
#endif
/* System V */
#ifdef RLIMIT_VMEM
disp_limit(RLIMIT_VMEM, "RLIMIT_VMEM");
#endif
}
Запуск программы под управлением операционной системы Solaris 2.5 даст следующие результаты:
$ а.out
RLIMIT_CORE infinite infinite
RLIMIT_CPU infinite infinite
RLIMIT_DATA 2147479552 2147479552
RLIMIT_FSIZE infinite infinite
RLIMIT_NOFILE 64 1024
RLIMIT_STACK 8388608 2147479552
RLIMIT_VMEM infinite infinite
Данный текст является ознакомительным фрагментом.