Здравствуйте, netch80, Вы писали:
G>>ОС не знает когда поток остановится и остановится ли вообще.
N>Ну кроме случаев, когда нить сама делает вызов, который блокирует её выполнение
)
N>а таких действий в сетевой нагрузке и GUI, например, большинство.
А конкретнее?
Если что планировщики ОС всгеда нормально справлялись с десктопной нагрузкой. необходимость обращатся с огромным количеством потоков есть только в сервреах.
G>> ОС прерывает выполнение по кванту времени, поэтому нужно сохвранить все текуще состояние (стек).
N>При любом прерывании выполнения надо сохранить текущее состояние.
Только "контролируемое" прерывание потребует гораздо меньше места для сохраннеия, чем прерывание в произвольном месте.
G>> В "упавлемых" средах "поток" выполнения останавливается не тогда когда ОС решит, а тогда когда код дойдет до точки прерывания.
N>И как определяется точка прерывания?
N>В Go это точно так же как в случае ОС — переход в ожидание, или просто вызов чего-то в рантайме. Пустой вечный цикл в Go заблокирует целиком одну системную нить рантайма.
Это фактически означает что планирощик Го не может использоваться в ОС для всех потоков.
N>Оно ровно равно тут всему стеку плюс регистры (а не пространству, зарезервированному под стек).
В C# можно в явном виде увидеть состояние "продожения" в async\await, оно сильно меньше чем весь стек + регистры.