【疑惑】Java多线程与操作系统的“用户级线程”/“核心级线程”
翻阅操作系统的书 得到两个概念,“用户级线程”和“核心级线程”, 而且列举了用户级线程的优缺点。其中,讲到用户级线程的缺点的地方有两点:1、同一进程的多个线程不能真正并行;2、由于线程对操作系统透明,调度处于进程级别,若进程中的一个线程通过系统调用进入操作系统受阻,那么将阻塞该进程
疑惑来了,反思Java的多线程实现是用户级线程:
1、那么Java的多线程实现并发怎么回事,难道骗人的?(CPU多核?)
2、用户级线程调度发生在进程级别,与核心级线程的调度有何区别。
3、网上看到这一说法,求证:内核级线程可以享受到多核的好处?那用户级线程就不能?(参照第一条)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
个人之见,仅供参考:
Java的目标是要跨平台,而不同的操作系统(如类Unix和Windows)其任务调度机制有很大的不同,故Java在JVM层面抽象了一套自己的线程机制,用以映射不同的操作系统的任务调度。如你所述的一些缺点,Java在1.1版本之后,这个线程模块就是基于内核级别线程[1]。
首先,如果一个机器上只有一个逻辑CPU,此时系统调度器通过轮换时间片的方式来调度任务,所以不存在真正的并行,只是并发;只有多个逻辑CPU的情形下,才会出现并行;
其次,对于不同的操作系统,其任务调度机制不同:
linux下jvm创建Thread的调用(openJDK-6-src-b27中的os_linux.cpp中的bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size)中调用以下API):
int ret = pthread_create(&tid, &attr, (void* (*)(void*)) java_start, thread);
具体的后续调用跟踪,请参考pthread的实现;
windows下jvm创建Thread的调用-(openJDK-6-src-b27中的os_windows.cpp中的bool os::create_thread(Thread* thread, ThreadType thr_type, size_t stack_size)中调用以下API):
HANDLE thread_handle =
(HANDLE)_beginthreadex(NULL,
(unsigned)stack_size,
(unsigned (__stdcall *)(void*)) java_start,
thread,
CREATE_SUSPENDED | STACK_SIZE_PARAM_IS_A_RESERVATION,
&thread_id);
具体后续调用请参考windows的API;
最后,回答你的问题:
3.能不能我不知道。不过如果不能的话,就要粗大事了。
你看看这个吧
不太了解Java中的多线程,看描述,似乎和python的多线程类似?
python中线程的调度是交给解释器Global Interpreter Lock的,不同的线程一个个进入解释器执行。而何时调调度哪个线程,这个则完全交给操作系统去做。这应该就是您所问的用户级线程调度吧。
在通信系统上,调度的概念就是有先有后,不是真正意义的并发。一般情况下,用户是不会对调度带来的短暂停滞有所觉察的。