Ключевые слова:memory, malloc, (найти похожие документы)
_ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _
From : Alex Korchmar 2:5020/28.101 Sat 09 Jan 99 00:18
Subj : malloc и NULL
________________________________________________________________________________
Denis Pershin <[email protected]> wrote:
YVK>>> И работает с памятью медленнее немного.
AK>> зато предсказуемо. В linux'е sigsegv поймала бы сперва куча совершенно
AK>> невиновных программ.
DP> Hекорректно написаных. Ибо malloc на NULL не проверяют.
лохом быть не надо, ламером быть не надо. Этим, как его, а, во - зопухом тоже
не надо быть. В смысле - не надо звездить о том, чего не знаешь.
Пишем "коректно":
#include <stdio.h>
#include <stdlib.h>
main()
{
void *p;
int i;
for(i=0; i<500; ++i)
{
if((p=malloc(1024*1024))==NULL)
{
printf("NULL at %d!\n", i);
break;
}
}
printf("ok\n");
}
запускаем:
[ttyp3]:alx[563]~/work> gcc -Wall s.c -o s
s.c:5: warning: return-type defaults to `int'
s.c: In function `main':
s.c:18: warning: control reaches end of non-void function
[ttyp3]:alx[564]~/work> ./s
ok
[ttyp3]:alx[565]~/work>
пожалуй, специально для тебя (ты ведь не почешешься проверить):
[ttyp3]:alx[565]~/work> time !!
time ./s
ok
0.000u 0.060s 0:00.09 66.6% 0+0k 0+0io 75pf+0w
и нет, разумеется,в этой машине не 500 мегабайт оперативки.
А вот тебе _единственный_ способ получить-таки NULL:
заменим 1024*1024 числом, большим всей доступной памяти+своп (пусть
это будет *200)
[ttyp3]:alx[681]~/work> ./s
NULL at 0!
ok
(впрочем, на 2.2 можно засунуть 1 в /proc/sys/vm/overcommit_memory и
получить NULL at 10 - не потому, что своп кончился, а потому, что
адресное пространство у нас все же ограничено - двумя гигабайтами.
Фигово - но под OS/2, вон, жили в 500 мегах и ничего)
А вот теперь ты нам и об'яснишь, с позиции исторического материализма,
что сейчас произошло, чем об'ясняется этот фокус и почему практически
бестолку в линуксах проверять malloc на null, а зато надо иметь встроенный
в любую нетривиальную программу обработчик SIGSEGV. А равно почему для
тестирования под OpenBSD я вляпал рекурсивный вызов. Только книжки
умные сперва почитай, чтоб опять не облажаться.
> Alex
--- ifmail v.2.14.os-p2 * Origin: Down System -2 (2:5020/28.101@fidonet)
_ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _
From : Leonid Broukhis 2:5020/400 10 Jan 99 16:56:24
Subj : malloc и NULL
________________________________________________________________________________
From: [email protected] (Leonid Broukhis)
Boris Tobotras wrote:
>Serg> IMHO если malloc вернул NULL, то это скорее всего система уже в
>Serg> состоянии падения. :)
>
> echo 0 > /proc/sys/vm/overcommit_memory
Более того, если машина используется для чего-нибудь полезного и существенного
или отвечает на внешние запросы, то
echo 0 > /proc/sys/vm/overcommit_memory
очень полезно написать в rc.local.
Leo
--- ifmail v.2.14dev2 * Origin: Demos online service (2:5020/400@fidonet)
_ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _
From : Vitaly E Lavrov 2:5030/580 11 Jan 99 01:18:24
Subj : malloc и NULL
________________________________________________________________________________
From: "Vitaly E.Lavrov" <[email protected]>
Alex Korchmar <[email protected]> wrote:
> Denis Pershin <[email protected]> wrote:
> [ttyp3]:alx[565]~/work>
> пожалуй, специально для тебя (ты ведь не почешешься проверить):
> [ttyp3]:alx[565]~/work> time !!
> time ./s
> ok
> 0.000u 0.060s 0:00.09 66.6% 0+0k 0+0io 75pf+0w
> А вот тебе _единственный_ способ получить-таки NULL:
> заменим 1024*1024 числом, большим всей доступной памяти+своп (пусть
> это будет *200)
Hет, если добавить после malloc bzero()
то все ОК
lve:/tmp# time ./a.out
Sound: DMA (output) timed out - IRQ/DRQ config error?
^^^^^^^^^^^^^^^ это в этот момент mpg123 отсвопили :)
NULL at 113!
ok
Command exited with non-zero status 3
0.69user 1.93system 0:21.55elapsed 12%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (2096major+29045minor)pagefaults 16511swaps
> [ttyp3]:alx[681]~/work> ./s
> NULL at 0!
> ok
> (впрочем, на 2.2 можно засунуть 1 в /proc/sys/vm/overcommit_memory и
> получить NULL at 10 - не потому, что своп кончился, а потому, что
> адресное пространство у нас все же ограничено - двумя гигабайтами.
> Фигово - но под OS/2, вон, жили в 500 мегах и ничего)
> А вот теперь ты нам и об'яснишь, с позиции исторического материализма,
Такое ощущение, что при malloc проверяется кол-во физически используемой
памяти ( как du считает физически занятые блоки )
Виталий
.
--- ifmail v.2.13 * Origin: SPb State University of Aerospace Instrumentati (2:5030/580@fidonet)
_ RU.LINUX (2:5077/15.22) ___________________________________________ RU.LINUX _
From : Alex Korchmar 2:5020/28.101 12 Jan 99 03:05:04
Subj : malloc и NULL
________________________________________________________________________________
Boris Tobotras <[email protected]> wrote:
Serg>> IMHO если malloc вернул NULL, то это скорее всего система уже в
Serg>> состоянии падения. :)
BT> echo 0 > /proc/sys/vm/overcommit_memory
Кто-то, похоже, никогда не задавался вопросом, а что же это такое.
(между прочим, ноль там по дефолту). А вот что лежит в Documentation/sysctl:
static inline int vm_enough_memory(long pages)
{
/* This stupid algorithm decides whether we have enough memory:
* while simple, it should work in most obvious cases. It's
* easily fooled, but this should catch most mistakes.
*/
long freepages;
/* Sometimes we want to use more memory than we have. */
if (sysctl_overcommit_memory)
return 1;
freepages = buffermem >> PAGE_SHIFT;
freepages += page_cache_size;
freepages >>= 1;
freepages += nr_free_pages;
freepages += nr_swap_pages;
freepages -= num_physpages >> 4;
return freepages > pages;
}
> Alex
--- ifmail v.2.14.os-p2 * Origin: Down System -2 (2:5020/28.101@fidonet)