TGViewer
LinuxCamp | DevOps LinuxCamp | DevOps @linuxcamp_tg · 13.6K subscribers
Post #73 6.36K
Ресурсы процессов

Каждый процесс потребляет системные ресурсы, такие как память и процессорное время. Этот пост расскажет вам о системных вызовах, которые необходимы для получения подобной информацией о потребляемых ресурсах и контроля ряда ограничений.

Мы начнем с вызова getrusage(), который позволяет процессу следить за ресурсами, потребленными им или его потомками. Затем будут рассмотрены вызовы setrlimit() и getrlimit(), которые позволяют изменять и получать данные об установленных для вызывающего процесса ограничениях на различные ресурсы.

Ресурсы, использующиеся процессом:

Системный вызов getrusage() возвращает статистику, которая касается различных ресурсов системы, потребленных самим вызывающим процессом или всеми его потомками:


#include <sys/resource.h>

int getrusage(int who, struct rusage *res_usage);


Данный вызов возвращает 0 при успешном завершении или –1, если произошла ошибка. Аргумент who обозначает процесс, для которого будет извлекаться информация о потреблении ресурсов. Он может принимать одно из следующих значений:

1. RUSAGE_SELF — возвращает сведения о вызывающем процессе.
2. RUSAGE_CHILDREN — возвращает сведения обо всех потомках вызывающего процесса.
3. RUSAGE_THREAD — возвращает сведения о вызывающем потоке (поддерживается только в Linux).

Аргумент res_usage представляет собой указатель на структуру типа rusage, поля которой заполняются в момент вызова:


struct rusage {
/* Процессорное время, потребленное пользователем */
struct timeval ru_utime;
/* Процессорное время, потребленное системой */
struct timeval ru_stime;
/* Размер страницы памяти, выделенной процессу */
long ru_maxrss;
...
}


Нужно помнить, что далеко не все поля структуры rusage заполняются вызовом getrusage(). Некоторые поля могут игнорироваться в Linux, но учитываться в других реализациях UNIX. В Linux они присутствуют на случай, если их реализуют в будущем - это позволит поддерживать бинарную совместимость с уже существующими приложениями.

Давайте на примере посмотрим, как можно получить "user/system" процессорное время, затраченное процессом на выполнение кода:


#include <stdio.h>
#include <sys/resource.h>
#include <sys/time.h>
#include <unistd.h>

void main() {
/* Some Work... */

struct rusage usage;
if (getrusage(RUSAGE_SELF, &usage) == 0) {
printf("User CPU time: %ld.%06ld seconds\n",
usage.ru_utime.tv_sec, usage.ru_utime.tv_usec);

printf("System CPU time: %ld.%06ld seconds\n",
usage.ru_stime.tv_sec, usage.ru_stime.tv_usec);
}
}


Ограничения на ресурсы для отдельных процессов:

Каждый процесс обладает набором параметров, с помощью которых можно ограничить объем тех или иных системных ресурсов, которые он может потребить. Сведения об ограничениях на ресурсы процесса можно получать и изменять с помощью системных вызовов getrlimit() и setrlimit():


int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);


Аргумент resource обозначает ограничение на ресурсы, которое нужно получить либо изменить. Рассмотрим несколько примеров возможных значений:


RLIMIT_AS Размер виртуальной памяти процесса (байты)
RLIMIT_CORE Размер дампа памяти (байты)
RLIMIT_CPU Процессорное время (секунды)
...


Аргумент rlim используется либо для возвращения существующих значений ограничения, либо для задания новых. Он представляет собой структуру, состоящую из двух полей:


struct rlimit {
rlim_t rlim_cur;
rlim_t rlim_max;
};


Эти поля имеют целочисленный тип rlim_t и соответствуют двум ограничениям на один ресурс: мягкому (rlim_cur) и жесткому (rlim_max). Эти ограничения управляют тем, какой объем целевого ресурса может быть использован.

Мягкое ограничение регулирует количество ресурсов, которые могут быть использованы процессом. Процесс может использовать ресурсы в пределах этого значения. Жесткое ограничение является абсолютным максимумом, который нельзя превысить, даже при попытке изменить мягкое ограничение.

Linux++ | IT-Образование
  • 👍 21
  • ❤ 6
  • ❤‍🔥 5
  • 🔥 2
More from @linuxcamp_tg
  1. Sep 28, 2026Проекту GNU вчера исполнилось 43 года 1983 год: Ричард Столлман объявил планы разработать…
  2. Sep 25, 2026Linux будет работать на ноутах с Snapdragon X2. Qualcomm добавляет полноценную поддержку L…
  3. Sep 24, 2026Так все по делу)) Советует же самый быстрый фикс LinuxCamp | #memes
  4. Sep 23, 2026Планы на 3 октября — прийти на RWB Infra x Security Meetup Мы направим прожекторы на инфра…
  5. Sep 22, 2026Ещё одна рекордная неделя для AI-разработки в Linux. На прошлой неделе в ядро попало 1 634…
  6. Sep 17, 2026Открыл плейлист, а как выйти - непонятно 😁 LinuxCamp | #memes
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →