Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LR_02.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
199.67 Кб
Скачать

Лабораторная работа №2. Мониторинг состояния системы

Лабораторная работа № 2 Мониторинг состояния системы

Цель работы:. Получение практических навыков определения параметров процессов и виртуального адресного пространства.

Краткие теоретические сведения

  1. Получение информации о текущих процессах в ос семейства unix

Команда ps

Команда ps (process status) выводит отчет о работающих процессах.

Синтаксис команды:

ps [опции]

Вывод команды ps представляет собой таблицу, включающую следующие колонки.

Рис. 2-1. Вывод информации командой ps

Команда ps выдает информацию об активных процессах. По умолчанию информация дается только о процессах, ассоциированных с данным терминалом. Выводятся идентификатор процесса, идентификатор терминала, истраченное к данному моменту время ЦП и имя команды. Если необходима иная информация, следует пользоваться опциями.

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

Командой ps обрабатываются следующие опции:

-e

Вывести информацию обо всех процессах.

-d

Вывести информацию обо всех процессах, кроме лидеров групп.

-a

Вывести информацию обо всех наиболее часто запрашиваемых процессах, то есть обо всех процессах, кроме лидеров групп и процессов, не ассоциированных с терминалом.

-f

Генерировать полный листинг.

-l

Генерировать листинг в “длинном” формате.

-t список_терминалов

Выдавать информацию только о процессах, ассоциированных с терминалами из заданного списка_терминалов. Терминал - это либо имя файла-устройства, например ttyномер или console, либо просто номер, если имя файла начинается с tty.

-p список_идентификаторов_процессов

Выдавать информацию только об указанных процессах.

-u список_идентификаторов_пользователей

Выдавать информацию только о процессах с заданными идентификаторами или входными именами пользователей. Идентификатор пользователя выводится в числовом виде, а при наличии опции -f - в символьном.

-g список_идентификаторов_лидеров_групп

Выводить информацию только о процессах, для которых указаны идентификаторы лидеров групп. Лидер группы - это процесс, номер которого идентичен его идентификатору группы. Shell, запускаемый при входе в систему, является стандартным примером лидера группы.

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

Ниже приводятся заголовки колонок выдачи и поясняется смысл их содержимого. Буквы l или f в скобках означают, что эта колонка появляется соответственно при длинном или полном формате выдачи; отсутствие букв означает, что данная колонка выводится всегда. Отметим, что опции -l и -f влияют только на формат выдачи, но не на список процессов, информация о которых будет предоставлена.

PID – идентификатор процесса.

%CPU – доля выделенного планировщиком времени ЦП.

%MEM – доля выделенной памяти.

VSZ – размер процесса в виртуальной памяти.

RSS (rezident set size) – действительный размер процесса.

TTY – управляющий терминал.

STATстатус процесса:

S(leep) – спящий, ждет определенного события

R(eady) – готов, стоит в очереди на выполнение

I(dle) – состояние простоя

O – активный

Z – зомби

X – трассируемый процесс (под отладкой)

E – процесс завершается

Дополнительная информация о статусе:

+ – процесс находится в группе интерактивных процессов (foreground) для указанного терминала

< – приоритетный режим

s – лидер сессии (идентификатор процесса совпадает с идентификатором группы)

START – время запуска процесса.

TIME – использованное время центрального процессора.

COMMAND – команда, запустившая данный процесс. Если указана опция –f, выводится полное имя команды и ее аргументы

Команда top

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

Синтаксис команды:

top –hv|-bcisS –d задержка –n итерации –p идентификатор(ы)

-b – запуск команды в фоновом (batch) режиме.

-d задержка – определяет период времени (в секундах) между обновлениями экрана.

-hv – выводит версию программы и подсказку.

-n итерации – задает количество итераций, после которого происходит выход из программы.

-p идентификатор(ы) – задает список идентификаторов (разделенных запятыми) процессов, для которых выполняется мониторинг.

О каждом процессе выводится следующая информация.

PID – идентификатор процесса;

USER – идентификатор пользователя;

PR – приоритет;

NI – величина изменения приоритета (nice value). Отрицательная величина означает повышение приоритета;

VIRT – виртуальный образ (кБ). Общее количество виртуальной памяти, используемой процессом. VIRT = SWAP + RES, где SWAP – объем памяти, выделенный в области подкачки;

RES – используемая физическая память. RES = CODE + DATA;

SHR – количество разделяемой памяти (shared memory), используемой процессом;

S – состояние процесса: 'D' – «непробудно» (uninterruptible) спящий процесс, 'R' – выполняющийся (running), 'S' – спящий (sleeping), 'T' – трассируемый или остановленный (traced), 'Z' – зомби (zombie);

%CPU – процент времени центрального процессора, выделенного данному процессу;

%MEM – процент физической памяти, используемый процессом;

TIME+ -- общее количество времени центрального процессора, использованное данным процессом;

COMMAND – команда, которой был запущен данный процесс.

В интерактивном режиме top поддерживает следующие команды.

  • [Пробел] – обновление экрана

  • [h] – справка о команде

  • [k] – послать процессу сигнал

  • [n] – число отображаемых процессов

  • [u] – сортировать по имени пользователя

  • [M] – сортировать по объему используемой памяти

  • [P] – сортировать по загрузке процессора

Рис. 2-2. Вывод информации командой top

Виртуальная файловая система proc

{TBD}

Пример кода

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<ctype.h>

#include<sys/types.h>

#include<dirent.h>

procInfo* getProcsInfo(int *procRet)

{

procInfo *info;

DIR *dirPtr;

FILE *filePtr;

struct dirent *dirInfo;

char pPath[20],pComm[PROC_COMMAND_LENGTH],pID[6];

int i=0;

if(!(dirPtr=opendir("/proc")))

{

printf("Cannot do opendir() !\n");

return NULL;

}

// print all processes and save processes info

info=(procInfo*)malloc((*procRet)*(sizeof(procInfo)));

printf("PROC info:\n");

printf("%3s%25.25s%6s\n","NUM","COMMAND","PID");

while(dirInfo=readdir(dirPtr))

{

if(!isdigit(dirInfo->d_name[0]))

continue;

strcpy(pPath,"/proc/");

strcat(pPath,dirInfo->d_name);

strcat(pPath,"/status");

if(!(filePtr=fopen(pPath,"r")))

continue;

fscanf(filePtr,"%s",pComm);

fscanf(filePtr,"%s",pID);

if(i<*procRet)

{

strcpy(info[i].comm,pComm);

info[i].pid=atoi(pID);

}

i++;

printf("%3d%25.25s%6s\n",i,pComm,pID);

fclose(filePtr);

}

if(i<*procRet)

*procRet=i;

closedir(dirPtr);

return info;

}

Библиотека доступа к данным ядра kvm (Kernel Data Access Librarylibkvm)

Библиотека kvm предоставляет единый интерфейс доступа к образам виртуальной памяти ядра как рабочей системы, так и посметрных дампов (crash dumps). Доступ к работающей системе выполняется через устройство /dev/mem, доступ к посмертным дампам (crash dumps) – посредством файлов дампов, генерируемых savecore. Библиотека позволяет выполнить запись и чтение памяти, обеспечивает эффективный поиск адресов символов ядра и сбор информации о пользовательских процессах.

Функция kvm_open() должна вызываться первой, поскольку она возвращает дескриптор, необходимый для вызова всех последующих функций.

Первоначально интерфейс kvm был включен в SunOS, часть его была портирована в BSD (kvm_open(), kvm_close(), kvm_read(), kvm_write(), and kvm_nlist()). Большинство kvm-приложений (например, отладчики и мониторы) используют только данное подмножество интерфейса.

Интерфейс процессов в BSD не поддерживается, поскольку не является переносимым.

BSD интерфейс включает также функцию kvm_geterr(3), возвращающую сообщение о последней ошибке для указанного дескриптора.

Список функций libkvm:

kvm_close(3), kvm_getargv(3), kvm_getenvv(3), kvm_geterr(3), kvm_getfiles(3), kvm_getloadavg(3), kvm_getprocs(3), kvm_getswapinfo(3), kvm_nlist(3), kvm_open(3), kvm_openfiles(3), kvm_read(3), kvm_write(3)

Пример кода

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<kvm.h>

#include<sys/param.h>

#include<sys/sysctl.h>

#include<sys/user.h>

#include<fcntl.h>

#include<paths.h>

procInfo* getProcsInfo(int *procRet)

{

kvm_t *kd; // kernel descriptor

struct kinfo_proc *kvmInfo;

int kvmRet;

procInfo *info;

char errBuff[80];

int i;

// 2nd paramemter in kvm_open() or kvm_openfiles() can't be NULL

if(!(kd=kvm_openfiles(NULL,"/dev/null",NULL,O_RDONLY,errBuff)))

{

printf("Cannot do kvm_open() !\n");

printf("%s\n",errBuff);

return NULL;

}

// another variant to show procs+kernel visible threads: KERN_PROC_ALL

if(!(kvmInfo=kvm_getprocs(kd,KERN_PROC_ALL,0,&kvmRet)))

{

printf("Cannot do kvm_getprocs() !\n");

kvm_close(kd);

return NULL;

}

// print all processes and save processes info

if(kvmRet<*procRet)

*procRet=kvmRet;

info=(procInfo*)malloc((*procRet)*(sizeof(procInfo)));

printf("KVM info: %d processes total\n",kvmRet);

printf("%3s%25.25s%6s\n","NUM","COMMAND","PID");

for(i=0;i<kvmRet;i++)

{

if(i<*procRet)

{

strcpy(info[i].comm,kvmInfo[i].ki_comm);

info[i].pid=kvmInfo[i].ki_pid;

}

printf("%3d%25.25s",i+1,kvmInfo[i].ki_comm);

printf("%6d\n",kvmInfo[i].ki_pid);

}

kvm_close(kd);

return info;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]