Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Ключ /3GB


Тимохов Дима ©   (25.12.17 19:33

Коллеги, здравствуйте!

1. Ситуация.

1.1. Т.к. моя 32х битная программа используется на 100% на 64х битных Windows, то решил использовать виртуальной памяти больше, чем 2Гб.

1.2. Вспомнил, что у Рихтера было про ключ /3GB. Покопался в интернете. Нашел интересный материал http://www.gunsmoker.ru/2011/04/windows-spin-off.html.
Там сказано, что нужен флаг {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}. Так и сделал.

1.3. В результате:
  а. На 32х битной Windows XP: MyProg.exe /3GB позволяет максимально выделить 1.7Гб (здесь и далее выделяю кусками по 10Мб).
  б. На 32х битной Windows XP: MyProg.exe позволяет максимально выделить 1.7Гб.
  в. На 64х битной Windows 7: MyProg.exe /3GB позволяет максимально выделить 3.7Гб.
  г. На 64х битной Windows 7: MyProg.exe позволяет максимально выделить 3.7Гб.

2. Вопросы:

2.1. На что вообще влияет /3GB? Эксперимент говорит о том, что он ни на что не влияет.
А всю зависит от ключа IMAGE_FILE_LARGE_ADDRESS_AWARE.

2.2. Про "подводные камни" GunSmoker написал: могут быть проблемы, если программа предполагала, что старший бит в pointer'е всегда 0.
Может есть у кого опыт верификации работы с 3.7 Гб памяти?
Может режим какой-нибудь специальный включить? GunSmoker писал про режим "Top Down", но у него ссылка "битая". Я не понял.
Поделитесь, пожалуйста.

Спасибо!


Rouse_ ©   (25.12.17 20:43[1]

А ты каким макаром замерял то? Через VirtualAlloc первые 2 гига откушай и проверь, запустится ли софт. Могу завтра модулек прислать, который это дело тестит.


Тимохов Дима ©   (25.12.17 21:35[2]

Просто брал по 10Мб обычным GetMem'ом.
Ну и программа у меня реально более 2Гб хотела (почему и задумался о ключе /3GB).
После добавления флага IMAGE_FILE_LARGE_ADDRESS_AWARE программа заработала. Причем с огромным запасом. Как минимум, добиться out of memory на рабочих данных мне не удалось.


Тимохов Дима ©   (25.12.17 21:36[3]


> Rouse_ ©   (25.12.17 20:43) [1]

Еще. Мне не надо 2Гб сразу. Мне достаточно 3Гб в сумме. А как там FastMM будет память резервировать - это его дело.


Тимохов Дима ©   (26.12.17 22:48[4]


> Rouse_ ©   (25.12.17 20:43) [1]
> А ты каким макаром замерял то?

Для пущей надежности:
  а. Выделил, сколько выделилось (3.7 Гб)
  б. Проинициализировал каждый байт.
  в. Проверил потом, что значение в выделенной памяти сохранилось.
  г. И все без ключа /3GB.
И что это значит?


Eraser ©   (27.12.17 00:26[5]


> Тимохов Дима ©   (25.12.17 19:33) 

решения с IMAGE_FILE_LARGE_ADDRESS_AWARE это костыль. нужно менять архитектуру и выносить задачи, требующие значительное потребление памяти в отдельные процессы. я с этим сталкивался, только не по причине нехватки памяти, а по причине ее фрагментации и за счет этого разрастания даже на 64 процессах.

проще, конечно, перейти на современную версию Делфи и 64 бита, но ты же помню уверял, что работает - не трожь и на современные версии только хипстеры переходят, не дословно, но смысл такой )


Игорь Шевченко ©   (27.12.17 10:02[6]

http://www.gunsmoker.ru/2011/04/windows-spin-off.html


Тимохов Дима ©   (27.12.17 11:37[7]


> Eraser ©   (27.12.17 00:26) [5]

Да, я ретроград. Но не от жизни хорошей. Времени реально нет на 64 бита перейти - и все из-за уникода.
Посему ставлю костыли.
Пока все успешно работает (без /3GB, но с IMAGE_FILE_LARGE_ADDRESS_AWARE).
Но, когда что-то работает, а ты не понимаешь, почему, то это тревожный знак.
Вот и хочу разобраться.


> Игорь Шевченко ©   (27.12.17 10:02) [6]
> http://www.gunsmoker.ru/2011/04/windows-spin-off.html

Игорь, я же и привел эту ссылку. Но там нет ответа - зачем нужен /3GB
Есть миф 9, где сказано, что и без /3GB есть > 2Гб.
Вот и встал вопрос - а зачем вообще ключ /3GB нужен и на что он влияет.


Styx ©   (27.12.17 11:38[8]

Что-то вы не то обсуждаете. Ключ /3GB работает только на 32-разрядной системе, и не новее XP и 2003-его сервера. И действует на всю систему, так как пишется в boot.ini. Куда и как Вы писали этот ключ семёрке, я не знаю, но у неё такого ключа нет.


dmk ©   (27.12.17 15:32[9]

>и все из-за уникода
Бред. На 64 битах анси используется без проблем.
В настройках «Long strings by default» ставишь в false.
Если асма нет, то вообще почти ничего не надо переписывать.
А потом VirtualAlloc решает все. Любые блоки, любого размера.


Игорь Шевченко ©   (27.12.17 18:42[10]

Тимохов Дима ©   (27.12.17 11:37) [7]


> Но там нет ответа - зачем нужен /3GB


Есть. В первых же строках - адресное пространство процесса разделяется иначе, не 2 гб пользователю и 2 системе, а 3 гб пользователю и 1 системе.
Нужен он для того, чтобы 32-х битный процесс в 32-х битной системе мог совокупно выделить больше 2-х гб памяти.


Pavia ©   (27.12.17 19:37[11]


>  На 32х битной Windows XP: MyProg.exe /3GB позволяет максимально
> выделить 1.7Гб (здесь и далее выделяю кусками по 10Мб).

Вы ключ не правильно применяете. Его надо в Boot.ini вставлять и применяется он к kernel.sys
Если ядро 32 битное, то оно кушает 2 Гб с этим ключом только 1 гик.
Ключ понадобился для совместимости со старыми драйверами. Это было временное решение. Так что помимо прочего надо тестировать ОС с разными сервис паками и бетасорки.


Тимохов Дима ©   (27.12.17 23:20[12]

Елки, я пропустил у Gunsmoker'а ссылку на описание /3GB (https://msdn.microsoft.com/en-us/library/ff556232(VS.85).aspx)
И почему-то думал (по старой памяти - подводит, видимо), что это ключ запуска программы.
Теперь все понятно.

Это для 32х битных программ на 32х битных ОС.
И ставить его надо не там, где я его ставил, а в Boot.ini.
Т.е. на 64х битных ОС моя программа с флагом IMAGE_FILE_LARGE_ADDRESS_AWARE будет всегда брать до 3.7 Гб памяти.
Мне нигде /3GB использовать не надо.
Все понятно, спасибо!


> dmk ©   (27.12.17 15:32) [9]
> >и все из-за уникода
> Бред. На 64 битах анси используется без проблем.

Слушай, ну я же лучше знаю, сколько у меня прямой работы с памятью и использования p: PChar, как p+1 для лазанья по памяти. Да, код дерьмовенький, но писан давно. И все эти места надо править и тестировать.
Все, что выпускал Марко Кенту по поводу перехода на уникод я прочел. Из прочитанного понял, что работы предстоит много.
Так, что бред или не бред - не тебе решать.
К тому же я пытался билдить это все еще на XE - есно ничегошеньки не работает.


dmk ©   (28.12.17 03:32[13]

>Так, что бред или не бред - не тебе решать.
Да я и не пытался :) Надеялся исключительно на пользу совета.


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо