协程-进程-线程

本文最后更新于:2020年11月2日 下午

进程与线程

进程是什么

进程就是应用程序的启动实例
比如我们运行一个游戏,打开一个软件,就是开启了一个进程
进程拥有代码和打开的文件资源、数据资源、独立的内存空间

线程是什么

线程从属于进程,是程序的实际执行者
一个进程至少包含一个主线程,也可以有更多的子线程
线程拥有自己的栈空间
线程会在不同状态中不断转化

线程不同状态之间的转化由操作系统内核中的TCB(Thread Control Block)模块实现,这一过程需要耗费一定的CPU资源

信息

对操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元
无论进程还是线程,都是由操作系统所管理的

痛点

  • 多个线程共同运作时,为了不出现问题,通常要同步加锁
  • 线程在 阻塞状态 和 可运行状态 之间切换需要CPU资源
  • 线程 上下文切换(指记录程序执行到何处)需要CPU资源

什么是协程

协程是一种比线程更加轻量级的存在
正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程

最重要的是,协程不是被操作系统内核所管理,而完全是由程序所控制
这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源。因此,协程的开销远远小于线程的开销。

优缺

优点

  • 提高性能
    相对于线程。无需线程上下文切换的开销,协程避免了无意义的调度,由此可以提高性能(但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力)
  • 无需原子操作锁定及同步的开销
  • 方便切换控制流,简化编程模型
  • 高并发+高扩展性+低成本
    一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。

缺点

  • 无法利用多核资源
    协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上。
    协程需要和进程配合才能运行在多CPU上。当然日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用
  • 进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!