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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как лимитировать память для приложения 
:(
    Опции темы
drdeath
  Дата 12.7.2009, 04:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 12.7.2009

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



лимитировать или хотя-бы определить сколько памяти использует приложение интересует как линукс так и windows
PM MAIL   Вверх
GremlinProg
Дата 12.7.2009, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(drdeath @  12.7.2009,  06:44 Найти цитируемый пост)
как лимитировать память для приложения

какой именно памяти?

физическую можно "ограничить" с помощью SetProcessWorkingSetSize
в кавычках потому, что этот лимит спокойно можно обойти, используя AWE API

а вот виртуальную, в принципе не ограничить,
каждый процесс может потреблять все адресное пространство (32- или 64-битное),
можно только определить, сколько виртуальной памяти можно выделить, не расширяя файла подкачки - GetPerformanceInfo:
Цитата(PERFORMANCE_INFORMATION::CommitLimit @ MSDN)

The current maximum number of pages that can be committed by the system without extending the paging file(s). This number can change if memory is added or deleted, or if pagefiles have grown, shrunk, or been added. If the paging file can be extended, this is a soft limit.

т.е. любой вызов VirtualXXX сразу влияет на эту характеристику в процессе

хотя ни кто не мешает просто заранее отрезать кусок памяти, нужного объема, который не должен использоваться,
но это глупо )), лимит будет формальным

посмотреть текущий уровень загрузки памяти всех видов можно с помощью GlobalMemoryStatus/Ex

ps: все это касаемо windows


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Vaulter
Дата 12.7.2009, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



как определить:

Код

    std::pair< unsigned long long, unsigned long long >
    procinfo_GetProcessMemoryUsageBytes()
    {
#ifdef WIN32
        HANDLE  hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, procinfo_GetProcessId());
        if (hProcess)
        {
            PROCESS_MEMORY_COUNTERS tMemCounters;
            memset(&tMemCounters, 0, sizeof(tMemCounters));
            tMemCounters.cb = sizeof(PROCESS_MEMORY_COUNTERS);
            if (GetProcessMemoryInfo(hProcess, &tMemCounters, sizeof(tMemCounters)))
            {
                ::CloseHandle(hProcess);
                return ( std::make_pair( tMemCounters.WorkingSetSize, tMemCounters.WorkingSetSize) );
            }
            ::CloseHandle(hProcess);
        }
        assert(0);
        return ( std::make_pair( 0, 0) ); // Failed to query

#else // WIN32
    FILE* statm;
    unsigned long long virtual_memory_size, resident_set_size;
    int scan_status;
    statm = fopen("/proc/self/statm", "r");
    if (statm)
    {
        scan_status = fscanf(statm, "%llu %llu", &virtual_memory_size, &resident_set_size);
        fclose(statm);
        if (scan_status == 2)
        {
            long sz = sysconf(_SC_PAGESIZE);
            return ( std::make_pair( virtual_memory_size * sz, resident_set_size * sz ) );
        }
    }
        return ( std::make_pair( 0, 0) ); // Failed to query

#endif // !WIN32
    }


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



--------------------
PM MAIL WWW ICQ   Вверх
dumb
Дата 12.7.2009, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



PM MAIL   Вверх
GremlinProg
Дата 12.7.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



да, dumb, с жобами гораздо интереснее,
только, как я понимаю, это только мониторинг, а не лимитирование,
не так ли?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
dumb
Дата 12.7.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



не, там именно квотирование - если лимит исчерпан, то следующие попытки выделения памяти завершатся ошибкой.
с учетом того, как нонче пишут программы, это практически 100% обрушение процесса. smile
PM MAIL   Вверх
GremlinProg
Дата 12.7.2009, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(dumb @  12.7.2009,  19:32 Найти цитируемый пост)
с учетом того, как нонче пишут программы, это практически 100% обрушение процесса.

это был мой следующий вопрос ))

какой статус будет поднят при исключении?
STATUS_NO_MEMORY или что-то свое, типа ERROR_NOT_ENOUGH_QUOTA?

кстати, это лимитирование именно виртуальных ресурсов (в состоянии commited):
Цитата(JOBOBJECT_BASIC_LIMIT_INFORMATION vs JOB_OBJECT_LIMIT_PROCESS_MEMORY @ MSDN)

Causes all processes associated with the job to limit their committed memory. When a process attempts to commit memory that would exceed the per-process limit, it fails. If the job object is associated with a completion port, a JOB_OBJECT_MSG_PROCESS_MEMORY_LIMIT message is sent to the completion port.

кто пробовал (или собирается), отпишитесь, думаю интересно будет всем


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

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


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

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


 




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


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

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