Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Лимит памяти процесса 
V
    Опции темы
CPlusPlusFAN
Дата 13.3.2008, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

Репутация: нет
Всего: нет



Здравствуйте. Я создаю процесс и хочу, чтобы он не мог выделить, например, более 16 Мб. А при возникновении такового факта можно было опознать превышение памяти. К примеру, чтобы выдавалась ошибка или что-то вроде того.

ЗЫ Ещё вопрос про память:
Что означает поле PeakWorkingSetSize структуры PROCESS_MEMORY_COUNTERS, которая используется в функции GetProcessMemoryInfo?
В MSDN написано:
Цитата

Peak working set size, in bytes.

Но от этого понятнее не становится.
PM MAIL ICQ Jabber   Вверх
korian
Дата 13.3.2008, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 651
Регистрация: 8.3.2008
Где: Украина, Харьков

Репутация: 4
Всего: 17



Цитата(CPlusPlusFAN @  12.3.2008,  23:11 Найти цитируемый пост)
Что означает поле PeakWorkingSetSize 

максимум, которое достигало WorkingSetSize

переписывать глобальные new и delete, правда, так можна будет контролировать только размер кучи.
а как контролировать стек, без понятия.

PM   Вверх
dumb
Дата 13.3.2008, 04:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(CPlusPlusFAN @  13.3.2008,  00:11 Найти цитируемый пост)
Я создаю процесс и хочу, чтобы он не мог выделить, например, более 16 Мб.
что ты понимаешь под "выделить" и какова конечная цель? - зачем тебе вообще ограничивать кол-во памяти кому-либо?

варианты:
  • после запуска самостоятельно мониторить потребление памяти процессом посредством той же GetProcessMemoryInfo(WorkingSetSize(размер рабочего набора) - говоря простыми буквами, и есть "объем памяти съедаемой приложением")
  • либо через job'ы:
    Код

    HANDLE hJob = CreateJobObject(0, "MyMegaJob");
    HANDLE hPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);
    JOBOBJECT_ASSOCIATE_COMPLETION_PORT jcp = {};
    jcp.CompletionKey = (void*)1;
    jcp.CompletionPort=hPort;
    SetInformationJobObject(hJob, JobObjectAssociateCompletionPortInformation, &jcp, sizeof(jcp));
    JOBOBJECT_EXTENDED_LIMIT_INFORMATION jl = {};
    jl.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_PROCESS_MEMORY;
    jl.ProcessMemoryLimit = 16000000;
    SetInformationJobObject(hJob, JobObjectExtendedLimitInformation, &jl, sizeof(jl));
    STARTUPINFO si = {sizeof(STARTUPINFO)};
    PROCESS_INFORMATION pi;
    if (CreateProcess("c:\\someproga.exe", "", 0, 0, false, 0, 0, 0, &si, &pi))
    {
      char text[256];
      DWORD nb, ck, op;
      HANDLE H[8] = {pi.hProcess, hPort};

      AssignProcessToJobObject(hJob, pi.hProcess);
      while (WaitForMultipleObjects(2, H, false, INFINITE) == WAIT_OBJECT_0 + 1)
      {
        if (GetQueuedCompletionStatus(hPort, &nb, &ck, (OVERLAPPED**)&op, 0) && ck == 1)
          switch(nb)
          {
    // просто для более полной "картинки"
    //        case JOB_OBJECT_MSG_NEW_PROCESS:
    //        case JOB_OBJECT_MSG_EXIT_PROCESS:
    //        case JOB_OBJECT_MSG_ABNORMAL_EXIT_PROCESS:
    //          break;
            case JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT:
              wsprintf(text, "pid=%08X mem.limit", op);
              MessageBox(0, text, "", 0);
              break;
          }
      }
      MessageBox(0, "end of process", "", 0);
      CloseHandle(pi.hThread);
      CloseHandle(pi.hProcess);
    }
    CloseHandle(hPort);
    CloseHandle(hJob);
  • ...

Цитата(korian @  13.3.2008,  00:32 Найти цитируемый пост)
переписывать глобальные new и delete
это кто такие? smile

PM MAIL   Вверх
CPlusPlusFAN
Дата 13.3.2008, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

Репутация: нет
Всего: нет



Цитата(dumb @  13.3.2008,  04:50 Найти цитируемый пост)
что ты понимаешь под "выделить" и какова конечная цель? - зачем тебе вообще ограничивать кол-во памяти кому-либо?


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


Цитата(dumb @  13.3.2008,  04:50 Найти цитируемый пост)
после запуска самостоятельно мониторить потребление памяти процессом посредством той же GetProcessMemoryInfo(WorkingSetSize(размер рабочего набора) - говоря простыми буквами, и есть "объем памяти съедаемой приложением")


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

Цитата(dumb @  13.3.2008,  04:50 Найти цитируемый пост)
либо через job'ы


А вот это я попробую.
PM MAIL ICQ Jabber   Вверх
dumb
Дата 13.3.2008, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



Цитата(CPlusPlusFAN @  13.3.2008,  11:01 Найти цитируемый пост)
Программа, которую я запускаю, абсолютно неконтролируема и может выделить сколько угодно памяти
какая хорошая программа... может тогда лучше ее не запускать? smile или аналогов этому глюкалу нету?

Цитата(CPlusPlusFAN @  13.3.2008,  11:01 Найти цитируемый пост)
поскольку постоянный мониторинг памяти, хоть и в параллельном потоке, будет притормаживать работу процесса
какого еще процесса? - если в отдельном потоке, то оно всю систему будет "притормаживать". и потом, ясное дело, подразумевается использование Sleep'а между вызовами, либо вообще по таймеру.
PM MAIL   Вверх
MAKCim
Дата 13.3.2008, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 1
Всего: 207



 smile 
как все запущено
в Linux все решается через setrlimit()  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
CPlusPlusFAN
Дата 13.3.2008, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

Репутация: нет
Всего: нет



Цитата(dumb @  13.3.2008,  12:45 Найти цитируемый пост)
какая хорошая программа... может тогда лучше ее не запускать?  или аналогов этому глюкалу нету?


Запускать её необходимо, более того, у меня есть её исходник, но его трогать нельзя, а то по шапке дадут. smile 
Скажем так, аналоги есть, но они бесполезны.
PM MAIL ICQ Jabber   Вверх
CPlusPlusFAN
Дата 13.3.2008, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

Репутация: нет
Всего: нет



Как-то JOB'ы не очень соотносятся с циклом выполнения процесса:

Код

while (works)
{
            rs=WaitForDebugEvent(&de,wait)!=0;
            ...
            ContinueDebugEvent(de.dwProcessId,de.dwThreadId,status);
}


Боюсь, WaitForMultipleObjects(2, H, false, INFINITE) заглушит получение сообщений об ошибках.
PM MAIL ICQ Jabber   Вверх
dumb
Дата 13.3.2008, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 27
Всего: 158



так надо было сразу сказать, что у тебя процесс запускается под отладкой.

в таком случае ожидание на pi.hProcess вообще не нужно, да и ожидание сообщения от job'а можно выкинуть(из вышеприведенного примера убрать все, что связано с hPort) - оставить только установку лимита: после исчерпания оного в приложении возникнет исключение и к тебе в цикл отладчика "приедет" уведомление о нем.
PM MAIL   Вверх
CPlusPlusFAN
Дата 14.3.2008, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

Репутация: нет
Всего: нет



Спасибо ещё раз, dumb!

Цитата(dumb @  13.3.2008,  21:58 Найти цитируемый пост)
так надо было сразу сказать, что у тебя процесс запускается под отладкой.


Я не знал, что это играет какую-то роль. Но как присмотрелся и увидел WaitForMultiplyObjects понял, что это важно.

dumb, я тебе уже + поставил за ответ. Ты настоящий профи!

Это сообщение отредактировал(а) CPlusPlusFAN - 14.3.2008, 15:46
PM MAIL ICQ Jabber   Вверх
andrew_121
Дата 15.3.2008, 04:32 (ссылка)  | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 2
Всего: 33




Модератор: Сообщение скрыто.



--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0900 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.