Re[12]: Mногопоточность: C++ vs Erlang vs другие
От: Evgeny.Panasyuk Россия  
Дата: 05.06.15 16:16
Оценка: +1
Здравствуйте, vdimas, Вы писали:

EP>>Это понятно, тут со stateless хорошо то что они требуют ровно столько памяти, сколько требуется. Но вопрос-то был про другое.

EP>>Тем не менее, я без проблем запускал 400k stackful корутин на ноутбуке
Автор: Evgeny.Panasyuk
Дата: 30.11.13
, причём это далеко не предел.

V>Я уже читал твои отчеты (познавательно, кста) и не согласен с тем, чтобы уменьшать стек под корутину. Ведь не знаешь же, сколько реально стека потребуется для каких-нить промежуточных вычислений.

Да, это одна из основных проблем stackful корутин. Не размер стэка когда корутина спит, а именно то что между yield'ами может понадобится нырнуть поглубже в стэк. Это конечно далеко не всегда будет проблемой, но учитывать обязательно.
Тут вижу несколько вариантов:
1. Split Stacks — то есть поддержка "разорванных" стэков компилятором+рантаймом.
2. На x64 резервировать требуемый объём адресного пространства под стэк, делать commit на страницу, при росте добавлять, а при уменьшении возвращать.
3. Тяжёлые вычисления между yield'ами делать в отдельной корутине с большим стэком (в том же потоке), то есть:
coroutine_with_small_stack([&]
{
    Data x;
    yield();
    auto result = coroutine_with_large_stack_do_now([&]
    {
        return heavy_computation_without_yield(x);
    });
    yield();
});
Отредактировано 05.06.2015 16:17 Evgeny.Panasyuk . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.