进程、线程、协程
进程
进程是系统分配资源和调度的基本单位, 每个CPU同一时刻只能处理一个进程。进程拥有程序代码段、打开的文件、数据资源、独立的内存空间。
进程的局限性是创建、撤销、切换的开销比较大。
线程
线程是程序执行的最小单位,线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有更多的子线程;线程拥有自己的栈空间。
线程的优点:减小了程序并发执行的开销,提高了系统的并发性能。
线程的缺点:线程没有自己的系统资源,只有运行时不可缺少的资源,但是同一进程的各线程可以共享进程所拥有的系统资源。对于某些独占资源存在锁机制,处理不当会出现死锁。
协程
协程是一种用户态的轻量级线程;协程调度完全由用户控制,没有线程切换的系统资源开销。
优点:协程执行效率高。因为子程序切换不是线程切换,由程序自身控制,没有线程切换的开销。协程不需要多线程的锁机制。在协程中控制共享资源不加锁,只需要判断状态就好
区别与联系
- 进程与线程
1、资源方面:进程间相互独立,同一进程的各线程间共享。某进程内的线程在其他进程不可见
2、通信:进程间通信IPC,进程间可以直接读写进程数据段进行通信——需要进程同步和互斥手段辅助,以保证数据的一致性
3、调度和切换:线程上下文切换比进程上下文切换要快的多
4、在多线程OS中,线程不是一个可执行的实体
- 线程与协程
- 1、线程是操作系统调度,协程是应用系统自己调度。
- 2、协程的栈空间是可以动态调整的,线程的栈空间是固定大小的
- 3、线程进程都是同步机制,而协程则是异步
- 4、协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态
- 5、一个线程可以多个协程,一个进程也可以单独拥有多个协程
线程调度策略
- 时间片轮转
- 先来先服务
- 基于优先权调度算法
- 多队列调度
- 最短作业优先
线程的主要状态
- 初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
- 运行(RUNNABLE):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取cpu 的使用权,此时处于就绪状态(ready)。
- RUNNING:就绪状态的线程在获得cpu时间片后变为运行中状态。
- 阻塞(BLOCKED):表线程阻塞于锁。
- 等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
- 超时等待(TIME_WAITING):该状态不同于WAITING,它可以在指定的时间内自行返回。
- 终止(TERMINATED):表示该线程已经执行完毕。