>Код на php:
>
>$a = array();
>while(1)
>{
> $a[] = '0';
>}
>
>вешает систему.. ессно вешает, $a[] = '0'; означает почти постоянную реалокацию с заполнением. В итоге ядро конечно с этим кодом сделает тоже самое что и во втором примере, но позже, т.к. тут до максимума памяти далековато :)
>На С++
>int main()
>{
>char *p;
> while(true)
> *p = new char[1024];
>}
>
>будет "убито" ядром.
аха, тут можно даже вычислить итерацию на которой ядро сделает выстрел в голову, достаточно поделить адресуемый максимум памяти на 1024 (это без учета служебной инфы).
>И того этих грабель как будто и нет...
>Ну а если ветаки new вернет мне NULL? Что я должен делать
>со своим сервером? Пытаться освободить кеш? Завершиться как можно быстрее и
>безаварийней? :)
1. Если ограничения памяти через ulimit или set не установлены, то вы получаете сигнал от ядра и дохнете, т.к. считается что память (адресуемая) окончательно исчерпана.
2. Если установлены лимиты значит вы достигаете заданного ограничения, что может является неким ожидаемым событием и являться причиной стратежно сменить тактику :) а посему malloc() возвращает NULL, и вы без криков "паника, паника, паника" можете заняться освобождением памяти. Отличие от 1 варианта в том, что есть хотя бы служебная память для отступления, в первом же случае ее может не быть, поэтому - сигнал, предсмертная судорога, кора.
3. для сервера вполне нормально заранее выделить необходимую для работы память и в процессе не заниматься операциями выделения/освобождения памяти. Но это в идеале, естественно в жизни сервера очень разнообразны и в каждом конкретном случае следует избирать определенную стратегию работы с памятью чтобы обеспечить надежную и бесперебойную работу сервера. К примеру произвести минимизацию операций выделения памяти. Далее можно использовать различные стратегии по ситуации и типу сервера, к примеру ожидание памяти (подождать некритичное время авось память появится), освобождение того что уже выделено (отдача сообщений без приема) и т.д. зависит от сервера.
4. ну и ессно надо различать получение NULL от malloc() при достижении ограничения и NULL/сигнал полученный до достижения ограничения.