java线程调度用户空间和内核空间一样吗(用户线程和内核线程的调度)
导语:Java 线程调度、用户空间和内核空间
Java 线程调度线程调度是指系统为线程分配处理器使用权的过程,主要调度方式有两种:分别是协同式线程调度(Cooperative Threads-Scheduling)和抢占式线程调度(Preemptive Threads-Scheduling)。
Java 使用的线程调度方式就是抢占式调度。
Java 的线程是映射到系统的原生线程上来实现的,所以线程调度最终还是取决于操作系统。
对于Oracle JDK来说,它的Windows版与Linux版都是使用一对一的线程模型实现的,一条Java线程就映射到一条轻量级进程之中,因为Windows和Linux系统提供的线程模型就是一对一的。
用户空间和内核空间用户空间:User space,内核空间:Kernel Space,这两个是操作系统的重要概念。
1. 内核空间用于运行操作系统核心组件,比如内存管理组件,IO交互组件,文件管理、中断管理组件等,同时驱动程序(Driver)也运行在内核空间。
2. 用户空间,用于运行普通应用程序。
内核线程内核线程(Kernel-Level Thread, KLT)就是直接由操作系统内核(Kernel)支持的线程,这种线程由内核来完成线程切换,内核通过操纵调度器(Scheduler)对线程进行调度,并负责将线程的任务映射到各个处理器上。
内核线程有线程表(Thread table),用于保存线程的数据。线程的调度由操作系统内核来实现。
Java的线程是映射到操作系统的内核线程(KLT)之上的,如果阻塞或者唤醒一个线程,都是需要操作系统来帮忙完成,这就需要从用户态转换到内核态中,因为状态转换这一步会耗费很多的处理器时间,需要谨慎使用。
优势
1. 线程表包含所有进程的线程,所以一个进程的可能有多个线程同时在多个cpu上同时运行。
2. 一个线程被block不会导致整个进程被block,CPU会看是不是有其他线程可以运行。
劣势
1、创建线程消耗非常大,需要在用户空间和内核之间切换。
2、当然发生线程的Context切换时,程序也要从用户态和内核态之间互相切换,开销大。
本文内容由快快网络小琪创作整理编辑!