协程的问题

在以往的面试环节上,我这里吃了亏,只了解过,线程进程,协程是什么鬼?今天我查了一些资料,好好的分析以下什么叫做协程?

在说协程之前,我必须说一下什么叫做进程和线程?

先说一下进程:进程就是应用程序的启动实例,进程拥有代码和打开的文件资源、数据资源、独立的内存空间。
那么什么是线程呢?
线程从属于进程,是程序的实际执行者,一个进程最少包括一个主线程,也可以有更多的子线程。
线程拥有自己的栈空间。


image.png

我比较认可的是:
对于操作系统来说,线程是最小的执行单元,进程是最小的资源管理单元。
无论是进程还是线程,都是由操作系统所管理的。
java中的五种线程状态:初始化、可运行、运行中、阻塞、销毁。


image.png

但是,线程之间的不同状态的转换其实并不是由jvm来实现的,jvm需要通过操作系统的内核中的TCB(Thread Control Block)模块来改变线程的状态,这一过程需要耗费一定的cpu资源。

最后再说一说,线程之间的生产者消费者模式:
代码我就省了,大概总结一下,线程调用了notify和wait方法等实现了生产者、消费者模式,但是却不是一个高性能的实现,原因如下:
1.涉及到同步锁
2.涉及到了线程阻塞状态和可运行状态之间的切换
3,涉及到了线程的上下文切换
我所说的三点;都是非常消耗性能的操作

终于到了说什么才是协程了

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


image.png

协程不是被操作系统所管理的,而是完全由程序所控制,也就是在用户态执行,这样带来的好处是性能大幅提升,因为不会像线程切换那样消耗资源。
协程不是进程也不是线程,而是一个特殊的函数,这个函数可以在某个地方挂起,并且可以重新在挂起处外继续运行,所以说,协程与进程、线程相比不是一个维度的概念。

一个进程可以包含多个线程,一个线程可以包含多个协程,简单来说,一个线程内可以由多个这样的特殊函数在运行,但是必须有一点,一个线程里面的多个协程的运行是串行的,如果是多核CPU,多个进程或一个进程内的多个线程是可以并行运行的,但是一个线程内协程却绝对是串行的,无论CPU有多少个核。毕竟协程虽然是一个特殊的函数,但仍然是一个函数。一个线程内可以运行多个函数,但这些函数都是串行运行的。当一个协程运行时,其它协程必须挂起。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容