RAM памет и С++
16 отговора
779 прегледа
RAM памет и С++
Въпросът ми е как да проверя количеството текуща свободна RAM памет. В програмката която правя се заделя динамично масив, но изискването е да не може да се задели повече от свободната RAM.
Каква функция може да ми свърши работа (С/С++) ?
Благодаря на всички отзовали се.
Каква функция може да ми свърши работа (С/С++) ?
Благодаря на всички отзовали се.
Re: RAM памет и С++
Струва ми се, че няма функция от стандартните библиотеки, все пак memory management-a е специфичен за всяка ОС. Трябва да провериш в ОС зависимите библиотеки...
Все пак не съм сигурен де, от доста време не пиша сериозно на С/С++
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
Все пак не съм сигурен де, от доста време не пиша сериозно на С/С++
Мечтата е мисъл, мисълта е идея, всяка идея се реализира. Аз не мечтая, а реализирам идеите си.
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?
Ето сега се логвам и пиша:
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?
Всъщност,
ако имаш желание, можеш да помолиш учтиво vm manager-а да не swap-ва страниците ти.
Наистина, трябва да използваш средства на платформата, но може.
Понякога седя и си мисля, а понякога само си седя ...
П.П.
Ето статия по въпроса за Linux.
Наистина, трябва да използваш средства на платформата, но може.
Понякога седя и си мисля, а понякога само си седя ...
П.П.
Ето статия по въпроса за Linux.
Редактирано от Masklin на
10x
Мерси за линка. Аз също се заинтересувах от проблема, но мнението ми си остава непроменено (конкурс: може ли да се намери и един човек на този форум дето някога си е променил мнението? :) )
Считам че това си е нарушение на "стройната архитектура на операционната система" (мой термин). Не случайно въпросните функции работят само за процеси с UID 0. Доколкото видях има и други ограничения (RLIMIT_MEMLOCK).
Въпреки, че (вече очевидно) имаме търсения интерфейс, продължавам да смятам че е EVIL да се използва. Даже EVIL^ 2. ;)
What evil shall I do today?
Считам че това си е нарушение на "стройната архитектура на операционната система" (мой термин). Не случайно въпросните функции работят само за процеси с UID 0. Доколкото видях има и други ограничения (RLIMIT_MEMLOCK).
Въпреки, че (вече очевидно) имаме търсения интерфейс, продължавам да смятам че е EVIL да се използва. Даже EVIL^ 2. ;)
What evil shall I do today?
Re: 10x
конкурс: може ли да се намери и един човек на този форум дето някога си е променил мнението? - хех
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...
Не ограничавай общността
Има програми (обикновено real-time или близки до такива), за които е важно да работят със сравнително предвидима скорост. То си го пише и в статията, де
Сега като се замисля, май почти няма програма, за която не е важно колко бързо работи. Не, не точно така ... важното е интерфейсът й с потребителя да е жив. Сещаш се - не да кажеш cancel и докато зацепи ... аха и да свърши. Работа си де
Значи ОС трябва вероятно да предостави средства да се заключват и интерфейсните части, при определени условия. Ама това в момента ми дойде в главата и не съм се замислял особено как да стане и какви брадви има в идеята ми.
Понякога седя и си мисля, а понякога само си седя ...
Сега като се замисля, май почти няма програма, за която не е важно колко бързо работи. Не, не точно така ... важното е интерфейсът й с потребителя да е жив. Сещаш се - не да кажеш cancel и докато зацепи ... аха и да свърши. Работа си де
Значи ОС трябва вероятно да предостави средства да се заключват и интерфейсните части, при определени условия. Ама това в момента ми дойде в главата и не съм се замислял особено как да стане и какви брадви има в идеята ми.
Понякога седя и си мисля, а понякога само си седя ...
Re: RAM памет и С++
ако питаш за виндовс, имаше една функция GlobalMemoryStatus, тя може да ти помогне. обаче не вярвай на стойноста на dwAvailPhys - в повечето случаи е занижена и можеш да заявиш много повече от нея, без да врътне харда. по добре разчитай на dwTotalPhys - тя е гарантирано вярна и можеш да си назначиш някакъв процент от нея, който да ползваш ти. обаче има едно неудобство - трябва да знаеш колко си заявил до момента. за съжаление не знам как можеш да го получиш, без да си броил байтове. ако някой знае, може да се обади, щото и мене ме вълнува въпроса как да се избегне swapа.
Re: RAM памет и С++
Няма начин да избегнеш суопа в многозадачна ОС, това е утопия. Нали една от функциите на ядрото е да ти дава памет, без да те е грижа откъде я взима, на колко парчета е и пр. За теб тя си е последователна и е изцяло в RAM-а.
Да речем, че намираш колко е наистина свободната памет и я алокираш. Нали в следващия момент друг процес ще алокира своя си памет и твоята къде ще се дене, ако не на диска?
Има драйвери, които изискват паметта да е на точно определено място и тя естествено не се суопва, ама става въпрос за малки количества памет.
Та след това предисловие има два начина. Единият е да махнеш виртуалната памет. Тогава нищо не се суопва, включително и твоята памет. Тоест, алокирането не е успешно, ако не можеш да се побереш в наличната RAM.
Другият начин е процесът на алокиране да не става в user, а в kernel space-а. Тогава VMM няма да ти пипа твоята памет, когато търси какво да суопне. Как ще си хакнеш ядрото, вече си е твой проблем.
Да речем, че намираш колко е наистина свободната памет и я алокираш. Нали в следващия момент друг процес ще алокира своя си памет и твоята къде ще се дене, ако не на диска?
Има драйвери, които изискват паметта да е на точно определено място и тя естествено не се суопва, ама става въпрос за малки количества памет.
Та след това предисловие има два начина. Единият е да махнеш виртуалната памет. Тогава нищо не се суопва, включително и твоята памет. Тоест, алокирането не е успешно, ако не можеш да се побереш в наличната RAM.
Другият начин е процесът на алокиране да не става в user, а в kernel space-а. Тогава VMM няма да ти пипа твоята памет, когато търси какво да суопне. Как ще си хакнеш ядрото, вече си е твой проблем.
Re: RAM памет и С++
В днешно време "свободна памет" е доста абстрактно понятие. И C/C++ няма никакво отношение към нея (както, всъщност, и към всичко останало). Така че е добре да споменеш за каква платформа (ОС + хардуер) става въпрос, защото иначе не съществува отговор на запитването ти.
Re: RAM памет и С++
За Windows става дума, но като гледам останалите мнения явно е трудна работа да се направи.
Все пак трябва да има начин защото повечето математически програми (като Матлаб) имат подобни възможности. Например ако зададеш някоя система диференциални уравнения с множество итерации резервират масив само в RAM паметта, ако тя не стига ти казват, че е малко и не може да се реши. Ако размера на масива не се знае предварително в момента в който се изчерпи RAM решението се прекратява. Последното зависи от някой настройки .... но явно има начин да се направи така ....
Все пак трябва да има начин защото повечето математически програми (като Матлаб) имат подобни възможности. Например ако зададеш някоя система диференциални уравнения с множество итерации резервират масив само в RAM паметта, ако тя не стига ти казват, че е малко и не може да се реши. Ако размера на масива не се знае предварително в момента в който се изчерпи RAM решението се прекратява. Последното зависи от някой настройки .... но явно има начин да се направи така ....
Вън от контекста!
G.Kreisel: /*... */ конкурс: /*... */ "стройна/*та */ архитектка на операционната система" (мой термин). /* ... 

Re: RAM памет и С++
Ами най-сигурния начин е като получиш грешка, когато се опитваш да заделяш.
Иначе - при многозадачна ОС понятието "свободна памет" е по-скоро "свободна памет в определен момент"
Т.е. дори и да имаш X килобайта свободни, това не означава, че в следващия момент можеш да ги заделиш
Иначе - при многозадачна ОС понятието "свободна памет" е по-скоро "свободна памет в определен момент"
Т.е. дори и да имаш X килобайта свободни, това не означава, че в следващия момент можеш да ги заделиш
Re: RAM памет и С++
не ти говоря за алокиране на всичката свободна, а на определен процент, да речем 80%. това на практика гарантира липса на суоп - личен опит. а и не всички програми са хотелски бази данни, както май е разпространено да се мисли напоследък. нашите приложения например работят гарантирано сами в системата, и остават само системните процеси, от които внезапна заявка за големи количества е практически изключена. освен това не става въпрос за ГАРАНТИРАНО премахване на супа, а за минимизиране на вероятноста да се случи. има програми, на които прекъсването на работата им, дори за половон секунда е неприятно и се избягва.
Re: RAM памет и С++
Тук има една примерна дискусия по темата. Разгледай Memory Management API-то и по-специално ф-иите започващи с Virtual... Има една ф-я VirtualLock - обърни и специално внимание.
Re: RAM памет и С++
Нещо не мога да разбера, защо ти е да знаеш колко RAM имаш за да заделиш нещо си? Трябва ти успешна алокация, и ако е, какво те интересува от къде е? За много специални случаи можеш да изискаш малко страници да ти бъдат pin-нати в RAM-a ама това е за малки количества. Това не е особеност на уиндоус, така е при всички общо взето.
Matlab не прави нищо специално - алокира си памет по нормалния начин... за да алокираш 128MB не е необходимо да имаш 128MB RAM, а просто достатъчно виртуална памет. Ако не ти стига - увеличи си пейдж файла. За NT адресното пространство за процес мисля беше 2GB, така че теоретично няма проблем процеса ти да заема толкова, независимо колко RAM имаш (ама теоретично ;)))....
Matlab не прави нищо специално - алокира си памет по нормалния начин... за да алокираш 128MB не е необходимо да имаш 128MB RAM, а просто достатъчно виртуална памет. Ако не ти стига - увеличи си пейдж файла. За NT адресното пространство за процес мисля беше 2GB, така че теоретично няма проблем процеса ти да заема толкова, независимо колко RAM имаш (ама теоретично ;)))....
:)
Доста време си мислех, че Andrea Arcangeli е хакерка (-та, която отговаря за Virtual Memory Subsystem в Линукс :) ) После видях, че е един младеж с набола брадичка и много се разочаровах :) Пустите италиянци, що не си сложат човешки имена :)
What evil shall I do today?
What evil shall I do today?
Редактирано от G.Kreisel на