Re: 2.2/2.4/2.6 VMs: do malloc() ever return NULL?

Ihar 'Philips' Filipau
2003-11-26T14:33:25Z

William Lee Irwin III wrote:
> On Wed, Nov 26, 2003 at 02:20:58PM +0100, Ihar 'Philips' Filipau wrote:
>
>> So what do you use then in user space to reliably allocate memory?
>> As to me - memory is a resource. Is it virtual or is it physical - it
>>is still resource. And I need to allocate part of this resource.
>> malloc() uses brk() inside. But brk() is "implementation details". I
>>honestly do not care about them - I just want to be sure that what ever
>>resource I have allocated - I can use it afterwards until I shall free
>>it. POSIX even doesn't mention brk() BTW.
>> If you can hint me any other method to allocate memory without
>>surprises - I will really appreciate.
>
>
> Non-overcommit is one such method at the kernel level.
> mlockall(MCL_CURRENT|MCL_FUTURE) is another (requiring support at both
> levels, in addition to administrative grants of privilege).
>

"requiring support at both levels" - what do you mean by this?

In other words, right after I have allocated all memory I need for
functioning properly, I can call mlockall(MCL_CURRENT) - and memory of
my app will be guarantied to be present in memory?
If I have understood from man - it will not be swapped out?
Yeah... Nice. Cool. I have no swap in any way ;-)
I do not need that heavy gun: as I have said looser term of memory
being really allocated before malloc() returns - is enough for me. But
as I have guessed overcommit_memory doesn't guarantie this either.

But it looks like this is more appropriate solution for my situation.
(more apropriate comparing to overcommit_memory)
In critical pathes we use only pool based allocators - so we can lock
them in RAM.

How can I tell the limit of the RAM which can be locked?
My test had shown that single application can lock 112MB of RAM, but
fails to lock 128MB of RAM. (I have 256MB phy RAM - We just cannot find
smaller memory modules on market in any way :-))
Is it limited to less than half of physical RAM?
This would be Ok for me in any way.

...

Little bit more test results (2.4.18, 256MB RAM, Motorola's
PowerQuiccIII 8280):
overcommit_memory==0 (default): three memory eater apps run ok.
fourth app which tryes to mlock() /successfully/ allocated 64MB of
memory hang my box.
overcommit_memory==-1: three memory eater apps run ok. fourth app
fails to allocate its memory. All successful memory allocations do mlock
Okay. As by my incomplete tests.

That sounds like results ;-)
Thanks everyone for help and this results!

--
Ihar 'Philips' Filipau / with best regards from Saarbruecken.
-- _ _ _
Because the kernel depends on it existing. "init" |_|*|_|
literally _is_ special from a kernel standpoint, |_|_|*|
because its' the "reaper of zombies" (and, may I add, |*|*|*|
that would be a great name for a rock band).
-- Linus Torvalds