CPU的核心数
- CPU个数:是指物理上,即硬件上的核心数;
- 核心数:是逻辑上的,简单理解为逻辑上模拟出的核心数;
- 线程数:是同一时刻设备能并行执行的程序个数,线程数 = cpu个数 * 核数;
区分CPU线程数与JAVA多线程的概念
CPU线程数:在CPU线程中,一个线程通常指的是一个运行在桌面的窗口应用(以有可视化的操作系统为例,该应用又称进程)。通常在windows的任务管理器可以看见进程的状态。一个线程(又称进程、应用程序)只会在一个CPU线程上运行。
JAVA多线程:java线程通常是有开发者手动调用new Thread()函数创建,该java线程统一由JVM进程管理。其中“多线程”概念并非是因为CPU的核心数多个组成而来,只是在java进程内,开发者使用多个Java线程来处理任务。
简单理解为:java多线程数与多核CPU的核心数无关。
思考:现实工作中有一些线程池创建时,指定的核心数大小如何确定的?
时间片轮转机制(Round-Robin又称RR调度)
名称通俗解析
- 时间片:一个运行中的(CPU线程)的进程不会一直持有操作系统资源,会给定一个可以容忍的持有时长(这个时间为10-100ms)。具体数值由CPU计算得到
- 轮转机制:在一个CPU线程到达CPU计算的持有时长时,系统将决定下一个进程是哪个。通常情况下该按照 先来先服务,到达持有时长的线程移动到最后等待下一次调度。
时间片轮转机制的内部结构设计
组件解析
JVM线程调度(Thread scheduler)
设计思想:抢占式调度、时间片轮转
抢占式调度:在日常工作编码中,我们可以通过手动设置线程是优先级,来获取cpu调度的高优先级。但这个情况只有某些特定情况下,如:在CPU资源存在紧张。
时间片轮转:在java的线程创建时,采用了CPU的时间片轮转思想给每一个java线程分配一定的时间片,确保每一个线程都可以被调度。公平的使用CPU资源,避免某一java线程长时间占用。
通常情况下,JVM线程调度还考虑到以下方面:
- 线程的优先级:线程的优先级范围从1到10,其中1为最低优先级,10为最高优先级,默认优先级为5,通过手动设置较高的优先级从而在调度时较高几率获取到调用机会。
- 线程的状态管理:Java线程通过(阻塞、运行、等待等状态)来管理线程,线程调度器也可以根据这些状态来调度线程。
- 线程同步机制:Java的同步机制(锁、条件变量等条件)来控制每一个线程的执行顺序,线程调度器也会根据这些来调度线程,避免发生死锁、线程冲突。
总结
Java的调度机制通过线程调度器实现,采用抢占式调度和时间片轮转的策略,以及支持线程优先级和同步机制,来协调和管理线程的执行顺序,从而实现多线程程序的并发执行。