进程
进程定义
- 狭义定义:
进程是正在运行的程序的实例。- 广义定义:
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
进程状态流转
进程执行时的间断性,决定了进程可能具有多种状态。事实上,运行中的进程可能具有以下三种基本状态。
- 就绪状态:
就绪进程已获得除处理器以外的所需资源,等待分配处理器资源,即可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。- 运行状态:
进程占用处理器资源,处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。- 阻塞状态:
由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理器资源分配给该进程,也无法运行。
线程
线程定义
- 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,每条线程并行执行不同的任务。
线程状态流转
- 新建( new ):新创建一个Thread对象就生成一个新线程。此时还没有分配到系统资源,只能启动或终止它。任何其他操作都会引发异常。
- 可运行( runnable ):线程对象被创建后的状态。可运行线程并不总是能占用处理机,任何时刻只能有一个处于可运行态的线程占用处理机。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权 。
- 运行( running ):可运行状态的线程获得了CPU时间片之后执行程序代码,此时状态为运行态。
- 阻塞( block ):阻塞状态是指线程因为某种原因放弃了CPU使用权,让出了 CPU时间片,暂时停止运行。直到线程再次进入可运行状态,才有机会再次获得 CPU时间片转到运行态。阻塞的情况分三种:
1.等待阻塞:运行态的线程执行wait()方法,该线程被放入等待队列中。
2.同步阻塞:运行态的线程在获取对象的同步锁时,若该同步锁被别的线程占用,该线程会被放入锁池中。
3.其他阻塞: 运行态的线程执行Thread.sleep(long ms)或join()方法,或者发出了I/O请求时,该线程会被置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行态。- 死亡( dead ):线程执行结束、主线程执行结束、或因异常退出线程,则该线程结束生命周期。死亡的线程不可再次复生。
同步与异步,阻塞与非阻塞
同步与异步关注的是消息通信机制,阻塞与非阻塞强调的是程序在等待调用结果时的状态。
定义
1.同步,调用方等待返回结果才能继续往后执行,同步等待时什么都不干,白白占用着资源。
2.异步,调用方不会等待返回结果,继续执行后续操作,被调用者通过状体来通知、或者通过回调函数来把结果反馈给调用方。
3.阻塞调用,指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。
4.非阻塞调用,指在不能立刻得到结果之前,该调用不会阻塞当前线程。
使用场景
- 异步使用场景
1.不涉及共享资源,或对共享资源只读,即非互斥操作
2.没有时序上的严格关系
3.不需要原子操作,或可以通过其他方式控制原子性
4.常用于IO操作等耗时操作,因为比较影响客户体验和使用性能
5.不影响主线程逻辑- 同步使用场景
无需异步解决的场景,可选用同步