Здравствуйте, gandjustas, Вы писали:
G>>>В основном потому что ОС не знает чем будет заниматься поток и делает многое "по умолчанию".
T>>А каких именно знаний о потоке не хватает OS?
G>ОС не знает когда поток остановится и остановится ли вообще.
Ну кроме случаев, когда нить сама делает вызов, который блокирует её выполнение

)
а таких действий в сетевой нагрузке и GUI, например, большинство.
G> ОС прерывает выполнение по кванту времени, поэтому нужно сохвранить все текуще состояние (стек).
При любом прерывании выполнения надо сохранить текущее состояние.
G> В "упавлемых" средах "поток" выполнения останавливается не тогда когда ОС решит, а тогда когда код дойдет до точки прерывания.
И как определяется точка прерывания?
В Go это точно так же как в случае ОС — переход в ожидание, или просто вызов чего-то в рантайме. Пустой вечный цикл в Go заблокирует целиком одну системную нить рантайма.
В Erlang не так — там рантайм считает "редукции", но за это платится тратой процессора.
G> В этой точке рантайм знает о текущем состоянии "потока", которое обычно в разы меньше чем весь стек.
Оно ровно равно тут всему стеку плюс регистры (а не пространству, зарезервированному под стек).