I propose that Go implement non-cooperative goroutine preemption by sending a POSIX signal (or using an equivalent OS mechanism) to stop a running goroutine and capture its CPU state. If a goroutine is interrupted at a point that must be GC atomic, as detailed in the "Handling unsafe-points" section, the runtime can simply resume the goroutine and try again later.
Интересно как сигналы прерывают именно зелёный поток, а не весь поток ОС. Почитаю потом, наверное