进程:资源分配和调度单位
- 操作系统进行资源分配的最小单位,资源包括:CPU、内存空间、磁盘等
- 同一个进程中的多个线程共享该进程中的全部资源(堆和方法区资源)
- 进程之间是相互独立的
线程:线程是CPU调度的最小单位,必须依赖进程而存在
巧妙地利用了时间片轮转的方式,CPU 给每个任务都服务一定的时间,然后把当前任务的状态保存下来,在加载下一任务的状态后,继续服务下一任务,任务的状态保存及再加载, 这段过程就叫做上下文切换。时间片轮转的方式使多个任务在同一颗 CPU 上执行变成了可能。
上下文:是指某一时间点 CPU 寄存器和程序计数器的内容
引起线程上下文切换的原因
- 当前执行任务的时间片用完之后,系统 CPU 正常调度下一个任务;
- 当前执行任务碰到 IO 阻塞,调度器将此任务挂起,继续下一任务;
- 多个任务抢占锁资源,当前任务没有抢到锁资源,被调度器挂起,继续下一任务;
- 用户代码挂起当前任务,让出 CPU 时间;
- 硬件中断;
线程让出 cpu 的情况
- 当前运行线程主动放弃 CPU,JVM 暂时放弃 CPU 操作(基于时间片轮转调度的 JVM 操作系统不会让线程永久放弃 CPU,或者说放弃本次时间片的执行权),例如调用 yield()方法。
- 当前运行线程因为某些原因进入阻塞状态,例如阻塞在 I/O 上。
- 当前运行线程结束,即运行完 run()方法里面的任务。
- 抢占式调度:抢占式调度指的是每条线程执行的时间、线程的切换都由系统控制。在这种机制下,一个线程的堵塞不会导致整个进程堵塞。
- 协同式调度:协同式调度指某一线程执行完后主动通知系统切换到另一线程上执行,这种模式就像接力赛一样,但它有一个致命弱点:如果一个线程编
写有问题,运行到一半就一直堵塞,那么可能导致整个系统崩溃。
JVM 的线程调度实现(抢占式调度)
串行:在同一时间一个人只能做一件事的情况下,一个人交替做着做多件事
并行:在同一时间一个人同时做多件事,如左后开弓一般
并发:在同一时间多个人抢着做同一件事,如竞争一个位置
同步:发送一个请求,等待返回,然后再发送下一个请求。
异步:发送一个请求,不等待返回,随时可以在发送下一个请求。
吞吐量表示在单位时间内通过某个网络或接口的数据量
优点:充分利用CPU、加快响应用户的时间、是代码模块化、异步化、简单化
缺点:发生线程安全问题、容易死循环
高并发与分布式
- 高并发:指并发在单个资源个体的情况下实现达到最大资源利用价值,如:1个服务器4个CPU*4核,那么并行为16,高并发则利用多线程技术,可能实现160个
- 分布式:当来了 1 万个并发时,原来资源满足不了,就并行的再多开几个资源服务器。说白了就是多找几个服务器写作完成。常见架构有Hadoop、Hbase、Zookeeper、Redis