进程
是计算机进行资源分配和调度的独立单位
每个进程都有自己的独立的空间
进程间通信方式:管道通信、消息队列、信号量机制、共享内存、套接字通信等
由于进程占据独立的内存空间,所以进程的切换消耗比较大,但相对稳定安全
线程
线程是进程的一个实体,是cpu调度和分派的基本单位,基本不占用内存资源,只有一点必不可少的运行资源
通信方式是:共享内存
因为所占内存空间小,所以切换很快,但不稳定,易丢失数据
协程
协程是一种用户态的轻量级线程,拥有自己的寄存器上下文和栈,协程调度切换时,将寄存器上下文和栈保存在其他地方,再切回来的时候,回复先前的寄存器上下文和栈
切换的时机由用户/编程者来进行控制,切换的人也不是操作系统是用户/编程者(进程和线程的切换者都是操作系统)
协程能够保留上一次调用的时候的状态,每次过程重入时,相当于进入上一次调用的状态也就是说
进入上一次离开时所处逻辑流的位置
协程表示一个执行单元,有自己的本地数据,与其他协程共享全局数据和其他资源
我们的代码跑在线程中的,而线程是跑在进程中的
协程没有直接和操作系统关联,但他是跑在线程中的,可以是单线程,也可以是多线程
线程进程都是同步机制,而协程则是异步
(一个线程内的多个协程的运行是串行的)
无栈协程:因为没有自己的栈,只有自己的桢
有栈协程:有自己栈 ~有点废话
协程优点
1、无需线程上下文切换的开销
2、无需原子操作锁定及同步的开销
3、方便切换控制流
4、高并发低成本
协程使用一般是解决 I/O阻塞
(为什么线程不能解决: 因为一个IO操作就阻塞了当前线程,导致其他代码无法执行,所以我们必须使用多线程或者多进程来并发执行代码,为多个用户服务。每个用户都会分配一个线程,如果遇到IO导致线程被挂起,其他用户的线程不受影响。
多线程和多进程的模型虽然解决了并发问题,但是系统不能无上限地增加线程。由于系统切换线程的开销也很大,所以,一旦线程数量过多,CPU的时间就花在线程切换上了,真正运行代码的时间就少了,结果导致性能严重下降。)
因为当一个I/O阻塞时,它可以切换到其他没有阻塞的协程上去继续执行,这样就有了比较高的效率