老师好,想请问几个用户态和内核态线程的问题
来源:8-3 实现生成器协程适配器CoroutineWrapper

Osuribaba
2020-12-08
1. 用户态到内核态中间有个操作系统提供的“系统调用”的一层,那在用户空间想创建一条用户级的线程的话,那用户级的这个 TCB 是谁来创建的,是否也要经过“系统调用”层呢?
2. 用户线程和内核线程的对应关系有 1对多,1对1,N对M,没记错的话,java里头new tread 应该是1对1的,也就jvm里头创建了一条用户级线程的话,那在内核空间就会相应的有一条内核线程,请问老师这条内核级线程是怎么来的呢?假如说jvm想创建一条用户线程的话,我猜可能是jvm调用了类似 CreatUserThread() 之类的 Api ,那么与之对应的内核级线程,是否也是 jvm 调用了类似什么 CreatKernelThread() 之类的 Api 而来的呢?
3. Go语言里头的Goroutine我理解应该是个 N对M 的模型,一般像某些语言如果选用这种 N对M 的话,那N 和 M的关系可能是啥呀?是说这个语言的编译器,运行的一开始就在内核里头创建创了 M 条内核线程,之后就定死不变了,还是说当用户空间的协程数量极速增大的时候,M也会适当增大呀?
4. 一条进程一定会有一条主线程,这条主线程由操作系统创建。请问老师我是不是能理解为一个程序的主进程和主线程,都在内核空间里呢?
谢谢老师~
1回答
-
挺好的问题,描述清晰,有思考,点赞。我常和同学们说,学会提问问题是非常重要的能力,希望其他同学看到这里都可以学习下。
1. TCB(Thread Control Block),全名是线程控制块,是操作系统内核用来控制内核级线程的数据结构;而用户级线程和内核级线程是多对一的关系的,所以用户级线程自身是没有TCB的,只有对应的内核级线程有TCB,对于用户级线程,有自己的运行栈,可以通过切换运行栈来达到切换运行线程的目的,yield就是模拟了这个过程。
2. 是的,JVM创建线程的接口,底层就是操作系统的系统调用,如果有兴趣,可以找到openJDK的源码查看相关的代码。
3. goroutine的调度比较先进,它的整一个调度模块被称为G-P-M模型,G:gocoroutine、P: Processor、M: Machine,M的数量是可以变化的,在go runtime会动态动态调整。
4. 是的。
希望对你有所帮助,看好你,加油!032020-12-11
相似问题
回答 1
回答 1
回答 1
回答 1
回答 1