А может кто знает, как средствами языка Си узнать, что выделенная тобой динамическая память была хотя быраз за время выполнения программы скинута на жесткий диск из-за нехватки оперативки?
Реально очень важно!
А может кто знает, как средствами языка Си узнать, что выделенная тобой динамическая память была хотя быраз за время выполнения программы скинута на жесткий диск из-за нехватки оперативки?
Реально очень важно!
Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.
18 декабря 2008 в 10:01
ну так залочь выделяемые страницыи результаты у тебя будут вполне стабильные без секса.
18 декабря 2008 в 10:01
>Ну теоретически возможность есть.. только реализуется она не средствами user-mode а средствами kernel-mode. Необходимо считать из каталогов страниц PDE и PTE – дискрипторы, которые несут в себе полную информацию о страницах памяти…
если мне не изменяет память то этой инфы в этих таблицах нету. Там есть флаг разрешения свапирования и флаг отсутствия страницы в памяти но флага что страница свапировалась на 99% нету. Искать доку- лень …
18 декабря 2008 в 9:04
Мда, неслабо, думал, будет немного попроще. Мне еще это и реализовать на MacOS надо…
Зачем это может понадобиться – не секрет – меряю performance функций. Если выделенная память начинает перемещаться на хард, то результатам доверять нельзя – они очень нестабильны.
18 декабря 2008 в 0:05
Никакое не сумасшествие Хотя бы для понимания принципов работы разобраться не помешает! Тем более что в книге все очень доступно описано. Сам пробовал поработать с таблицами – очень интересно получается.. правда для этого нужно драйвер писать.. или взять готовые примеры
17 декабря 2008 в 21:03
Да это сумасшествие – через PDE/PTE/дескрипторы
Такую возможность в действительности можно рассматривать как только теоретическую, либо чисто в "научно-извратительных" целях ))
Чем вам мой вариант (#4) не устраивает (взятый, кстати, из книги Джеффри Рихтера – Windows для профессионалов)?
17 декабря 2008 в 21:00
Ну теоретически возможность есть.. только реализуется она не средствами user-mode а средствами kernel-mode. Необходимо считать из каталогов страниц PDE и PTE -дискрипторы, которые несут в себе полную информацию о страницах памяти… правда прийдется преобразовывать виртуальные адресса в физические и.т.д. и не факт что информация на момент преобразования будет достоверной…
В общем хорошо об этом написано в книге
Свена Шрайбера – Недокументироване возможности Windows 2000.
17 декабря 2008 в 17:05
интересно зачем это могло понадобится. вероятней всего такой возможности нет – так как для её реализации потребовалось бы извратится. А для M$ нехарактерно извращатся в этом месте …
в большинстве юниксов такой возможности точно нету
16 декабря 2008 в 20:03
Вроде вопрос то был, как узнать, что память была сброшена или нет, а не как ее сделать несбрасываемой.
Для этого есть метод, использующий сброс памяти (resetting). (См. MSDN, функция VirtualAlloc, там где про флаг MEM_RESET).
Смысл в том, что отбирание сброшенных страниц ОС происходит примерно по такой же стратегии, что и свопирование. Поэтому, если мы узнаем, что у нас отобрали сброшенную страницу, то, в аналогичной ситуации у нас бы засвопили нормальную страницу, так что это даст представление о том, будет ли производится свопирование.
Последовательность такая:
1. Записать на страницу какие-нибудь данные
2. Сбросить страницу (делается вызовом VirtualAlloc с флагом MEM_RESET)
3. Поделать что-нибудь, что может затребовать дополнительную память. При этом сброшенная страница может быть отобрана ОС для соответствующих нужд.
4. Считать, что лежит в этой странице. Если страница была отобрана, то считаются нули, и мы считаем, что оперативной памяти программе не хватает. Если страница не была отобрана, то считаются те самые данные, которые мы записали.
Метод конечно не для использования в реальной программе (так как данные, записанные на страницу, теряются), а для проведения эксперимента по выяснению, сколько надо памяти.
16 декабря 2008 в 16:03
Ну не всегда извращение. Всякие там ключи и пароли свопить по определению нельзя.
16 декабря 2008 в 11:01
Смешал килограммы с метрами…
не средствами "С", а средствами Операционной системы!
Вообще вся виртуальная память процесса, как только он запускается проецируется с диска в память, но не вся сразу, а подгружается по запросу! Любая выделенная тобой память принадлежащая User-mode обречена на свопирование на диск если ты не сделаешь ей что то типа VirtualLock.
Смотри в сторону функций VirtualLock/VirtualUnlock/VirtualQuery
А вообще делать такое в крайнее извращение…