我一直在查看基于这个主题的一些注释,虽然我对一般的线程有所了解,但我并不确定用户级和内核级线程之间的差异.
我知道进程基本上由多个线程或单个线程组成,但是这两个先前提到的类型的线程是什么?
据我所知,内核支持的线程可以访问内核以进行系统调用和用户级线程无法使用的其他用途.
那么,用户级线程是否只是程序员创建的线程,然后利用内核支持的线程执行由于其状态而无法正常执行的操作?
在调用系统调用时,其他goroutine如何继续执行?(当使用GOMAXPROCS = 1时)
据我所知,在调用系统调用时,线程会放弃控制,直到系统调用返回为止.Go如何在不使用block-on-syscall goroutine创建系统线程的情况下实现这种并发性?
从文档:
够程
它们被称为goroutines,因为现有的术语 - 线程,协同程序,进程等 - 传达了不准确的内涵.goroutine有一个简单的模型:它是一个与同一地址空间中的其他goroutine同时执行的函数.它是轻量级的,比堆栈空间的分配花费更多.并且堆栈开始很小,因此它们很便宜,并且通过根据需要分配(和释放)堆存储来增长.
Goroutines被多路复用到多个OS线程上,因此如果应该阻塞,例如在等待I/O时,其他线程继续运行.他们的设计隐藏了线程创建和管理的许多复杂性.
我是 Golang 的新手,我刚刚通过以下示例了解了 Goroutine 的概念:
package main
import "fmt"
func f(from string) {
for i := 0; i < 3; i++ {
fmt.Println(from, ":", i)
}
}
func main() {
f("direct")
go f("goroutine")
go f("goroutine2")
go func(msg string) {
fmt.Println(msg)
}("going")
var input string
fmt.Scanln(&input)
fmt.Println("done")
}
Run Code Online (Sandbox Code Playgroud)
这是执行结果之一:
direct : 0
direct : 1
direct : 2
goroutine : 0
goroutine2 : 0
goroutine2 : 1
goroutine2 : 2
goroutine : 1
goroutine : 2
going
done
Run Code Online (Sandbox Code Playgroud)
我可以看到,goroutine并 …
我试图理解 golang 架构以及“轻量级线程”的含义。我已经读过一些内容,但想提出问题来澄清它。
如果我说幕后的“go”关键字只是将以下函数放入内部线程池的队列中,但对于用户来说,它看起来像是创建线程,我是对的吗?