Аватар для buugman
16 / 16 / 2
Регистрация: 04.07.2010
Сообщений: 51

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

10.10.2011, 19:28. Показов 7738. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru