Почему при выделении памяти VirtualAlloc() в диспетчере задач не происходит скачок?24.10.2020, 01:54. Показов 15561. Ответов 79
Метки нет (Все метки)
Для эксперимента я прошу примерно 50 байт, может немного больше.
Если так.
VirtualAlloc специфическая функция, вполне возможно что она даже не выделяет память а резервирует или выделяет её на жёстком диске.Может ли она выделять физическую память? Какой флаг лучше использовать MEM_TOP_DOWN или MEM_COMMIT?Добавлено через 1 минуту Почему в VirtualFree передаём размер памяти 0 чтобы её освободить?
0
|
|||||||||||
| 24.10.2020, 01:54 | |
|
Ответы с готовыми решениями:
79
Почему происходит ошибка при выделении памяти под массив? Что происходит за кулисами при выделении памяти для переменной?
|
| 20.06.2021, 04:00 [ТС] | |
|
Вот почитал https://docs.microsoft.com/en-... tualmemory, https://docs.microsoft.com/en-... extensions есть функции которые сопоставляют виртуальную память с физической, или которые позволяют переносить виртуальную память на физическую. Я честно говоря толком не понял, какие конкретно шаги нужно проделать чтобы поместить виртуальную память в ОЗУ.
0
|
|
|
Модератор
|
|
| 20.06.2021, 04:56 | |
|
Для обычных ("paged") страниц нужно просто обратиться к странице виртуальной памяти: выполнить инструкцию, расположенную на этой странице или прочитать или записать данные. Если странице с адресом V в адресном пространстве процесса аппаратурой трансляции адресов не сопоставлена страница ОЗУ, то произойдёт аппаратное прерывание программы, и супервизор разберётся с ситуацией. Если где-то в ОЗУ присутствует страница с нужным содержимым по физическому адресу A, то в таблицу трансляции запишет, что физический адрес виртуальной страницы V равен A. И выполнение процесса можно возобновить с точки, где он был прерван. А если в ОЗУ нужной страницы нет, то супервизор запланируем "подкачку" страницы, т.е. чтение из файла, в котором хранится содержимое виртуальной страницы процесса, когда она отсутствует в ОЗУ, в неиспользуемую страницу ОЗУ.
Добавлено через 22 минуты Чтобы разместить в своём адресном пространстве невыгружаемые страницы, Large pages в 64-разрядной программе и AWE в 32-разрядной, процесс 1. Активирует привилегию, позволяющую блокировать страницы в ОЗУ. 2. Добавляет флаг, указанный в документации к AWE или Large pages, вызывая VirtualAlloc* 3. Специальными функциями просит закрепить физические страницы за виртуальными страницами выделенного VirtualAlloc'ом диапазона адресов. Супервизор находит нужное количество неисполъзуемых физических страниц и проставляет в таблицах соответствие для адресного пространства процесса, который запросил невыгруженные страницы.
1
|
|
| 20.06.2021, 07:41 [ТС] | |||||
|
Я так понял что
Что такое MEM_PHYSICAL Зарезервирует диапазон адресов, который можно использовать для сопоставления страниц Address Windowing Extensions (AWE). Я не фига из их каши не понял. Они что-то мутное пишут что даже не понятно что и как происходит и что нужно делать. Добавлено через 2 минуты Я не могу понять с чего вообще должен происходит захват памяти. Нужно искать виртуальную память и постепенно загружаться в физическую раз уж она предусмотрена и поддерживается центральным процессором мат. платы или можно сразу грузиться в ОЗУ. Вот не понятно. Чёткого ответа на этот вопрос не видел. Добавлено через 2 минуты У меня создаётся впечатление что процессор использует одновременно 2 блока памяти виртуальную и физическую это очень странно зачем это делать если можно загрузиться в физическую. Возникает вопрос в какой момент срабатывают алгоритмы сопоставления виртуальной памяти с физической, сразу при загрузке или постоянно на основании того что мы жрём и физическую и виртуальную память. Путаница какае-та.
0
|
|||||
|
Модератор
|
|
| 20.06.2021, 08:44 | |
|
Виртуальные (математические, логические ) адреса используются в программах для доступа к инструкциям ( например, функциям C++ ) и данным.
Физические адреса используются для доступа к аппаратуре машины: внутренним и внешним устройствам, модулям RAM, параллельной flash и т. д. В Windows у каждого процесса свое виртуальное адресное пространство, с момента создания процесса и до его завершения. Никаких блоков памяти пространство не жрет, кроме накладных расходов на таблицы распределения виртуальной памяти. Пространство - это место, где можно что-то разместить.
0
|
|
| 20.06.2021, 09:26 [ТС] | ||
|
Если я правильно понял старт захвата памяти происходит с виртуального адресного пространства, но интересно на сколько они отличаются(виртуальное от физического) и в какой и по какой момент где что храниться. Упоминаний про виртуальную память много а вот его полная функциональность и очерёдность действий не совсем ясна.
0
|
||
|
Модератор
|
|||
| 20.06.2021, 15:43 | |||
|
Добавлено через 33 минуты
0
|
|||
| 20.06.2021, 18:03 [ТС] | |||
|
0
|
|||
|
Модератор
|
||||||
| 21.06.2021, 13:30 | ||||||
|
Nexi99, Кашу перемешивают функции кучи из отладочной библиотеки.
У меня количество commited страниц виртуальной памяти увеличивается, когда работает new, а скачок использования физической памяти программой на ph происходит, когда работает цикл, перебирающий страницы.
/MDd, отладочный new сам перелопачивает все v байтов, и на v сразу увеличивается рабочий набор страниц физической памяти.
0
|
||||||
| 14.12.2022, 21:05 [ТС] | ||
|
Добавлено через 9 минут Вот ещё хорошее описание MMU используется только тогда, когда процессор обращается к памяти (например, при промахе кэша), а все остальное время не используется и экономит электроэнергию. Кроме того, в этом случае MMU почти не влияет на быстродействие процессора. https://ru.bmstu.wiki/index.ph... ew_desktop . Да получается прямого дуступа туда нет он видимо и не нужен. Видимо new принудительно выделяет физическу память, что нужно даже не всегда. Добавлено через 21 минуту Да вот ещё такое описание https://learn.microsoft.com/en... tualmemory Драйверы режима ядра могут использовать NtAllocateVirtualMemory для резервирования диапазона доступных для приложений виртуальных адресов в указанном процессе, а затем выполнять дополнительные вызовы NtAllocateVirtualMemory для фиксации отдельных страниц из зарезервированного диапазона. Это позволяет процессу резервировать диапазон своего виртуального адресного пространства, не потребляя физической памяти до тех пор, пока она не понадобится.
0
|
||
|
Модератор
|
||
| 15.12.2022, 11:33 | ||
|
программа пользователя начинает обращаться к страницам, которые в данный момент отсутствуют в ОЗУ, или пытается изменить содержимое страницы, общей для нескольких процессов (Copy-On-Write)
0
|
||
|
COM‐пропагандист
|
|
| 15.12.2022, 12:21 | |
|
0
|
|
| 16.12.2022, 02:37 [ТС] | ||
AllocateUserPhysicalPages https://learn.microsoft.com/en... sicalpages, она сопоставляет виртуальные страницы с физическими, при этом доступа к адресу нет, этим занимается ядро системы, но он и не нужен, адрес через который пользователь будет обращаться даётся сразу. Если не сопоставить то это произойдёт по тем принципам что вы объяснили мне в этой теме, да и к тому же так написано в инструкции. Если приоритет высокий можно сопоставить.Добавлено через 5 часов 39 минут Перепутал там будет другая функция MapUserPhysicalPagesScatter https://learn.microsoft.com/en... gesscatterДобавлено через 25 минут Сначала вызываем VirtualAlloc, выдиляем вирт. память, потом функцией AllocateUserPhysicalPages, выдиляем физическую размеры долны совпадать, далее нужно сопоставить страницы функцией MapUserPhysicalPages. Только там завуалированные аргументы.
1
|
||
| 18.12.2022, 04:09 [ТС] | ||||||
|
В общем у меня эксперименты такие.
STATUSEX.ullTotalPhys-остаётся неизменным.STATUSEX.ullAvailPhys-должен уменьшиться на 12300(примерно). Здесь он уменьшается слишком сильно.STATUSEX.ullTotalPageFile и STATUSEX.ullAvailPageFile- не понятно что он вообще показывает в обоих случаях.STATUSEX.ullAvailVirtual-падает слишком сильно. Если память выделяется физическая то виртуальная должна остаться такой же, если Виртуальная то должно упасть на 12300(примерно). А не на миллион.INFORMATION.CommitTotal-по идее я выделяю 3 страницы памяти. Но это значение не меняется.INFORMATION.PhysicalTotal-если выделяется виртуальная память а не физическая значение должно измениться на 3, если физическая не измениться.
0
|
||||||
| 21.12.2022, 02:32 [ТС] | ||||||
|
В общем ребята. Получились такие результаты. Функция
VirtualAlloc оказалось слишком спицифической и я даже бы сказал глуппой. Выделить память можно не более 2Гб. При этом память нельзя выделять прямо, например. Нельзя выделить только виртуальную память и тем более физическую. Была бы от неё польза если бы хотябы можно было выделять виртуальную память, например 1 к одному с имеющейся физической. Но даже и это не реализовано, также не совсем понятно и то что есть физическая память почему нет флага который бы прямо использовал бы её, зачем же тогда покупать планки с ОС памятью если её нельзя использовать. В сети читал пишут что функция даже в файл подкачки не всегда загружает данные.В инструкции написано что можно выделять память от 2 до 4 Гб но там нужна привилегия SeLockMemoryPrivilege . О том как её включить я даже не буду и говорить, потому что с безопасностью разработчики переборщили так что ужас, я бы сказал что почти всё программирование свели на нет. Возможно на каких-то серверных ОС она и включается. Я создавал темы по этим привилегиям как их включать и выключать, и это ребята тёмный лес дальняя дорога. Далее что касаемо функции HeapCreate. То она даже Гб памяти не может выделить. Она мажет расшириться после до гигабайта если записать так.Функция HeapReAlloc, всегда меняет указатель, хотя написано что память в новое место не перемещается если есть резерв, т.е. если не вся память исчерпана из HeapCreate.
HeapCreate на больших обёмах со 2ым параметром должна дать 0 чтобы вызвать VirtualAlloc, так написано в инструкции.Далее оператор new тоже не блещет и на нём куча ограничений. В принципе где можно использовать Гб в пользовательских ПО не понятно. Но. Всё начинается после него. Зачем же тогда структура MEMORYSTATUSEX, если нельзя опереться на параметр STATUSEX.ullAvailPhys и полноценно выделить память. Также не понятно зачем виртуальная память если ей управлять нельзя. Почему нет нормальных средств для выделения физ. памяти если она есть и критически нужна. А что будет если будет полноценный софт, мощная программка которой нужна память.
0
|
||||||
|
Модератор
|
|||||||||
| 22.12.2022, 10:47 | |||||||||
|
Добавлено через 39 минут
Добавлено через 1 час 27 минут https://learn.microsoft.com/ru... y-settings https://learn.microsoft.com/ru... -in-memory
0
|
|||||||||
| 22.12.2022, 19:16 [ТС] | ||
|
Добавлено через 24 минуты По ссылкам есть инструкции как включить некоторые привелегии вручную, возникает вопрос а как это сделать программно?
0
|
||
|
Модератор
|
|||
| 23.12.2022, 08:41 | |||
|
Добавление привилегий пользователю Добавлено через 12 минут https://learn.microsoft.com/ru... /windows-3
0
|
|||
| 24.12.2022, 08:21 [ТС] | ||||
LsaAddAccountRights, возникает вопрос действительно ли это работает и к какой уч. записи добавляются привилегии к текущей или создаётся какае-та новая?SeLockMemoryPrivilege указанную в инструкции или в вашей ОС в этом нет необходимости?
0
|
||||
| 24.12.2022, 08:21 | |
|
Помогаю со студенческими работами здесь
60
При закрытом диспетчере задач процессор грузится до 60-100%, при открытии диспетчере падает до 10% Загруженность памяти в диспетчере задач
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
|
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение:
DISM / Online / Add-Capability / CapabilityName:WMIC~~~~
Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
|
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: при создании документов установить период списания автоматически. . .
|
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|
|
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению.
На форме документа создается. . .
|
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
|