Получение объема свободной RAM (17.05.2022). Печать
2022 - Май
17.05.2022 17:36
Save & Share
Казалось бы, что может быть проще: использовать sysinfo+sysinfo под Linux (sys/sysinfo.h)и MEMORYSTATUSEX+GlobalMemoryStatusEx под Windows (sysinfoapi.h) - и дело в шляпе. А на практике - полная шляпа: алогичное поведение всего и вся.

Первое, что убило: нужно использовать #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 )