Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: загрузка процессора и памяти  (Прочитано 20725 раз)
0 Пользователей и 1 Гость смотрят эту тему.
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« : 05-05-2007 11:55 » 

Не являюсь спецом в программинге на плюсах да ещё и в линухе.
Интересует вот что :
Есть ли какие то стандартные методы узнать насколько загружен процессор всей системы и сколько юзается памяти ?

ЗЫ. Чтение и парсинг данных из файлов /proc/cpuinfo, /proc/meminfo и так далее не устраивает.
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #1 : 07-05-2007 08:03 » 

Хммм.... неужто нет никаких вариантов ?
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #2 : 07-05-2007 12:05 » 

Используем системные вызовы Ага
http://www.quepublishing.com/articles/article.asp?p=23618&seqNum=7
Записан

Странно всё это....
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #3 : 07-05-2007 12:25 » 

Используем системные вызовы Ага
http://www.quepublishing.com/articles/article.asp?p=23618&seqNum=7
Хммм... что то это не совсем то что нужно. В указаном тобой примере всё относиться к данному процессу, а мне нужны данный по всей системе в целом. Сколько процентов цпу и рама загружено. Да и в том примере выводится CPU time. Что это значит CPU time ?

ЗЫ. Ногами не бейте ибо в линухах я слаб.
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #4 : 07-05-2007 12:33 » 

на тойже страничке есть ссылка на системный вызов sysinfo
http://www.opennet.ru/man.shtml?topic=sysinfo&category=2&russian=
Записан

Странно всё это....
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 08-05-2007 10:51 » 

Может просто команду top запустить?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #6 : 08-05-2007 11:15 » 

Может просто команду top запустить?
Не пойдёт Улыбаюсь Пишу простенький XPCOM компонент, и в нём нужно реализовать два метода :
1. который вернёт загрузку процессора всей системой
2. который вернёт загрузку памяти во всей системе
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #7 : 08-05-2007 13:50 » 

на тойже страничке есть ссылка на системный вызов sysinfo
http://www.opennet.ru/man.shtml?topic=sysinfo&category=2&russian=
С sysinfo всё хоккей ! Спасибки за ссылку. Пойду искать/разбираться с загрузкой процессора
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #8 : 08-05-2007 17:12 » 

так sysinfo вроде говорит загрузку процессора, но я бы на твоём месте посмотрел прежде всего в двух местах в 1. доки идущев в комплекте с исходниками ядра. 2. в сырцах уже существующего ПО например в GKRELLM
Записан

Странно всё это....
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #9 : 08-05-2007 18:01 » 

так sysinfo вроде говорит загрузку процессора
sysinfo выводит что то типа CPU Time за 1, 5 и 15 минут. НО разве это загрузка в процентах ?
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 08-05-2007 19:16 » 

MOPO3, это некая "средняя" величина. В литературе не описыно или я не смог найти.

Попробуем разобраться...

Я надергал из файлов исходников ядра несколько "цитат". Сначала константы, макросы и определение структуры, а потом код изменяющий это среднее время, и код из системного вызова.
Хранится это время в unsigned long avenrun[3];
Константа HZ для x86 равна 100.

Код: (C)
/*
 * These are the constant used to fake the fixed-point load-average
 * counting. Some notes:
 *  - 11 bit fractions expand to 22 bits by the multiplies: this gives
 *    a load-average precision of 10 bits integer + 11 bits fractional
 *  - if you want to count load-averages more often, you need more
 *    precision, or rounding will get you. With 2-second counting freq,
 *    the EXP_n values would be 1981, 2034 and 2043 if still using only
 *    11 bit fractions.
 */

extern unsigned long avenrun[];         /* Load averages */

#define FSHIFT          11              /* nr of bits of precision */
#define FIXED_1         (1<<FSHIFT)     /* 1.0 as fixed-point */
#define LOAD_FREQ       (5*HZ)          /* 5 sec intervals */
#define EXP_1           1884            /* 1/exp(5sec/1min) as fixed-point */
#define EXP_5           2014            /* 1/exp(5sec/5min) */
#define EXP_15          2037            /* 1/exp(5sec/15min) */

#define CALC_LOAD(load,exp,n) \
        load *= exp; \
        load += n*(FIXED_1-exp); \
        load >>= FSHIFT;

Код: (C)
#define SI_LOAD_SHIFT   16
struct sysinfo {
        long uptime;                    /* Seconds since boot */
        unsigned long loads[3];         /* 1, 5, and 15 minute load averages */
        unsigned long totalram;         /* Total usable main memory size */
        unsigned long freeram;          /* Available memory size */
        unsigned long sharedram;        /* Amount of shared memory */
        unsigned long bufferram;        /* Memory used by buffers */
        unsigned long totalswap;        /* Total swap space size */
        unsigned long freeswap;         /* swap space still available */
        unsigned short procs;           /* Number of current processes */
        unsigned short pad;             /* explicit padding for m68k */
        unsigned long totalhigh;        /* Total high memory size */
        unsigned long freehigh;         /* Available high memory size */
        unsigned int mem_unit;          /* Memory unit size in bytes */
        char _f[20-2*sizeof(long)-sizeof(int)]; /* Padding: libc5 uses this.. */
};

Код: (C)
static inline void calc_load(unsigned long ticks)
{
        unsigned long active_tasks; /* fixed-point */
        static int count = LOAD_FREQ;

        count -= ticks;
        if (count < 0) {
                count += LOAD_FREQ;
                active_tasks = count_active_tasks();
                CALC_LOAD(avenrun[0], EXP_1, active_tasks);
                CALC_LOAD(avenrun[1], EXP_5, active_tasks);
                CALC_LOAD(avenrun[2], EXP_15, active_tasks);
        }
}

Код: (C)
                val.loads[0] = avenrun[0] << (SI_LOAD_SHIFT - FSHIFT);
                val.loads[1] = avenrun[1] << (SI_LOAD_SHIFT - FSHIFT);
                val.loads[2] = avenrun[2] << (SI_LOAD_SHIFT - FSHIFT);
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #11 : 09-05-2007 04:29 » 

Хммм... Т.е. как я понял, ты привёл мне код, который реализует то, что выдаёт член структуры sysinfo
Код:
unsigned long loads[3];         /* 1, 5, and 15 minute load averages */

Мдас, жаль что в прошлом мало времени уделял особенностям линукс кернела Жаль

А как считается процентальная загрузка той же командой top ? Может исходник какой есть ?
Там отдельно на каждый PID, но общее количество сосчитать думаю нетрудно.
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #12 : 09-05-2007 19:57 » 

Традиционно, информация о процессе берется из /proc/<pid>/ . Посмотри man proc - там объясняется назначение файлов и их формат. Тебе подойдет /proc/<pid>/stat . Время измеряется там в тиках. Колличество тиков в секунде для системы можно получить так:
Код: (C)
#include <time.h>
#include <unistd.h>

clock_t ticks_per_second = sysconf(_SC_CLK_TCK);
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #13 : 10-05-2007 04:12 » 

Ну чтение инфы путём парсинга /proc файлов - это не то что мне нужно. А вообще жаль что без танцев с бубном не узнать загрузку процессора всеми процессами. Не знаю как это делается в винде, но думаю всё же проще, хотя не факт.
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 10-05-2007 06:04 » 

MOPO3, а в чем сложность? Парсить там ничего не надо - формат фиксированный - просто используй sscanf(). Пролистать директорию не сложнее, чем пользоваться специализированными ф-иями в винде.

/proc - виртуальная файловая система. Придумана в 70-х и до сих пор применяется. Прелесть текстового интерфейса прежде всего в том, что если разработчики добавят доп.поля в информацию о процессе, то тебе не только переписывать программу - даже перекомпилировать не нужно будет.

Если очень хочется бинарно, то посмотри мануал:
pinfo libc
раздел Resoure Usage And Limitation/Resource Usage
Только эти ф-ии ограничены своим процессом и дочерними (только завершенными).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #15 : 10-05-2007 12:19 » 

MOPO3, а в чем сложность?
Да собственно в том что пишу я XPCOM компонент, а из него когда пытаюсь открывать файлы /proc - то всё ломается и не работает Жаль
Потому собственно и хочется чего-нибудь наподобие системного вызова : sysinfo()

Вот например как выглядит метод который возвращает мне кол-во используемой памяти :
Код:
NS_IMETHODIMP SystemUsage::GetUsedRAM( PRInt32 *_retval )
{
  struct sysinfo s_info;
  int error;
  error = sysinfo(&s_info);
  *_retval = (PRInt32)(s_info.totalram-s_info.freeram); //used RAM

  return NS_OK;
}
« Последнее редактирование: 10-05-2007 12:22 от MOPO3 » Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Антон (LogRus)
Глобальный модератор

ru
Offline Offline
Пол: Мужской
Внимание! Люблю сахар в кубиках!


WWW
« Ответ #16 : 10-05-2007 12:43 » 

посмотри код gkrellm
и выдери от туда получение текущей загруженности проца.
Записан

Странно всё это....
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #17 : 10-05-2007 13:06 » 

посмотри код gkrellm
и выдери от туда получение текущей загруженности проца.
смотрю. всё выдирает из /proc

Эх. придётся танцевать с бубенчиками. Иду пробовать.
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #18 : 10-05-2007 16:10 » 

Да собственно в том что пишу я XPCOM компонент, а из него когда пытаюсь открывать файлы /proc - то всё ломается и не работает Жаль

Если процесс падает, то видимо у тебя где-то не хватает контроля ошибок. Я так думаю.


Собственно, даже не нужно разбирать попроцессно - дальше в мане описана объщеститемная статистика.
Цитата
/proc/uptime

В этом файле содержатся два числа, обозначающие: время работы системы с момента загрузки (в секундах) и время, проведенное системой в ожидании (в секундах).

Цитата
/proc/stat

Статистика ядра/системы. Зависит от архитектуры. Общие записи включают в себя:

cpu  %d %d %d %d

Количество тиков (1/100 секунды), произведенных системой в обычном пользовательском режиме, в пользовательском режиме с низким приоритетом, в системном режиме и в режиме ожидания соответственно. Последнее значение должно быть равно умноженному на 100 значению 2-ого поля в псевдофайле uptime.

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

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Rulik
Помогающий

ru
Offline Offline

« Ответ #19 : 28-02-2008 12:23 » 

Вот если что функция которой я пользуюсь для определения общей загрузки процессора и загрузки по ядрам:

Код:
#include <stdio.h>
#include <sys/times.h>
#include <unistd.h>
#include <time.h>

typedef struct
{
    unsigned long usage[16];
} proc_info_t;
unsigned long GetProcessorLoad(proc_info_t *info)
{
    static unsigned long pre_total[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, pre_used[16]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    unsigned long cpu[16], nice[16], system[16], idle[16];

    FILE *fp;
    if (!(fp = fopen("/proc/stat", "r")))
    {
return 0;
    }
   
    unsigned int index = 0;
    char name[1024];
    do
    {
fgets(name, sizeof(name)-1, fp);
if((name[0] != 'c')&&(name[0] != 'p')&&(name[0] != 'u'))
    break;
sscanf(name, "%*s %d %d %d %d", &cpu[index], &nice[index], &system[index], &idle[index]);
index++;
    }
    while(index < sizeof(cpu));

    fclose(fp);

    unsigned long used[16];
    unsigned long total[16];
    for(unsigned int k = 0; k < index; k++)
    {
used[k] = cpu[k] + system[k] + nice[k];
    total[k] = cpu[k] + nice[k] + system[k] + idle[k];
    }

    unsigned long usage = 0;
   
    for(unsigned int k = 0; k < index; k++)
    {
        if((pre_total[k] == 0)||(pre_used[k] == 0))
{
    info->usage[k] = 0;
        }
        else
        {
    info->usage[k] = (unsigned long)((100 * (double)(used[k] - pre_used[k]))/(double)(total[k] - pre_total[k]));
}
   
pre_used[k] = used[k];
        pre_total[k] = total[k];
    }
    return index-1;
}

int main()
{
    proc_info_t info;
    unsigned long Load = GetProcessorLoad(&info);
   
    for(unsigned int k = 0; k < 10000; k++)
for(unsigned int l = 0; l < 1000000; l++);

    Load = GetProcessorLoad(&info);
    printf("Load (%d)CPUs : Main=%d%, CPU0=%d%, CPU1=%d%\n", Load, info.usage[0],info.usage[1],info.usage[2]);
}
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines