Здравствуйте, fk0, Вы писали:
fk0>Здравствуйте, gandjustas, Вы писали:
T>>>А почему, собственно, потоки операционной системы не могут быть столь же эффективны, как и горутины? То есть почему разработчики OS тоже не могут сделать динамический стек и другие оптимизации?
G>>1) Переключение контекста не бесплатное fk0> А у Go -- бесплатное?
Гораздо более дешевое, чем в ОС, примерно на два десятичных порядка.
G>>2) Каждый поток кушает 1МБ под стек минимум fk0> Адресного пространства, а не стека. Памяти на стек тратится, минимум, килобайт 8 думаю.
Сколько реально тратится — зависит от того как написан код. Может оказаться довольно много в сумме.
Когда еще не было async\await в C# я переписал один сервер с использования потока на соединение на асинхронные вызовы и очередь. Получил экономию около 200мб, что составляло четверть расходуемой памяти.
G>>В основном потому что ОС не знает чем будет заниматься поток и делает многое "по умолчанию". fk0> Можно подумать, Go знает. Часто этого и сам поток не знает.
Конечно знает. Я не знаю как точно в Go это устроено, но компилятор C# прекрасно определяет какие перменные нужны в продолжении.
G>>В Винде уже давно есть возможность создавать пулы потоков, очереди задач, ожидания IO и таймеров, что позволяет иметь много потоков в программе при минимуме потоков в ОС.
fk0> В Linux тоже make_context и switch_context были с доисторических времён. Когда ещё потоков наверное не было.
Это типа cooperative multitasking? Увы в рукопашную его нигде практически не используют.