Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

Приложения могут определять и изменять свои (и чужие) приоритеты с помощью функций

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>

2. Функция типа

void
записывает 10 000 раз строку во временный файл и затем выполняет некоторые арифметические вычисления для загрузки ЦП:

void work {

 FILE *f;

 int i;

 double x = 4.5;

 f = tmpfile;

 for (i = 0; i < 10000; i++) {

fprintf(f, "Do some output\n");

if (ferror(f)) {

fprintf(stderr, "Error writing to temporary file\n");

exit(1);

}

 }

 for (i = 0; i < 1000000; i++) x = log(x*x + 3.21);

}

3. Функция

main
вызывает функцию
work
, а затем применяет функцию getrusage для определения времени ЦП, использованного
work
. Эта информация выводится на экран:

int main {

 struct rusage r_usage;

 struct rlimit r_limit;

 int priority;

 work;

 getrusage(RUSAGE_SELF, &r_usage);

 printf("CPU usage: User = %ld.%06ld, System = %ld.%06ld\n",

r_usage.ru_utime.tvsec, rusage.ru_utime.tv_usec,

r_usage.ru_stime.tv_sec, r_usage.ru_stime.tv_usec);

4. Далее она вызывает функции

getpriority
и
getrlimit
для выяснения текущего приоритета и ограничений на размер файла соответственно:

Поделиться:
Популярные книги

Моров. Том 5

Кощеев Владимир
4. Моров
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Моров. Том 5

Треск штанов

Ланцов Михаил Алексеевич
6. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Треск штанов

#Бояръ-Аниме. Газлайтер. Том 11

Володин Григорий Григорьевич
11. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 11

Я еще граф. Книга #8

Дрейк Сириус
8. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Я еще граф. Книга #8

Династия. Феникс

Майерс Александр
5. Династия
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Династия. Феникс

Чужак из ниоткуда 5

Евтушенко Алексей Анатольевич
5. Чужак из ниоткуда
Фантастика:
попаданцы
альтернативная история
фантастика: прочее
фэнтези
5.00
рейтинг книги
Чужак из ниоткуда 5

Идеальный мир для Лекаря 29

Сапфир Олег
29. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 29

Гранит науки. Том 3

Зот Бакалавр
3. Героями не становятся, ими умирают
Фантастика:
фэнтези
боевая фантастика
5.00
рейтинг книги
Гранит науки. Том 3

Двойник Короля 10

Скабер Артемий
10. Двойник Короля
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Двойник Короля 10

Последний Паладин. Том 6

Саваровский Роман
6. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин. Том 6

Ищу жену с прицепом

Рам Янка
2. Спасатели
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Ищу жену с прицепом

Deus vult

Зот Бакалавр
9. Герой Империи
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Deus vult

Спасите меня, Кацураги-сан!

Аржанов Алексей
1. Токийский лекарь
Фантастика:
городское фэнтези
попаданцы
дорама
5.00
рейтинг книги
Спасите меня, Кацураги-сан!

Меченный смертью. Том 1

Юрич Валерий
1. Меченный смертью
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Меченный смертью. Том 1