[вопрос] про память в винде

katrin2201

Проблема: памяти больше 1.5Гб не выделяется. При достижении этой планки новые приложения просто молча перестают открываться. При этом своп включен, оперативки 2 гига. Нотификейшена в трее, что щас память кончится не выводится. Система просто молча затыкается. Если лишнее позакрывать, то оживает.
В общем, симптомы почти аналогичны достижению предела по committed memory, но в данном случае до этого предела далеко.
Вопрос: втф? как фиксить?
Конфиг:
Винда xpsp2 x86 с включенным виндовсапдейтом.
кора2 e6750. 2 гига физической памяти.
boot.ini: /noexecute=optin /fastdetect /3GB (без /3GB те же яйца)

serega1604

может у тебя мать не может увидеть больше чем 1.5?

Dasar

предистория какая?
раньше было иначе? раньше на это не обращали внимания? комп новый?

okis

а она их точно все видит ?

katrin2201

Думаю, что мать все видит, ибо винда видит два гига.

katrin2201

Комп рабочий, похож на новый. Насколько я могу судить, данный эффект присутствовал всегда.
Раньше просто было наплевать, а сейчас окошки plsqldev плодятся со страшной силой, замучался закрывать/открывать.

vall

что за программы? может они тупо лочат себе память.

katrin2201

Обычный девелоперский набор, с которым нигде больше проблем не возникает. Ну разве что упомянутый выше Allrounds PL/SQL Developer только на работе пускаю.
Вообще, идея интересная, но я что-то плохо представляю, как можно залочить память так, чтоб ее не было видно в том же коммиттед мемори.

kruzer25

Например, у меня на 910 чипсете при установке 2гб памяти в дополнение к напаянным 512мб биос видит 2гб, а винда - где-то 2.5гб, где-то 2гб, и при этом адски глючит.
Возможно, с учётом всяких зарезервированных адресов 1.5гб реальной памяти - ограничение твоего чипсета.
UPD: Увидел, что у тебя core2 - вряд ли дело в этом, всё-таки достаточно новое железо.

vall

а свопа сколько? я не помню позволяет ли винда делать overcommit

katrin2201

свопа два гига
оверкоммит почти наверняка не умеет. это вообще, афаир, исключительно линуксам присуще. по крайней мере по дефолту =)

vall

ну вот, она намапила 4гига и всё. больше замапить не может, хотя даже физическая память есть.

katrin2201

Она эту намапленую память сразу в коммитед мемори отображает =)
Вспомни недавнее обсуждение, про своп в рамдиске свыше 4гигов как средство обхода ограничения в 4 гига в виндовсХП и им подобным.
Я там приводил ссылку на прожку, которая была специально написана для подобных тестов. Афаир, все, что она делает - тупо маллочит память. Все намапленное сразу падает в коммитед мемори.

katrin2201

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

vall

адресное пространство не резервируется, оно просто выделяется сразу сколько попросили.
терминология простая: если идёт анонимный (без файла) или приватный (cow) мапинг
то либо идёт резервирование хранилища под него (reserve) или не идёт (возможен overcommit)
а собственно при обращении выделяется оперативная память, заполняется как надо и подвязывается в pte (commit)

katrin2201

да, просто, как я понял, под маппеньем и резервированием в мире винды, терминами которого я пулялся, подразумевают немного иную семантику, поэтому я и оговорился.
//
то же резервирование памяти в винде - это какое то отдельное от маллока апи (которое правда мне не удалось найти за минуту гугленья которое именно резервирует определенный кусок виртуального адресного пространства, не резервируя при этом ничего другого

katrin2201

Из веселого: проблема, кажется, решилась сама. Грешу на отключенный недавно O&O CleverCache. Так-то...

juliuzz

а может просто поставился апдейтом третий сервиспак? :)

katrin2201

нед, версия венды не поменялась

Serab

то же резервирование памяти в винде - это какое то отдельное от маллока апи (которое правда мне не удалось найти за минуту гугленья которое именно резервирует определенный кусок виртуального адресного пространства, не резервируя при этом ничего другого
В винде виртуальные страницы выделяются в два этапа: саначала VirtualAlloc(..., MEM_RESERVE): просто метятся соответствующие страницы виртуального пространства как зарезервированные, при обращении все равно будет AV. Как деталь: можно резервировать только начиная с границы allocation granularity (64KB afair).
Потом зарезервированную память можно закоммитить: VirtualAlloc(..., MEM_COMMIT при этом выделяется соответствующее место в файле подкачки. Теперь уже можно работать с памятью. Коммитить уже можно постранично, все будет тип-топ.
Можно, конечно, вызывать VirtualAlloc( ..., MEM_RESERVE | MEM_COMMIT чтобы сделать оба действия за один вызов.
Все это автоматически делается для стека потока, например: зарезервировано сразу под стек, коммитится по мере использования (используется GUARD-флаг).
Это так, для тех, кто путается в терминологии.

katrin2201

VirtualAlloc(..., MEM_RESERVE)
Ага, пасибо, это и хотелось нагуглить.
Оставить комментарий
Имя или ник:
Комментарий: