请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

老师好,想请问几个用户态和内核态线程的问题

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. 是的。

希望对你有所帮助,看好你,加油!

0 回复 有任何疑惑可以回复我~
  • 提问者 Osuribaba #1
    感谢老师悉心指导~
    另外对于第一个问题,还想再问一下,您说只有内核级线程有 TCB,用户级线程有自己的运行栈,那就是说创建用户级别的线程是不走“系统调用”的。那我能不能理解为,用户级的线程,是某个语言自己在代码层面实现的呢?就比如python的用户级别线,是否是由python的cpython解释器用c++自己模拟内核线程,然后cpython解释器在内部自己维护用户空间的栈区,栈区中给每个用户级线程创建类似 TCB 的那种数据结构来描述一条用户线程呢?
    谢谢老师~
    回复 有任何疑惑可以回复我~ 2020-12-09 13:31:06
  • 咚咚呛 回复 提问者 Osuribaba #2
    是的,可以理解为是语言层面实现的。
    回复 有任何疑惑可以回复我~ 2020-12-09 23:27:29
  • 提问者 Osuribaba 回复 咚咚呛 #3
    好的,了解了,谢谢老师~
    回复 有任何疑惑可以回复我~ 2020-12-11 00:58:10
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信