
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线程争锁阻塞
当线程任务过多时,会出现 很多线程同时争用同一块资源 而等锁 阻塞等待
