
- •Лабораторная работа № 2 Мониторинг состояния системы
- •Краткие теоретические сведения
- •Получение информации о текущих процессах в ос семейства unix
- •Получение информации о текущих процессах в ос семейства windows
- •Системные требования
- •Функции определения состояния виртуальной памяти в win32 api
- •Функции определения параметров подсистемы управления памятью в unix
- •Задание
Лабораторная работа №2. Мониторинг состояния системы
Лабораторная работа № 2 Мониторинг состояния системы
Цель работы:. Получение практических навыков определения параметров процессов и виртуального адресного пространства.
Краткие теоретические сведения
Получение информации о текущих процессах в ос семейства 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 Library – libkvm)
Библиотека 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;
}