LINUX.ORG.RU

Malloc, overcommit. Срыв покровов

 


1

5
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    const size_t NUM = 500 * 1000 * 1000;
    while(1) {
        int *a = (int *)malloc( NUM * sizeof(int) );
        if (!a) printf( "Tsar' - shkolnik\n" );
        sleep( 1 );
    }

    return 0;
}
#> uname -a
Linux user-VirtualBox 3.8.0-35-generic #50-Ubuntu SMP Tue Dec 3 01:25:33 UTC 2013 i686 i686 i686 GNU/Linux

#> free -m
             total       used       free     shared    buffers     cached
Mem:          1002        594        408          0          9        108
-/+ buffers/cache:        476        526
Swap:         1021        129        892

#> sysctl -a|grep overcommit
vm.nr_overcommit_hugepages = 0
vm.overcommit_memory = 0
vm.overcommit_ratio = 50

#> gcc malloc_test.cpp -o m && ./m
Tsar' - shkolnik
Tsar' - shkolnik
Tsar' - shkolnik
^C

а почему память не должна выделятся?

hope13 ★★★
()

Царь, конечно, невежда, но твой пример, скорее всего, исчерпывает адресное пространство.

tailgunner ★★★★★
()
Ответ на: комментарий от nerdogeek

Но проблемо

Всего лишь кривой тест.

замени malloc на calloc и запусти parallel -j100 ./m

Даже если предположить, что я это сделаю - что, по-твоему, я должен увидеть?

tailgunner ★★★★★
()
Ответ на: комментарий от nerdogeek

Если отключить OOM killer и overcommit, то malloc/calloc вернёт ноль

Царь так и говорил.

tailgunner ★★★★★
()

Да ты я смотрю полезен. Мало того, что твоё осиляторство сишки заканчивается курсом С/С++ в пту, дак ты ещё и совсем больной на головку.

Что ты мне хотел сказать своим выхлопом?

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <stdint.h>

int main(void) {//функция без аргументов (void), тупая обезьяна
  const size_t NUM = 500 * 1000 * 1000;
  uint64_t i = 0;
  while(1) {
    int * a = malloc(NUM * sizeof(int));  //void * кастится в любой тип указателя автоматом - это суть воида, тупая обезьяна
    ++i;
    if(!a) {printf("Tsar' - shkolnik\n"); break;}
  }
  fprintf(stderr, "%luHr: %luTB\n", (i)/(60 * 60), (i * NUM) / (1024 * 1024 * 1024 * 1024ul));
  return 0;
}

# ./a.out 
Tsar' - shkolnik
19Hr: 31TB

Т.е. твоя портянка сработает через 19часов - полезно. Ну дак что ты этим хотел сказать? Что на твоём 32битном убожестве 4гига вмема и твоя байда падает на 3-4-й итерации? Ну дак это твои проблемы.

anonymous
()
Ответ на: комментарий от anonymous
sudo sysctl vm.overcommit_memory=2

Для 32х-битных систем можно и с включенными оверкомитом запускать прогу, а для 64х-битных overcommit_ratio поставь поменьше. Дерзай!

nerdogeek
() автор топика
Ответ на: комментарий от nerdogeek

Ты упоролось, тебя выше обоссали.

Я тебя спросил - что такое оверкоммит - отвечай. Должен знать, раз кукарекаешь.

Скажу наперёд, спешлфорю - вырубается оверкоммит так: sysctl vm.overcommit_memory=1, а почему - попытайся напрячь свои полторы извилины напару с мозжечком.

И да, нулёвая обезьяна, я всегда поражался сему факту - нахрен ты мне что-то рассказываешь? Что ты мне можешь, ничтожество, рассказать?

anonymous
()
Ответ на: комментарий от anonymous

Ты такой забавный. Мне просто доставляет общение с адекватными профессионалами.

Расскажи лучше, стоит ли проверять значение, возвращаемое malloc на NULL? Тут на ЛОРе, кстати, тоже кто-то кроме тебя кукарекнул что ненужно.

nerdogeek
() автор топика
Последнее исправление: nerdogeek (всего исправлений: 1)

Можно я встану на сторону анона в данном конкретном случае?) Он конечно неадекват, но тест херня.

wakuwaku ★★★★
()

Этот ваш царь - жалкая и беспомощная пародия на Луговского, нашёл с кого покровы срывать. Большая доблесть понтоваться перед первоклашками, которые в жизни ни одного учебника по программированию не прочли.

А ты лучше бы что-то новое и интересное рассказал, незачем давать повод всяким чсвшникам понтоваться азбучными истинами.

anonymous
()
Ответ на: комментарий от nerdogeek

В искусственно созданных условиях можно и не то намутить. calloc емнип запрашивает память забитую нулями, а не делает memset. как её даёт ядро calloc не беспокоит.

wakuwaku ★★★★
()
Ответ на: комментарий от anonymous

а разве calloc не приведёт к oom не возвращаясь

Вряд ли - система сама инициализирует данные нулями. Вот malloc+memset - да, должен позвать OOM killer довольно быстро.

tailgunner ★★★★★
()
Ответ на: комментарий от nerdogeek

Да тут половина вместо того, чтобы действовать по талмуду, организовывают местечковые низкопробные секты, просто им стыдно в этом признаться. Пусть не проверяют, их поделия не покидают локалхоста и ок. Чем больше раскачивать, тем больше своих догм они несут в массы, а ведь есть идиоты, которые жадно ловят, ладно хоть царь не считает их потенциальной паствой :)

arturpub ★★
()
Ответ на: комментарий от tailgunner

Я вот чего не понимаю, многие насвистывают про оверкоммиты, про ленивое выделение, про нужность мемсета в даннном тесте.. А не покажет ли уважаемый all случай, когда фактически маллок есть, а юза нет? Вот какого хрена выделять здоровый буфер, если сразу его не заполнять? Для долгого большого ио? Так есть вектор-риды. Чтобы базу держать в памяти? Так ммап на файл, он будет свопиться. Какое вообще есть применение для памяти, которой нет и пока не нужна?

arturpub ★★
()
Ответ на: комментарий от arturpub

Для того что бы навелосипедить свой (УБЕРбыстрый) манагер памяти и избежать страшной и ужасной фрагментации памяти, которая как на зло обязательно проявит себя при подсчёте очереного числа фибоначи.

nanoolinux ★★★★
()
Ответ на: комментарий от arturpub

А не покажет ли уважаемый all случай, когда фактически маллок есть, а юза нет?

overcommit предназначен не для пользователя malloc, а для реализатора malloc. Но да, сама идея оверкоммита крайне сомнительна ИМХО.

tailgunner ★★★★★
()
Ответ на: комментарий от arturpub

Какое вообще есть применение для памяти, которой нет и пока не нужна?

Пулы, буфера, свои местные кучки, вектора в std::vector с резервом. В общем, везде, где хочется иметь данные в одном непрерывном блоке памяти, но заранее неизвестно сколько её будет нужно. Для этого обычно используют сразу mmap(), но выбвает что делают через malloc().

mashina ★★★★★
()
Ответ на: комментарий от nanoolinux

Разве что. Другие варианты протяженных sparse регионов должны быть очень scientific, и скорее всего ошибка проектирования.

Собственно сам нашел: http://www.etalabs.net/overcommit.html

Линукс сам себе придумал нестандартную технологию-головняк, но все решили, что это профит, чтобы не проверять на нулл. Офигенно :)

arturpub ★★
()
Ответ на: комментарий от tailgunner

Да ладно! 10 процентов прироста производительности в результате дают возможность обгонять микроядра! ;)

nanoolinux ★★★★
()
Ответ на: комментарий от arturpub

То есть отсутствие линукса под капотом не мешает этим подходам, как и думалось :/

В принципе да. Память можно выделить и не использовать не только явно, но и неявно через fork + cow. Совсем без OC жить будет сложно.

mashina ★★★★★
()
Ответ на: комментарий от nerdogeek

Ты такой забавный. Мне просто доставляет общение с адекватными профессионалами.

Т.е. ты обосрался?

Расскажи лучше, стоит ли проверять значение, возвращаемое malloc на NULL?

Меня абсалютно не интересует что там тебе надо проверять. Почему проверка на нал не спасает ублюдка - я уже писал.

Тут на ЛОРе, кстати, тоже кто-то кроме тебя кукарекнул что ненужно.

А причем тут ты? Ты обезьяна даже птушный уровень матчасти не осилила, зачем ты кукарекаешь об этом? Иди жри говно.

anonymous
()

Если функция может вернуть ошибку - любая ошибка должна быть обработана. Все кто так не считают - пишут анекдоты на C.

</thread>

quest ★★★★
()
Ответ на: комментарий от anonymous

ТС, извини, похоже, что это я сам тупая обезьяна и не знаю цпп, так как до сих пор не выучил, что в этом случае

int main(void) {
void не обязательно писать.

anonymous
()
Ответ на: комментарий от anonymous

не знаю цпп

В этом твоя проблема - вперёд в тред по цпп.

void не обязательно писать.

В каком таком случае?

Carb_blog4
()
Ответ на: комментарий от quest

Если функция может вернуть ошибку - любая ошибка должна быть обработана. Все кто так не считают - пишут анекдоты на C.

Инкрементирую мнение этого товарища.

Deleted
()

Не «царь», а «царевна-лягушка». Мозгов и знаний примерно столько же.

anonymous
()
$ cat test.cpp 
#include <stdlib.h>
#include <stdio.h>

int main()
{
        void *p = malloc(60000000);
        if (p == NULL)
        {
                printf("p == NULL\n");
        }
        else
        {
                printf("p != NULL\n");
        }

        return 0;
}
$ ulimit -d 50000
$ ulimit -m 50000
$ ulimit -v 50000
$ ./test
p == NULL

это не царь, а лалка анскильная!

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.