RAM памет и С++

16 отговора 779 прегледа
#1

RAM памет и С++

Въпросът ми е как да проверя количеството текуща свободна RAM памет. В програмката която правя се заделя динамично масив, но изискването е да не може да се задели повече от свободната RAM.
Каква функция може да ми свърши работа (С/С++) ?

Благодаря на всички отзовали се.

Отговор
в отговор на Larkin #2

Re: RAM памет и С++

Струва ми се, че няма функция от стандартните библиотеки, все пак memory management-a е специфичен за всяка ОС. Трябва да провериш в ОС зависимите библиотеки...

Все пак не съм сигурен де, от доста време не пиша сериозно на С/С++

Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Отговор
в отговор на Larkin #3

OS dependent

Зависи от ОС-а. Според мен това което имаш като изискване е глупост. На какво се надяваш? Че няма да накараш системата да swap-ва ли? В системите с виртуална памет неможе да имаш такива надежди. Освен това, какво е свободна памет?
Ето сега се логвам и пиша:
well:~# cat /proc/meminfo
total: used: free: shared: buffers: cached:
Mem: 128917504 122994688 5922816 0 64991232 35971072
Swap: 542826496 0 542826496
MemTotal: 125896 kB
MemFree: 5784 kB
MemShared: 0 kB
Buffers: 63468 kB
Cached: 35128 kB
SwapCached: 0 kB
Active: 32700 kB
Inactive: 67952 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 125896 kB
LowFree: 5784 kB
SwapTotal: 530104 kB
SwapFree: 530104 kB
well:~#
Както виждаш 5М свободна памет. Но ако поискам на системата още 50М ще ги получа и тя (най-вероятно) няма да свапне. Това което искаш да направиш е не само зависимо от ОС-а но зависи и от стратегията на Virtual Memory Manager-а и от (произволни) други зададени от администратора параметри.

What evil shall I do today?
Отговор
в отговор на G.Kreisel #4

Всъщност,

ако имаш желание, можеш да помолиш учтиво vm manager-а да не swap-ва страниците ти.

Наистина, трябва да използваш средства на платформата, но може.

Понякога седя и си мисля, а понякога само си седя ...

П.П.
Ето статия по въпроса за Linux.

Редактирано от Masklin на

Отговор
в отговор на Masklin #5

10x

Мерси за линка. Аз също се заинтересувах от проблема, но мнението ми си остава непроменено (конкурс: може ли да се намери и един човек на този форум дето някога си е променил мнението? :) )
Считам че това си е нарушение на "стройната архитектура на операционната система" (мой термин). Не случайно въпросните функции работят само за процеси с UID 0. Доколкото видях има и други ограничения (RLIMIT_MEMLOCK).
Въпреки, че (вече очевидно) имаме търсения интерфейс, продължавам да смятам че е EVIL да се използва. Даже EVIL^ 2. ;)

What evil shall I do today?
Отговор
в отговор на G.Kreisel #6

Re: 10x

конкурс: може ли да се намери и един човек на този форум дето някога си е променил мнението? - хех

Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
Отговор
в отговор на G.Kreisel #7

Не ограничавай общността

Има програми (обикновено real-time или близки до такива), за които е важно да работят със сравнително предвидима скорост. То си го пише и в статията, де

Сега като се замисля, май почти няма програма, за която не е важно колко бързо работи. Не, не точно така ... важното е интерфейсът й с потребителя да е жив. Сещаш се - не да кажеш cancel и докато зацепи ... аха и да свърши. Работа си де

Значи ОС трябва вероятно да предостави средства да се заключват и интерфейсните части, при определени условия. Ама това в момента ми дойде в главата и не съм се замислял особено как да стане и какви брадви има в идеята ми.

Понякога седя и си мисля, а понякога само си седя ...
Отговор
в отговор на Larkin #8

Re: RAM памет и С++

ако питаш за виндовс, имаше една функция GlobalMemoryStatus, тя може да ти помогне. обаче не вярвай на стойноста на dwAvailPhys - в повечето случаи е занижена и можеш да заявиш много повече от нея, без да врътне харда. по добре разчитай на dwTotalPhys - тя е гарантирано вярна и можеш да си назначиш някакъв процент от нея, който да ползваш ти. обаче има едно неудобство - трябва да знаеш колко си заявил до момента. за съжаление не знам как можеш да го получиш, без да си броил байтове. ако някой знае, може да се обади, щото и мене ме вълнува въпроса как да се избегне swapа.

Отговор
в отговор на zaphod #9

Re: RAM памет и С++

Няма начин да избегнеш суопа в многозадачна ОС, това е утопия. Нали една от функциите на ядрото е да ти дава памет, без да те е грижа откъде я взима, на колко парчета е и пр. За теб тя си е последователна и е изцяло в RAM-а.

Да речем, че намираш колко е наистина свободната памет и я алокираш. Нали в следващия момент друг процес ще алокира своя си памет и твоята къде ще се дене, ако не на диска?

Има драйвери, които изискват паметта да е на точно определено място и тя естествено не се суопва, ама става въпрос за малки количества памет.

Та след това предисловие има два начина. Единият е да махнеш виртуалната памет. Тогава нищо не се суопва, включително и твоята памет. Тоест, алокирането не е успешно, ако не можеш да се побереш в наличната RAM.

Другият начин е процесът на алокиране да не става в user, а в kernel space-а. Тогава VMM няма да ти пипа твоята памет, когато търси какво да суопне. Как ще си хакнеш ядрото, вече си е твой проблем.

Отговор
в отговор на Larkin #10

Re: RAM памет и С++

В днешно време "свободна памет" е доста абстрактно понятие. И C/C++ няма никакво отношение към нея (както, всъщност, и към всичко останало). Така че е добре да споменеш за каква платформа (ОС + хардуер) става въпрос, защото иначе не съществува отговор на запитването ти.



Отговор
в отговор на Pekoнcтpykтop #11

Re: RAM памет и С++

За Windows става дума, но като гледам останалите мнения явно е трудна работа да се направи.
Все пак трябва да има начин защото повечето математически програми (като Матлаб) имат подобни възможности. Например ако зададеш някоя система диференциални уравнения с множество итерации резервират масив само в RAM паметта, ако тя не стига ти казват, че е малко и не може да се реши. Ако размера на масива не се знае предварително в момента в който се изчерпи RAM решението се прекратява. Последното зависи от някой настройки .... но явно има начин да се направи така ....

Отговор
в отговор на G.Kreisel #12

Вън от контекста!

G.Kreisel: /*... */ конкурс: /*... */ "стройна/*та */ архитектка на операционната система" (мой термин). /* ...

Отговор
в отговор на Larkin #13

Re: RAM памет и С++

Ами най-сигурния начин е като получиш грешка, когато се опитваш да заделяш.
Иначе - при многозадачна ОС понятието "свободна памет" е по-скоро "свободна памет в определен момент"

Т.е. дори и да имаш X килобайта свободни, това не означава, че в следващия момент можеш да ги заделиш

Отговор
в отговор на hoopla #14

Re: RAM памет и С++

не ти говоря за алокиране на всичката свободна, а на определен процент, да речем 80%. това на практика гарантира липса на суоп - личен опит. а и не всички програми са хотелски бази данни, както май е разпространено да се мисли напоследък. нашите приложения например работят гарантирано сами в системата, и остават само системните процеси, от които внезапна заявка за големи количества е практически изключена. освен това не става въпрос за ГАРАНТИРАНО премахване на супа, а за минимизиране на вероятноста да се случи. има програми, на които прекъсването на работата им, дори за половон секунда е неприятно и се избягва.

Отговор
в отговор на Larkin #15

Re: RAM памет и С++

Тук има една примерна дискусия по темата. Разгледай Memory Management API-то и по-специално ф-иите започващи с Virtual... Има една ф-я VirtualLock - обърни и специално внимание.



Отговор
в отговор на Larkin #16

Re: RAM памет и С++

Нещо не мога да разбера, защо ти е да знаеш колко RAM имаш за да заделиш нещо си? Трябва ти успешна алокация, и ако е, какво те интересува от къде е? За много специални случаи можеш да изискаш малко страници да ти бъдат pin-нати в RAM-a ама това е за малки количества. Това не е особеност на уиндоус, така е при всички общо взето.
Matlab не прави нищо специално - алокира си памет по нормалния начин... за да алокираш 128MB не е необходимо да имаш 128MB RAM, а просто достатъчно виртуална памет. Ако не ти стига - увеличи си пейдж файла. За NT адресното пространство за процес мисля беше 2GB, така че теоретично няма проблем процеса ти да заема толкова, независимо колко RAM имаш (ама теоретично ;)))....

Отговор
в отговор на pyrx #17

:)

Доста време си мислех, че Andrea Arcangeli е хакерка (-та, която отговаря за Virtual Memory Subsystem в Линукс :) ) После видях, че е един младеж с набола брадичка и много се разочаровах :) Пустите италиянци, що не си сложат човешки имена :)

What evil shall I do today?

Редактирано от G.Kreisel на

Отговор