Занимаемая процессом память
От: DenisY Россия  
Дата: 23.04.02 11:34
Оценка:
Почему (по крайней мере в Win2k) процессы жрут так много памяти,
и как её уменьшить?

например
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    Sleep(25000);
    return 0;
}

на диске занимает чуть больше 20к, а в памяти чуть больше 500к.

Слышал, конечно, что nt в целях ускорения работы выделяет заранее побольше
памяти, но как этим управлять?
Re: Занимаемая процессом память
От: pg Россия  
Дата: 23.04.02 11:39
Оценка:
Здравствуйте DenisY, Вы писали:

Как тебе вот эта
Автор(ы): Виталий Брусенцев
Дата: 19.01.02
Статья посвящена вопросам оптимизации размера выполняемых модулей, генерируемых различными
компиляторами C++ (основное внимание уделено MS Visual С++). С этой целью рассматриваются особенности Библиотеки исполнения C/C++ и ее реализаций, а также процессы компиляции и компоновки приложений. Приведены практические приемы, позволяющие в ряде случаев уменьшить размер приложения до величины 3-4 килобайта.
статья?
Глеб
Re: Занимаемая процессом память
От: Zero  
Дата: 23.04.02 11:42
Оценка: 1 (1)
Здравствуйте DenisY, Вы писали:

DY>Почему (по крайней мере в Win2k) процессы жрут так много памяти,

DY>и как её уменьшить?

DY>например

DY>
DY>#include <windows.h>
DY>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
DY>{
DY>    Sleep(25000);
DY>    return 0;
DY>}
DY>

DY>на диске занимает чуть больше 20к, а в памяти чуть больше 500к.

DY>Слышал, конечно, что nt в целях ускорения работы выделяет заранее побольше

DY>памяти, но как этим управлять?

А dll-ки она подгружает, а всякие там переменные окружения, стек, CRT-переменные.
Посмтотри здесь статью об уменьшении размера программ отказом от многого в
CRT: www.rsdn.ru/article/?cpp/crt.xml
Автор(ы): Виталий Брусенцев
Дата: 19.01.02
Статья посвящена вопросам оптимизации размера выполняемых модулей, генерируемых различными
компиляторами C++ (основное внимание уделено MS Visual С++). С этой целью рассматриваются особенности Библиотеки исполнения C/C++ и ее реализаций, а также процессы компиляции и компоновки приложений. Приведены практические приемы, позволяющие в ряде случаев уменьшить размер приложения до величины 3-4 килобайта.


Можешь сам посмотреть с помощью Pwalk из MSDN, что она в память грузит.
Re[2]: Статья конечно интересная
От: DenisY Россия  
Дата: 23.04.02 13:12
Оценка:
но немного не про то.
Там все-таки рассказывается как уменьшить размер exeшника

Мне кажется дело в системе, а не в компиляторе.
для такой программы 500к на стек и переменные??
A Pwalk я в msdn'e нашел, а в VC(6) нет где он там?

Здравствуйте Zero, Вы писали:

Z>А dll-ки она подгружает, а всякие там переменные окружения, стек, CRT-переменные.

Z>Посмтотри здесь статью об уменьшении размера программ отказом от многого в
Z>CRT: www.rsdn.ru/article/?cpp/crt.xml
Автор(ы): Виталий Брусенцев
Дата: 19.01.02
Статья посвящена вопросам оптимизации размера выполняемых модулей, генерируемых различными
компиляторами C++ (основное внимание уделено MS Visual С++). С этой целью рассматриваются особенности Библиотеки исполнения C/C++ и ее реализаций, а также процессы компиляции и компоновки приложений. Приведены практические приемы, позволяющие в ряде случаев уменьшить размер приложения до величины 3-4 килобайта.


Z>Можешь сам посмотреть с помощью Pwalk из MSDN, что она в память грузит.
Re: Занимаемая процессом память
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.04.02 21:50
Оценка:
Здравствуйте DenisY, Вы писали:

DY>Почему (по крайней мере в Win2k) процессы жрут так много памяти,

DY>и как её уменьшить?

Очень просто... Если в компьютере два дима, то вынимаешь один и... вуаля! Если один, то придется потрахаться в поиске другого. Если серьезно, то это оптимизация позволяющая работать приложениям быстрее. В конце концов занятая под процесс память — виртульная...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Занимаемая процессом память
От: SergH Россия  
Дата: 23.04.02 22:33
Оценка:
Здравствуйте VladD2, Вы писали:

VD>Очень просто... Если в компьютере два дима, то вынимаешь один и... вуаля! Если один, то придется потрахаться в поиске другого. Если серьезно, то это оптимизация позволяющая работать приложениям быстрее. В конце концов занятая под процесс память — виртульная...


Кстати, а что такое "занимаемая процессом память"? Используемая в данный момент оперативная? Вся виртуальная? Виртуальная с dll & exe? среднее арифмитическое? Я понимаю, что это словосочетание можно использовать в разных смыслах, интересно что показывает Task meneger.
Делай что должно, и будь что будет
Re[3]: Занимаемая процессом память
От: Alex Fedotov США  
Дата: 23.04.02 22:44
Оценка:
Здравствуйте SergH, Вы писали:

SH>Здравствуйте VladD2, Вы писали:


VD>>Очень просто... Если в компьютере два дима, то вынимаешь один и... вуаля! Если один, то придется потрахаться в поиске другого. Если серьезно, то это оптимизация позволяющая работать приложениям быстрее. В конце концов занятая под процесс память — виртульная...


SH>Кстати, а что такое "занимаемая процессом память"? Используемая в данный момент оперативная? Вся виртуальная? Виртуальная с dll & exe? среднее арифмитическое? Я понимаю, что это словосочетание можно использовать в разных смыслах, интересно что показывает Task meneger.


Тask Manager в колонке Mem Usage показывает working set, то есть количество используемой физической памяти.
-- Alex Fedotov
Re[3]: Ещё бы не интересная. :)
От: Zero  
Дата: 24.04.02 07:27
Оценка:
Здравствуйте DenisY, Вы писали:

DY>но немного не про то.

DY>Там все-таки рассказывается как уменьшить размер exeшника

Ну не только. Там сказано, как CRT отрубить от программы. А ещё есть у Мэтта Питрека статья в MSJ
1997 и 1998 Что-то типа Liposuction for PE... Там на ту же тему.
Отрудаешь CRT — Отрубаешь всякие её переменные, которые память кушают. А она по умолчанию
и кучу свою создаёт и операции с плавающей точкой инициализирует и много чего ещё.
Можете сами посмотреть в исходниках — файлы crt0*.cpp в каталоге CRT/SRC.
Это вообще полезно — исходники CRT читать.

DY>Мне кажется дело в системе, а не в компиляторе.

DY>для такой программы 500к на стек и переменные??
DY>A Pwalk я в msdn'e нашел, а в VC(6) нет где он там?

Надо Pwalk вытащить из MSDN и скомпилировать в VC.
Ну стек, конечно, сначала не очень много места занимает, но всё же...
Re: Занимаемая процессом память
От: Владимир Гренадеров Россия  
Дата: 24.04.02 11:29
Оценка: -1
Здравствуйте DenisY, Вы писали:

DY>Почему (по крайней мере в Win2k) процессы жрут так много памяти,

DY>и как её уменьшить?

DY>например

DY>
DY>#include <windows.h>
DY>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
DY>{
DY>    Sleep(25000);
DY>    return 0;
DY>}
DY>

DY>на диске занимает чуть больше 20к, а в памяти чуть больше 500к.

DY>Слышал, конечно, что nt в целях ускорения работы выделяет заранее побольше

DY>памяти, но как этим управлять?

Есть такая функция — SetProcessWorkingSetSize

Вот пример:
SetProcessWorkingSetSize(NULL, -1, -1); // уменьшает working set до 0

Количество используемой памяти действительно уменьшается.
Аналогичный эффект можно получить, задав линкеру (VC)опцию
/WS:AGGRESSIVE — в заголовке PE будет установлен нужный бит
OK
Re[2]: Занимаемая процессом память
От: Zero  
Дата: 24.04.02 11:42
Оценка:
Здравствуйте Владимир Гренадеров, Вы писали:

ВГ>Вот пример:

ВГ>SetProcessWorkingSetSize(NULL, -1, -1); // уменьшает working set до 0

ВГ>Количество используемой памяти действительно уменьшается.

ВГ>Аналогичный эффект можно получить, задав линкеру (VC)опцию
ВГ>/WS:AGGRESSIVE — в заголовке PE будет установлен нужный бит

Совет из разряда — "Если болит голова — Давайте её отрубим и болеть не будет."

Много где я читал, что ручное управление Working Set'ом до добра не доводит.
ОС сама лучше им управляет. Так что не там копаете. :no
Re[4]: Занимаемая процессом память
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.04.02 18:13
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

AF>Тask Manager в колонке Mem Usage показывает working set, то есть количество используемой физической памяти.


Ты лучше как знаток скажи куда девается память (в его показателях) когда делаешь минимайз и рестор?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Занимаемая процессом память
От: Alex Fedotov США  
Дата: 24.04.02 19:12
Оценка:
Здравствуйте VladD2, Вы писали:

AF>>Тask Manager в колонке Mem Usage показывает working set, то есть количество используемой физической памяти.


VD>Ты лучше как знаток скажи куда девается память (в его показателях) когда делаешь минимайз и рестор?


Это известный факт. Когда приложение минимизируется, его рабочее множество сбрасывается в ноль аналогично вызову SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1), вот и все. По мере того, как приложение "трогает" различные участки памяти, рабочее множество начинает расти опять.
-- Alex Fedotov
Re[6]: Занимаемая процессом память
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.04.02 19:57
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

AF>Здравствуйте VladD2, Вы писали:


AF>>>Тask Manager в колонке Mem Usage показывает working set, то есть количество используемой физической памяти.


VD>>Ты лучше как знаток скажи куда девается память (в его показателях) когда делаешь минимайз и рестор?


AF>Это известный факт. Когда приложение минимизируется, его рабочее множество сбрасывается в ноль аналогично вызову SetProcessWorkingSetSize(GetCurrentProcess(), -1, -1), вот и все. По мере того, как приложение "трогает" различные участки памяти, рабочее множество начинает расти опять.


Что факт известный я и сам знаю. Но вот с "рабочими множествами" — это все как-то мудрено. Ты бы лучше на пальцах показал.

PS

Чукча сидит на краю скалистого берега моря...

Всплывает Американская п.л.

— Куда ушла Русская лодка?
— Усла на зюй-зюй-вест.
— Секс...

Проходит время, всплывает Русская лодка
— Куда ушла Американская лодка?
— Усла на зюй-зюй-вест.
— Ты тут не зуйкай! Ты пальцем покажи!!!
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Занимаемая процессом память
От: Владимир Гренадеров Россия  
Дата: 24.04.02 21:44
Оценка:
Здравствуйте Zero, Вы писали:

ВГ>>Вот пример:

ВГ>>SetProcessWorkingSetSize(NULL, -1, -1); // уменьшает working set до 0

ВГ>>Количество используемой памяти действительно уменьшается.

ВГ>>Аналогичный эффект можно получить, задав линкеру (VC)опцию
ВГ>>/WS:AGGRESSIVE — в заголовке PE будет установлен нужный бит

Z>Совет из разряда — "Если болит голова — Давайте её отрубим и болеть не будет."

Я что, предлагаю процесс убить?

Z>Много где я читал, что ручное управление Working Set'ом до добра не доводит.

Z>ОС сама лучше им управляет. Так что не там копаете. :no
И чем же так страшна функция SetProcessWorkingSetSize? Это один из ДОПУСТИМЫХ путей.
Или вся оптимизация должна сводится к борьбе с CRT?
OK
Re[4]: Занимаемая процессом память
От: Zero  
Дата: 25.04.02 08:14
Оценка:
Здравствуйте Владимир Гренадеров, Вы писали:

Z>>Много где я читал, что ручное управление Working Set'ом до добра не доводит.

Z>>ОС сама лучше им управляет. Так что не там копаете. :no
ВГ>И чем же так страшна функция SetProcessWorkingSetSize? Это один из ДОПУСТИМЫХ путей.
ВГ>Или вся оптимизация должна сводится к борьбе с CRT?

В этом конкретном случае — да: "Reducing memory consumption is always a beneficial goal.
If you call SetProcessWorkingSetSize(0xffffffff, 0xffffffff), this tells the system that
your working set can be released. This does not change the current sizing of the working
set, it just allows the memory to be used by other applications. It is a good idea to do
this when your application goes into a wait state".
В случае реальной программы, только при указанных выше условиях. Стоит программе начать
работать, как ОС начнёт сама регулировать размер Working Set'a. А если CRT отрезать,
то памяти будет использоваться меньше независимо от того, работает программа или ждёт чего-то.
Re[5]: Занимаемая процессом память
От: Alex Fedotov США  
Дата: 25.04.02 08:25
Оценка: 3 (1)
Здравствуйте Zero, Вы писали:

Z> В случае реальной программы, только при указанных выше условиях. Стоит программе начать

Z>работать, как ОС начнёт сама регулировать размер Working Set'a. А если CRT отрезать,
Z>то памяти будет использоваться меньше независимо от того, работает программа или ждёт чего-то.

Отрезание CRT большой погоды не сделает. Гораздо важнее правильно проектировать структуры данных, чтобы соблюдать locality of reference. Вот тут кое что есть на эту тему:

http://msdn.microsoft.com/library/en-us/dnvc60/html/optcode.asp

http://msdn.microsoft.com/library/en-us/vccore98/HTML/_core_tips_for_improving_time.2d.critical_code.asp
-- Alex Fedotov
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.