Dnia środa, 5 stycznia 2011 o 20:14:00 Dimitar Zhekov napisał(a):
On Wed, 5 Jan 2011 11:08:18 +1100 Lex Trotman elextr@gmail.com wrote:
And on modern kernels virtual memory can be overcommitted significantly so it may not work
I haven't said that a successful alloc guarantees everything will be fine. :) But with the kernel defaults, you'll at least catch the most obvious cases.
is expensive since the page tables have to be constructed even if the memory is not used.
CPU cost: that's only once per file, memory cost: < 1%
Also this could cause fragmentation of the virtual address space that may limit how many times it will work.
Yes, or some other problems. It's a hack, and should only be used if we can't agree on anything better. Personally I'm for a preference.
On Tue, 4 Jan 2011 22:05:52 +0100 Krzysztof Żelechowski giecrilj@stegny.2a.pl wrote:
I do not know where you got it from, but the last OS I know that behaved like that was MacOS 7. [cut]
Like what?..
Like necessarily allocating a contiguous block of physical memory.
What a strange idea... Unless your CPU lacks MMU, of course.
GNU malloc uses mmap so it is all virtual.
mmap for large blocks and heap for small blocks IIRC, and naturally, the heap itself is mmap-ed.
If by "01 << 040" you mean 4GB, how much real and virtual memory do you have?
I have 1 GB of physical memory. (01 << 040) is the first integer that does not fit into unsigned int.
So then, using more than 4GB _will_ be a problem on your system, QED. I pointed out it's a rough check.
But if your malloc() fails on 4GB, and not below that, you either have an unusually large swap file, or your kernel is set to always
procs -----------memory---------- ---swap-- -----io---- -system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 324092 35424 17904 283900 7 38 191 77 479 810 16 5 76 3 0
MemTotal: 1004948 kB SwapTotal: 1510040 kB VmallocTotal: 34359738367 kB VmallocChunk: 34359546964 kB
Filename Type Size Used Priority /dev/sda5 partition 1510040 276772 -1
overcommit. With the defaults, the check works much better.
overcommit_memory = 0 overcommit_ratio = 50 CommitLimit: 2012512 kB
vmalloc is not set in /proc/cmdline.
I think this setup is quite typical.
Chris