Память проги

Тема в разделе "WASM.ASSEMBLER", создана пользователем SolidCode, 19 янв 2005.

  1. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan
    Как уменьшить размер памяти, который отводится для стандартной Win32 проги?

    А то делаешь прогу размером 1Кб, а в памяти она занимает несколько мегов.

    Сильно не пинайте.
     
  2. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    Вообшето изменить значения в PE заголовке(Размер секций), если речь про вирт память.



    На чём пишешь и чем компилешь?
     
  3. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Если посчитать юзер виртуальную память процесса , то так и получится пару мегов (w2k), а что там такс манагер показывает х.з.
    Код (Text):
    1. <font color="green]Address      Size (Decimal) Owner                      Section Contains     Type          Access</font><!--color-->
    2. 00010000 00001000 (4096.)            00010000 (itself)                      Priv 00021004 RW
    3. 00020000 00001000 (4096.)            00020000 (itself)                      Priv 00021004 RW
    4. 0006D000 00001000 (4096.)            00030000                               Priv 00021104 RW
    5. 0006E000 00002000 (8192.)            00030000                  stack        Priv 00021104 RW
    6. 00070000 00003000 (12288.)           00070000 (itself)                      Priv 00021004 RW
    7. 00080000 00003000 (12288.)           00080000 (itself)                      Map  00041004 RW
    8. <font color="red]00090000 00016000 (90112.)           00090000 (itself)                      Map  00041002 R
    9. 000B0000 0002F000 (192512.)          000B0000 (itself)                      Map  00041002 R
    10. 000E0000 00041000 (266240.)          000E0000 (itself)                      Map  00041002 R
    11. 00130000 00004000 (16384.)           00130000 (itself)                      Map  00041002 R</font><!--color-->
    12. 00400000 00001000 (4096.)   test     00400000 (itself)         PE header    Imag 01001002 R
    13. 00401000 00001000 (4096.)   test     00400000          .flat   code,imports Imag 01001002 R
    14. 77F80000 00001000 (4096.)   ntdll    77F80000 (itself)         PE header    Imag 01001002 R
    15. 77F81000 00045000 (282624.) ntdll    77F80000          .text   code,exports Imag 01001002 R
    16. 77FC6000 00005000 (20480.)  ntdll    77F80000          ECODE   code         Imag 01001002 R
    17. 77FCB000 00004000 (16384.)  ntdll    77F80000          PAGE    code         Imag 01001002 R
    18. 77FCF000 00003000 (12288.)  ntdll    77F80000          .data   data         Imag 01001002 R
    19. 77FD2000 00028000 (163840.) ntdll    77F80000          .rsrc   resources    Imag 01001002 R
    20. 77FFA000 00002000 (8192.)   ntdll    77F80000          .reloc  relocations  Imag 01001002 R
    21. 793A0000 00001000 (4096.)   kernel32 793A0000 (itself)         PE header    Imag 01001002 R
    22. 793A1000 0005F000 (389120.) kernel32 793A0000          .text   code,imports Imag 01001002 R
    23. 79400000 00004000 (16384.)  kernel32 793A0000          .data   data         Imag 01001002 R
    24. 79404000 00052000 (335872.) kernel32 793A0000          .rsrc   resources    Imag 01001002 R
    25. 79456000 00004000 (16384.)  kernel32 793A0000          .reloc  relocations  Imag 01001002 R
    26. <font color="red]7F6F0000 00007000 (28672.)           7F6F0000 (itself)                      Map  00041020 R E
    27. 7FFB0000 00024000 (147456.)          7FFB0000 (itself)                      Map  00041002 R</font><!--color-->
    28. 7FFDE000 00001000 (4096.)            7FFDE000 (itself)         data block   Priv 00021040 RWE
    29. 7FFDF000 00001000 (4096.)            7FFDF000 (itself)                      Priv 00021040 RWE
    30. <font color="red]7FFE0000 00001000 (4096.)            7FFE0000 (itself)                      Priv 00021002 R</font><!--color-->
    Чем больше библиотек юзает прога, тем больше память :)

    Кста, красным выделил страницы, доступны только для чтения из юзера
     
  4. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan
    Вообще-то меня интересовали возможности опций компилятора по уменьшению используемой памяти.

    Но, судя по данным от bogrus, получается, что любая прога юзает хотя бы kernel32.dll. А с ней и ntdll.dll. И тут уже никакие опции компилятора не помогут. Прога всё-равно будет жрать память как дура, пытаясь разместить эти библиотеки.
     
  5. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Это виртуальная память, ее можно жрать. А физически системные DLL грузятся в единственном экземпляре, и в каждом процессе живут не они сами, а их дУхи :) Запусти тыщу килобайтно-мегабайтного размера, и сам все увидишь: формально винда должна подохнуть в жутких мучениях, исчерпав и память, и своп. Но не подохнет!
     
  6. Turkish

    Turkish New Member

    Публикаций:
    0
    Регистрация:
    25 окт 2004
    Сообщения:
    80
    Адрес:
    Russia
    Код подгружаемых DLL не хранится в свопе (если не изменен), а грузится страницами прямо из файла на диске. А прога занимает как минимум 3 страницы: заголовок, код и стек. те 12 кило.
     
  7. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Больше занимает, до того как код проги получит управление, ntdll и kernel уже работают со стеком, PEB'ом, хипом и другими страницами, т.ч. они уже в ОЗУ, а те к которым обращений не было, то могут и не присутствовать. Другое дело, что менеджер памяти, если её мало и другим задачам не хватает, то может сбросить страницы, а переключение контекстов происходит около 300 раз в секунду, Page Fault'ы можно тоже посмотреть у себя CPUMon'ом, иногда 0, иногда 3 страницы за секунду. Гиблое дело замерять точно, может Get\SetProcessWorkingSetSize кому поможет (The "working set" of a process is the set of memory pages currently visible to the process in physical RAM memory)
     
  8. SolidCode

    SolidCode New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2002
    Сообщения:
    162
    Адрес:
    Kazakhstan
    Я спросил по поводу того, что делаешь какую-нибудь прогу типа Hello world, а она занимает в памяти 1,5 мегов, хотя на диске лишь 1 кб. И тут же висят процессы размером сотни, а то и десятки килов всего. Обидно.
     
  9. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Так я и говорю: расслабься. Твоя программа реально в памяти занимает очень мало килобайт, а Таск Манагер - дуру гонит, складывая объем твоей проги с объемом всех загруженых в ее адресное пространство DLL. Реально системные DLL существуют в физической памяти в единственном экземпляре. Запусти две незапакованные однокилобайтные программы параллельно и сам увидишь, как изменится объем занятой памяти.
     
  10. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine




    В NT ? Что-то меня грызут сомнения ... Ведь системные длл-ки имеют свои данные и не факт, что они одинаковы для каждого процесса, значит, по крайней мере страницы .data существуют во многих экземплярах. А с другой стороны системные длл грузятся всегда по одному виртуальному адресу (возможно так легче мапить их на физические?), но этому можно найти объяснение (ускоряется загрузка и их "связывание")
     
  11. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    SolidCode >




    Это из-за того, что прога GUI.

    Виндос выделяет тучу памяти под окно для MessageBox, очередь сообщений и т.п.
     
  12. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    harley




    Процесс ест сколько и когда ему надо, чем больше библиотек тем больше им необходимо памяти, тоже можно сказать о буферах, с одним KERNEL32.dll можно насоздавать тучу массивов и постоянно работать с ними (страницами памяти), физ. память по таскманагеру будет расти пока весь RAM не займет, а тогда начнется нехватка и когда ты обратишся к странице виртуальной памяти (которой нет в физической), тогда менеджер выберет давно используемую? страницу, если была изменена - скинет в своп, если нет, то сразу перенесет на её место новую (а ту уже достанет откуда брал, если конечно она ещё понадобится), кажется так ... а представь когда работает множество процессов и очень мало памяти, а если они ещё с окнами на экране, между которыми лихорадочно переключаешься, то эти страницы летают как угорелые и при переходе на очередное окно наблюдаем жужжание винта, медленную перерисовку окон и заторможеное реагирование на кнопки, т.ч. у других таскменеджер может показывать совсем не так как у тебя