其他goroutine在调用syscall时如何继续执行?(使用GOMAXPROCS = 1时)
据我所知,调用syscall时,线程放弃控制,直到syscall返回。Go如何在不按每个系统调用阻塞程序创建系统线程的情况下实现这种并发性?
从文档中:
Goroutines
之所以称它们为goroutine,是因为现有的术语(线程,协程,进程等)传达了不准确的含义。goroutine有一个简单的模型:它是在相同地址空间中与其他goroutine同时执行的函数。它是轻量级的,仅比分配堆栈空间花费更多。而且堆栈从小开始,因此价格便宜,并通过根据需要分配(和释放)堆存储来增长。
Goroutine被多路复用到多个OS线程上,因此,如果一个应阻塞,例如在等待I / O时,其他将继续运行。他们的设计隐藏了线程创建和管理的许多复杂性。
如果goroutine正在阻塞,则运行时将启动一个新的OS线程来处理其他goroutine,直到阻塞为止。
参考:https : //groups.google.com/forum/#!topic/golang- nuts/ 2IdA34yR8gQ
它实际上将不同的goroutine复用到线程中(每个线程1+ goroutine)。如果一个阻塞,则另一块切换为在同一线程上运行。该操作仅需3个寄存器即可更改,这就是其如此轻巧的原因。