Книга: Операционная система UNIX
Ограничения
Ограничения
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 n");
else
printf("%10ldn", 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
- 4. Ограничения ссылочной целостности
- Выявить возможные ограничения
- Недостатки и ограничения
- Погоны как функционал самоограничения
- Ограничения метода отображения файлов
- 12.1. Ограничения по времени
- 8.4.6. Ограничения на вычет расходов для платежей в офшорные юрисдикции
- 5.18.5 Ограничения на IP-адрес
- Ограничения целостности
- Листинг 8.4. (limit-cpu.c) Задание ограничения на использование нейтрального процессора
- Глава 8 Апгрейд ноутбука: возможности и ограничения
- Лимиты и ограничения для Instagram