【操作系统】线程
JavaEE—线程
一、进程与线程
1.包含管理
2.资源布局
2.1公共资源
2.2私有资源
二、并发编程
1.多线程优势
1.1创建
1.1.1多线程
1.1.2多进程
1.2通信
1.2.1多线程
1.2.2多进程
1.3调度
1.3.1多线程
1.3.2多进程
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.调度理想数量
1.1调度提升效率
1.2黄金法则
2.数量过多
2.1调度占比上升
2.2CPU缓存失效
2.3线程争锁阻塞
一、进程与线程
进程:每个进程 对应一个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线程争锁阻塞
当线程任务过多时,会出现 很多线程同时争用同一块资源 而等锁 阻塞等待