The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Тест на нехватку памяти"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Тест на нехватку памяти"  
Сообщение от sy email(??) on 12-Янв-09, 09:13 
Здравствуйте.

void f()
{
char big[8096];
...
}

Уж больно интересно стало поэкспорементировать - что будет если не хватит пямяти на вызов такой C функции?

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Тест манту"  
Сообщение от Andrey Mitrofanov on 12-Янв-09, 09:23 
>Уж больно интересно стало

__Павел Андреевич, 8-O Вы Хацкер? - Видишь ли, Юра...

>поэкспорементировать

Что помешало?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Тест манту"  
Сообщение от sy email(??) on 12-Янв-09, 09:53 
>>Уж больно интересно стало
>
>__Павел Андреевич, 8-O Вы Хацкер? - Видишь ли, Юра...
>
>>поэкспорементировать
>
>Что помешало?

Упс.. Сорри..( не пинайте ногами, пожалуйста:)

ОС-линукс. Хочу протестировать, как ведет себя моя программа при нехватке памяти. Нужно ее запустить так, чтоб ей досталось не более определенного числа мегабайт ОЗУ.

Как это можно сделать. Подскажите, плз?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Тест манту"  
Сообщение от Andrey Mitrofanov on 12-Янв-09, 12:20 
>ее запустить так, чтоб ей досталось не более определенного числа мегабайт ОЗУ.

Попробовать ulimit -a или типа того
+
Пытаться врубиться в man bash

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Тест манту"  
Сообщение от geekkoo (??) on 13-Янв-09, 22:49 
>[оверквотинг удален]
>>
>>Что помешало?
>
>Упс.. Сорри..( не пинайте ногами, пожалуйста:)
>
>ОС-линукс. Хочу протестировать, как ведет себя моя программа при нехватке памяти. Нужно
>ее запустить так, чтоб ей досталось не более определенного числа мегабайт
>ОЗУ.
>
>Как это можно сделать. Подскажите, плз?

Так не больше опредленного, или что будет, когда она сожрет всю память? Во втором случае с ней будет разбираться не программист, а OOM-Killer. Если ulimit-ы не настроены, то у автора нет возможности отсечь момент, когда программа будет прибита. Вообщем понятно, что это не вполне правильно, но ситуация сама по себе фиговая, и Торвальдс решил поэтому действовать наверняка ...

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Тест манту"  
Сообщение от sy email(ok) on 15-Янв-09, 10:42 

>Так не больше опредленного, или что будет, когда она сожрет всю память?
>Во втором случае с ней будет разбираться не программист, а OOM-Killer.
>Если ulimit-ы не настроены, то у автора нет возможности отсечь момент,
>когда программа будет прибита. Вообщем понятно, что это не вполне правильно,
>но ситуация сама по себе фиговая, и Торвальдс решил поэтому действовать
>наверняка ...

Учусь писать сервер.
Стандартная мини курсовая - tcp сервер чата для локальной сети (препод не против, если сервер будет на Linux'e).

Если расписывать долго и нудно, то я пытаюсь не наступить на грабли - "проверяйте, действительно ли память была выделена" - по сути ходя вокруг этих грабель.
А весь прикол в том, что я никогда не "видел" этой ситуации...

Код на php:

$a = array();
while(1)
{
  $a[] = '0';
}

вешает систему..

На С++

int main()
{
char *p;
  while(true)
    *p = new char[1024];
}

будет "убито" ядром.

И того этих грабель как будто и нет...

Ну а если ветаки new вернет мне NULL? Что я должен делать со своим сервером? Пытаться освободить кеш? Завершиться как можно быстрее и безаварийней? :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "Тест манту"  
Сообщение от geekkoo (ok) on 15-Янв-09, 10:49 
>[оверквотинг удален]
>    *p = new char[1024];
>}
>
>будет "убито" ядром.
>
>И того этих грабель как будто и нет...
>
>Ну а если ветаки new вернет мне NULL? Что я должен делать
>со своим сервером? Пытаться освободить кеш? Завершиться как можно быстрее и
>безаварийней? :)

Скорее всего первое.

А NULL будет возвращаться, если расставленны ulimit-ы.

Ну, и резервировать память в стиле memory-bomb тоже не очень хорошо ...

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "Тест манту"  
Сообщение от sy email(??) on 15-Янв-09, 12:18 
>
>Ну, и резервировать память в стиле memory-bomb тоже не очень хорошо ...
>

Что это значит? Получать память пока ее можно выделить?

[off]
Я так, понимаю, что у меня будет некий буфер сообщений которые нужно доставить.
Так вот, когда этот размер этого буфера станет больше определенного размера - новые сообщения не принимать - только отдавать, освобождая буфер.

Этот "определенный размер" - есть управляющий параметр потребления памяти. И как я понимаю, пусть лучше его сисадмин указывает в конфиге.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "Тест манту"  
Сообщение от vic (??) on 15-Янв-09, 13:38 
>Код на 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/сигнал полученный до достижения ограничения.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "Тест манту"  
Сообщение от vic (??) on 15-Янв-09, 13:40 
>1. Если ограничения памяти через ulimit или set не установлены

очипка, s/set/setrlimit()/

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "Тест манту"  
Сообщение от sy email(??) on 15-Янв-09, 16:04 
Большое человеческое спасибо, исчерпывающий!


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "Тест манту"  
Сообщение от sy email(??) on 15-Янв-09, 16:05 
>Большое человеческое спасибо, исчерпывающий!

Ответ исчерпывающий.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру