Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/40: Рейтинг темы: голосов - 40, средняя оценка - 4.70
 Аватар для buugman
16 / 16 / 2
Регистрация: 04.07.2010
Сообщений: 51

Узнаем количество свободной памяти программно.

10.10.2011, 19:28. Показов 7724. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
C++
1
2
3
4
5
6
7
8
9
unsigned long int MarkClInfo_t::MarkGetFreeMemory()
{
    unsigned long int FreeMem = 0;
    struct sysinfo info;
    sysinfo(&info);
    FreeMem =  info.freeram/(1024*1024);
    cout<<"FreeMemory       : "<<FreeMem<<" Mb"<<endl;
    return FreeMem;
}
Проблема в том что Linux кеширует память и соответственно, на выходе количество свободной памяти меньше чем если посмотреть в /proc/meminfo. Как узнать количество кешированной памяти? Читать кол-во свободной памяти из meminfo не предлогать. Да и вообще странно почему Linux так много памяти кеширует? При вызове функции он показывал свободной памяти 68 мб хотя meminfo показывал 2.5 гб.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.10.2011, 19:28
Ответы с готовыми решениями:

Как средствами QT вывести количество свободной памяти?
День добрый! может кто подскажет Как средствами QT вывести количество свободной памяти?

Определить количество полной и свободной памяти видеокарты
Здравствуйте дорогие форумчане! С наступающим новым годом! Мне в своей программе нужно получить общий размер памяти видеокарты, и было бы...

В ворде узнаем программно есть ли сеть интернет
здравствуйте, пробую код: Option Explicit Private Declare Function InternetGetConnectedState Lib &quot;wininet.dll&quot; _ ...

7
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
10.10.2011, 20:05
Цитата Сообщение от buugman Посмотреть сообщение
FreeMem = info.freeram/(1024*1024);
На info.mem_unit умножить забыли.
0
 Аватар для buugman
16 / 16 / 2
Регистрация: 04.07.2010
Сообщений: 51
10.10.2011, 23:15  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
На info.mem_unit умножить забыли.
а что будет если не множить?
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
11.10.2011, 00:06
Цитата Сообщение от buugman Посмотреть сообщение
а что будет если не множить?
Вот такое и будет:
Цитата Сообщение от buugman Посмотреть сообщение
При вызове функции он показывал свободной памяти 68 мб хотя meminfo показывал 2.5 гб.
Вариантов то нет на самом деле:
единица измерения свободной/.../занятой памяти страница, do_sysinfo() (это сискол такой) пытается перевести страницы в байты, но не всегда это у него получается (например 32битная система и много памяти или 64 бита но просто дохрена памяти + огромный своп). Ну и само-собой /proc/meminfo берет данные там же где и sysinfo(). Во общем никто не обещает отдавать эту статистику в байтах (на современных ядрах).
1
 Аватар для buugman
16 / 16 / 2
Регистрация: 04.07.2010
Сообщений: 51
11.10.2011, 01:22  [ТС]
Цитата Сообщение от g_u_e_s_t Посмотреть сообщение
Вот такое и будет:


Вариантов то нет на самом деле:
единица измерения свободной/.../занятой памяти страница, do_sysinfo() (это сискол такой) пытается перевести страницы в байты, но не всегда это у него получается (например 32битная система и много памяти или 64 бита но просто дохрена памяти + огромный своп). Ну и само-собой /proc/meminfo берет данные там же где и sysinfo(). Во общем никто не обещает отдавать эту статистику в байтах (на современных ядрах).
Значит мне повезло, на моей машине страницы памяти переводятся в байты, но я всеравно домножил на mem_unit чтоб уж наверняка, правда от этого ничего не поменялось. У меня 64 битка, много памяти и как раз своп большой 8гб. Да и помоему sysinfo как раз данные из /proc и берет.

Да кстати если очистить кеш, то кол-во памяти показываемой sysinfo == кол-ву свободной памяти в /proc/meminfo.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
11.10.2011, 09:07
Цитата Сообщение от buugman Посмотреть сообщение
правда от этого ничего не поменялось.
Тогда даже и не знаю... они просто не могут все время показывать сильно разное...

Цитата Сообщение от buugman Посмотреть сообщение
Да и помоему sysinfo как раз данные из /proc и берет.
Нет.

Давайте смотреть:
/proc/meminfo: живет в fs/proc/meminfo.c интересующие нас поле показывает так (коменты мои):
C
1
2
3
4
5
6
7
8
9
10
#define K(x) ((x) << (PAGE_SHIFT - 10)) /* Перевод страниц в килобайты. */
si_meminfo(&i);                         /* Вот откуда статистика (mm/page_alloc.c). */
...
seq_printf(m,
  "MemTotal:       %8lu kB\n"
  "MemFree:        %8lu kB\n"
   ...
   K(i.totalram),
   K(i.freeram),
   ...
sysinfo: живет в kernel/timer.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
        si_meminfo(info);
        ...
        mem_total = info->totalram + info->totalswap;
        if (mem_total < info->totalram || mem_total < info->totalswap)
                goto out;
        /* Попытка перевода страниц в байты. */
        bitcount = 0;
        mem_unit = info->mem_unit;
        while (mem_unit > 1) {
                bitcount++;
                mem_unit >>= 1;
                sav_total = mem_total;
                mem_total <<= 1;
                if (mem_total < sav_total)
                      goto out;
       }
 
        info->mem_unit = 1;
        info->totalram <<= bitcount;
        info->freeram <<= bitcount;
        ...
1
 Аватар для buugman
16 / 16 / 2
Регистрация: 04.07.2010
Сообщений: 51
11.10.2011, 13:47  [ТС]
Спасибо за помощь . Сегодня все показывает как надо, но загадка осталась. Хотя я ничего не менял в коде, поставил ноут ночью в спящий режим. Сегодня включил и все встало на свои места, осталось понять что вчера было не так. Надо искать в каких случаях Linux кэширует память и для чего он это делает.
0
1259 / 650 / 44
Регистрация: 06.02.2011
Сообщений: 1,654
12.10.2011, 08:37
Цитата Сообщение от buugman Посмотреть сообщение
Хотя я ничего не менял в коде, поставил ноут ночью в спящий режим. Сегодня включил и все встало на свои места, осталось понять что вчера было не так.
Прям сказки вы рассказываете...
Два варианта, у вас патченное ядро (не могу представить зачем какому то вендору понадобилось что-то править в показанных мной местах). Ну либо вы что-то сочиняете/не туда посмотрели в выводе /proc/meminfo

Цитата Сообщение от buugman Посмотреть сообщение
Надо искать в каких случаях Linux кэширует память и для чего он это делает
Можете считать что если не было явного запрета на кэширование, то всегда. Цель - производительность.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.10.2011, 08:37
Помогаю со студенческими работами здесь

Недостаточно свободной памяти
Совсем недавно, когда Sims 3 стал выдавать ошибки, я по советам в файле подкачки изменил значение. С тех пор начинались ошибки в торренте...

Засорение свободной памяти
Здравствуйте. Не так давно обнаружилась проблема: Вся свободная память забивается неизвестно чем. Антивирусы не находят ничего. ...

Недостаточно свободной памяти
Не устанавливается приложение WhatsApp на телефон, на андроид 4.3. В google play приложение скачивается, а при установке выходит сообщение...

Алгоритм списка свободной памяти
Кто нибудь знает что это за алгоритм? Вообще по заданию нужно создать менеджер памяти, который знает, сколько какой поток занимает памяти...

Определить размер свободной памяти
Здравствуйте, товарищи программисты! А не подскажете, как определить количество свободной оперативной памяти? нашел для Дельфи: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru