Получение объема свободной RAM (17.05.2022). |
2022 - Май | |||
17.05.2022 17:36 | |||
Первое, что убило: нужно использовать #ifdef Q_OS_LINUX вместо #ifdef Q_OS_LINUX. Иначе, почему-то получался инвертированный результат сравнения. По Windows XP. Для доказательства, какая именно переменная в структуре отвечает за свободную память, пришлось выяснить: - предполагаемое число "Доступно" в диспетчере задач создает иллюзию показа динамически изменяющегося числа RAM - но это число не изменяется при высвобождении RAM исходным кодом. Число изменяется только с выходом из ПО. А в структуре это число всегда динамически меняется сразу и после выделения, и после высвобождения; - предполагаемое число ullAvailVirtual в структуре MEMORYSTATUSEX было очень схожим с ullAvailPageFile - даже при отключенном файле подкачки; - в диспетчере задач абсолютно четко видно изменение яркого зеленого числа "Файл подкачки" и при выделении, и при высвобождении RAM; - полный размер оперативной памяти содержится в ullTotalPhys: физический размер RAM минус RAM, выделенная для встроенной видеокарты в BIOS; - разница между ullTotalPhys и ullAvailVirtual практически равна яркому зеленому числу "Файл подкачки" диспетчера задач; - в итоге, делается акцент на ullAvailVirtual; - остается вопрос, что делать с разницей ullAvailPhys: почему практически всегда изменяется на 4КиБ, ведь он должен быть константой; - в т.ч. отсюда порождается и конечный вопрос: насколько правомерно забивать 100% ullAvailVirtual, если может кто-то влезть. Возможно, нужно забивать 99%; - диспетчер задач Windows 7 тоже глючный, но по-своему: неправильно показывает Свободно, Память. Правильно - Выделение памяти в Мониторе ресурсов. По Lunix: - структура sysinfo прозрачна по названиям, зависимостей между ними не обнаружено; - число totalram показывает реальный физический объем модуля, без вычета занятого встроенной видеокартой, - что логичнее. Когда стало ясно, с какими переменными надо работать, - пошли осложнения: - при сравнении значений структуры номинально, после выделения 1ГиБ RAM (массив qint64 размерностью 134217728) и после его освобождения. При работе в Windows XP обозначилось четкое равенство ullAvailVirtual-ullAvailPhys = 1073741824. Но в Windows 7 это равенство изменилось на ullAvailVirtual = 1073741824; - при попытке выделить больше 1ГиБ Qt v.5.5.1 не оказалась способна к выделению больше ~1.3ГиБ в Windows XP и 7. Эмпирически (в т.ч. корректным выделением 2ГиБ с помошью Borland C++ Builder v.6.0) было доказано: это ошибка именно среды разработки. В свою очередь, Builder отказался забивать больше 0.5ГиБ выделенной памяти. И, в свою очередь, из-за санкций невозможно скачать новую версию Qt с сайта производителя; - работа на разных ЭВМ на Astra Linux v.2.12.43 и Qt v.5.11 показало практически идеальную работу (памяти выделялось много, забивание ее значениями тоже проходило корректно практически по всему доступному объему, 99%). Из этого всего следует: - при работе с RAM нужно тщательно выбирать среду разработки и ее версию (а также, вероятно, и операционную систему). С учетом того, что на эту тему мало информации, - это может быть игрой в русскую рулетку; - текущая корректная комбинация ОС и среды позволяет работать с RAM только в проекте на работе - об универсальности программы и ее алгоритмов пока вообще речи не идет; - получаемое число свободной оперативной памяти - как положение или скорость электрона: можно знать объем RAM - но он через секунду уже устареет. (добавлено 18.05.2022) С включением файла подкачки ситуация в Windows XP изменилась. Ранее было доверие числу ullAvailVirtual - теперь оно стало показывать бредятину: объем больше физического планки. А вот ullAvailPhys начал показывать правильно. И если обращаться к ситуации без файла подкачки (где ullAvailPhys после выделения 1ГиБ показывает фигню несусветную - с чего геморрой и начался), получается: нужно делать ручной анализ на использование файла подкачки в системе - и принимать решение, из какой переменной структуры MEMORYSTATUSEX брать данные. Похоже, написание экспресс-тестера RAM, утерев нос Сэмюэлю Демюльместеру, - отменяется. Слишком много подводных камней, тестирование должно быть во всех известных ОС и во всех возможных комбинациях. |
|||
Обновлено ( 18.05.2022 18:07 ) |