JavaEE—线程
一、进程与线程
进程:每个进程 对应一个PCB,是操作系统 资源分配的基本单位
线程:每个线程 对应一个TCB,是CPU 调度执行的基本单位
1.包含管理
PCB 包含管理 TCB,线程在进程里面创建,每一个进程中 至少创建有一个主线程
2.资源布局
链接:进程的内存管理
2.1公共资源
同进程的线程TCB 指针指向对应 同一个PCB,共用PCB的 内存指针、文件描述符表 指向的进程的公共资源,属于PCB的内核空间
2.2私有资源
每个线程各自不同的 状态、上下文、记账信息 都存储在 进程划分管理的 私有资源中,属于PCB的用户进程空间
二、并发编程
多进程与多线程 是实现并发编程的两种方式
1.多线程优势
同进程的多线程 互相共用配合,资源共享,轻量高效:
1.1创建
1.1.1多线程
进程额外新建线程时,复用进程的 已申请的资源 来创建,创建轻便迅速,资源利用率高
1.1.2多进程
- 创建主线程时的进程,需要向操作系统 申请寻找分配资源,相对耗时
- 每个进程中 只有一个主线程 单独使用资源,资源利用率低
1.2通信
1.2.1多线程
同进程的线程 共享进程资源:
- 使用相同虚拟地址指针 互访共用 内存
- 使用相同fd 互访共用 文件
共用着资源访问 即可完成通信,通信效率高
1.2.2多进程
异进程的线程 需要跨进程 保持独立地通信,通信效率低
链接:进程间通信
1.3调度
1.3.1多线程
同进程的线程 调度时 只需要切换寄存器上下文,调度切换快
1.3.2多进程
异进程的线程 调度时 还需切换虚拟地址空间,调度切换慢
链接:CPU的调度
1.4销毁
1.4.1多线程
销毁进程的 普通线程时,只需释放 线程的少量私有资源,销毁迅速
1.4.2多进程
销毁主线程时的进程,需要释放 进程所有的资源,销毁缓慢
2.多进程优势
多进程间的线程 互相独立,资源安全隔离,稳定性高:
2.1安全性
2.1.1多进程
异进程的线程 资源独立,不会出现 争用同块资源,线程安全
2.1.2多线程
同进程的线程 会出现 同时去访问同块资源 造成线程不安全,需要引入同步机制
2.2稳定性
2.2.1多进程
异进程的线程 互相独立,某个线程异常崩溃 销毁所属进程 不会到影响彼此,线程稳定性高
2.2.2多线程
同进程的线程 抛出异常,没有得到处理 会使整个进程崩溃,从而销毁进程里 所有其它的线程,线程稳定性低
三、线程数量
1.调度理想数量
CPU执行指令 | 1纳秒/条 |
线程I/O读取来执行指令 | 10毫秒/次(比cpu指令执行慢1000万倍) |
CPU调度切换 | 1微秒/次 |
1.1调度提升效率
CPU快速执行完 当前线程的任务指令 还未等到 该线程下次的I/O读取来指令时,调度切换到另一个已I/O好的线程 不停息地 继续执行指令
1.2黄金法则
当调度的线程总量 使CPU刚好执行完每个线程的任务指令时 就调度切换,CPU达到 最高效的持续执行:
线程数 ≈ CPU核心数 * (1 + 等待时间/计算时间)
- CPU密集型任务(计算) : 线程数 ≈ 核心数
- I/O密集型任务(网络) : 线程数可多于核心数
2.数量过多
调度的线程数量过多 会导致CPU 执行效率降低:
2.1调度占比上升
在调度理想线程数量的基础上 再增加线程数量时,会使得CPU 未执行完当前线程任务指令时 就调度切换走,CPU仍然不停息地 持续执行指令 但单位时间中 无用的调度切换 开始占比增大地 减少CPU有效执行指令的占比,使得CPU执行效率 开始下降
2.2CPU缓存失效
CPU缓存是为 连续计算优化的,要调度的线程过多 导致过于频繁切换线程时,缓存被冲刷,缓存命中率大幅下降,CPU缓存失效
2.3线程争锁阻塞
当线程任务过多时,会出现 很多线程同时争用同一块资源 而等锁 阻塞等待