singlepost

Свопирование памяти и Си << На главную или назад  

А может кто знает, как средствами языка Си узнать, что выделенная тобой динамическая память была хотя быраз за время выполнения программы скинута на жесткий диск из-за нехватки оперативки?

Реально очень важно!

13 ответов в теме “Свопирование памяти и Си”

  1. 10
    Vitaly Ch ответил:

    ну так залочь выделяемые страницыи результаты у тебя будут вполне стабильные без секса.

  2. 9
    Vitaly Ch ответил:

    >Ну теоретически возможность есть.. только реализуется она не средствами user-mode а средствами kernel-mode. Необходимо считать из каталогов страниц PDE и PTE – дискрипторы, которые несут в себе полную информацию о страницах памяти…

    если мне не изменяет память то этой инфы в этих таблицах нету. Там есть флаг разрешения свапирования и флаг отсутствия страницы в памяти но флага что страница свапировалась на 99% нету. Искать доку- лень …

  3. 8
    Иван Афанасьев ответил:

    Мда, неслабо, думал, будет немного попроще. Мне еще это и реализовать на MacOS надо…

    Зачем это может понадобиться – не секрет – меряю performance функций. Если выделенная память начинает перемещаться на хард, то результатам доверять нельзя – они очень нестабильны.

  4. 7
    Cyber Max ответил:

    Никакое не сумасшествие :) Хотя бы для понимания принципов работы разобраться не помешает! Тем более что в книге все очень доступно описано. Сам пробовал поработать с таблицами – очень интересно получается.. правда для этого нужно драйвер писать.. или взять готовые примеры :)

  5. 6
    Александр Lert ответил:

    Да это сумасшествие – через PDE/PTE/дескрипторы :)
    Такую возможность в действительности можно рассматривать как только теоретическую, либо чисто в "научно-извратительных" целях :) ))

    Чем вам мой вариант (#4) не устраивает (взятый, кстати, из книги Джеффри Рихтера – Windows для профессионалов)?

  6. 5
    Cyber Max ответил:

    Ну теоретически возможность есть.. только реализуется она не средствами user-mode а средствами kernel-mode. Необходимо считать из каталогов страниц PDE и PTE -дискрипторы, которые несут в себе полную информацию о страницах памяти… правда прийдется преобразовывать виртуальные адресса в физические и.т.д. и не факт что информация на момент преобразования будет достоверной…

    В общем хорошо об этом написано в книге
    Свена Шрайбера – Недокументироване возможности Windows 2000.

  7. 4
    Vitaly Ch ответил:

    интересно зачем это могло понадобится. вероятней всего такой возможности нет – так как для её реализации потребовалось бы извратится. А для M$ нехарактерно извращатся в этом месте …

    в большинстве юниксов такой возможности точно нету

  8. 3
    Александр Lert ответил:

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

    Для этого есть метод, использующий сброс памяти (resetting). (См. MSDN, функция VirtualAlloc, там где про флаг MEM_RESET).

    Смысл в том, что отбирание сброшенных страниц ОС происходит примерно по такой же стратегии, что и свопирование. Поэтому, если мы узнаем, что у нас отобрали сброшенную страницу, то, в аналогичной ситуации у нас бы засвопили нормальную страницу, так что это даст представление о том, будет ли производится свопирование.

    Последовательность такая:
    1. Записать на страницу какие-нибудь данные
    2. Сбросить страницу (делается вызовом VirtualAlloc с флагом MEM_RESET)
    3. Поделать что-нибудь, что может затребовать дополнительную память. При этом сброшенная страница может быть отобрана ОС для соответствующих нужд.
    4. Считать, что лежит в этой странице. Если страница была отобрана, то считаются нули, и мы считаем, что оперативной памяти программе не хватает. Если страница не была отобрана, то считаются те самые данные, которые мы записали.

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

  9. 2
    Дмитрий Соколов ответил:

    Ну не всегда извращение. Всякие там ключи и пароли свопить по определению нельзя.

  10. 1
    Cyber Max ответил:

    Смешал килограммы с метрами…
    не средствами "С", а средствами Операционной системы!
    Вообще вся виртуальная память процесса, как только он запускается проецируется с диска в память, но не вся сразу, а подгружается по запросу! Любая выделенная тобой память принадлежащая User-mode обречена на свопирование на диск если ты не сделаешь ей что то типа VirtualLock.
    Смотри в сторону функций VirtualLock/VirtualUnlock/VirtualQuery
    А вообще делать такое в крайнее извращение…

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.