进程、线程、协程原理

  • 进程、线程、协程原理已关闭评论
  • 1 views
  • A+
所属分类:编程开发

在最原始的时候程序是这样运行的,我们假设这两个程序为 A 和 B

而这两个程序都很大,每个程序大概有几千到几万行代码,它们两个的存在意义就是到CPU上去运行,通过计算机和人类进行交互。

CPU 是一个稀缺资源,只有一个,程序 A 和 程序B必须排着队轮流使用 CPU ,当程序 A

行头到尾执行完了,让出 CPU ,让程序 B 去执行,这种执行逻辑就叫做 “批处理”

进程

后来由于科技的进步,CPU 的速度越来越快,远远超过了内存,硬盘的处理速度,这样的话这种批处理的方式效率自然就很低了,因为当程序A从硬盘上读取数据的时候,CPU也一直在等待着,这明显就造成了极大的浪费,这个空闲的时间完全可以让程序B来运行以提高效率。但是你还不能完全不管程序A的执行进度,必须要将程序A的执行进度保存下来,比如:执行到哪一行指令了,函数调用到什么层次了,每个函数调用都有什么样的参数,CPU寄存器中的值等,一系列的东西,如果不保存,那么程序A将无法再继续执行,而又得重新执行了。

同时为了执行效率:人们还规定了,进程不能长时间占据CPU,只能在CPU上运行一小会儿,然后马上切换到别的进程去执行。这个切换几乎是毫秒级的,以人的速度基本上是感觉不到的,这就是并发执行,也就是为什么你可以同时能听着歌聊着天了。

进程、线程、协程原理

=======================================================

纯个人手打,经常发些好看好玩,改装,技术贴,在闲暇的时间里为大家共享一些工作经验和各种技术资源文章,希望帮助大家共同进步,也希望我的发布对你有所帮助,喜欢的请点关注,谢谢。你们的关注是我不停发布的最大动力=======================================================

线程

再往后,人类的水平逐渐提高,再程序中加入了界面,同时还能访问网络资源,每当它联网的时候就会比较耗时,这时就得吧CPU让出来给程序B使用,即使程序A再次被调度执行,由于网络数据还没有返回,它必须等待,什么事情都做不了,在人类看来界面根本无法操作,这时我们就会看到 “程序无法响应”,然后就得把进程给结束掉。

后来,为了解决这一尴尬,一个程序中加入了多条执行流程,这多个执行流程可以分别做着不同的操作,而这个流程就称之为 “线程”,当线程1在读写磁盘数据时,线程2在同时处理界面,这样的话即使有一个线程在忙碌,还有另一个线程可以操作。

于是,一个进程中至少有一个执行的主线程,也可以开启新的执行线程,线程变成了一个最小的调度单位。

进程、线程、协程原理

协程:

协程类似于批处理,协程和线程的区别是:协程避免了无意义的调度,由此可以提高性能,但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力。协程在多核CPU上不占优势

打个比方:假设有一个操作系统,是单核的,系统上没有其他的程序需要运行,有两个线程 A 和 B ,A 和 B 在单独运行时都需要 10 秒来完成自己的任务,而且任务都是运算操作,A B 之间也没有竞争和共享数据的问题。现在 A B 两个线程并行,操作系统会不停的在 A B 两个线程之间切换,达到一种伪并行的效果,假设切换的频率是每秒一次,切换的成本是 0.1 秒,总共需要 20 + 19 * 0.1 = 21.9 秒。

如果使用协程的方式:可以先运行协程 A, A 结束的时候让位给协程 B ,只发生一次切换,总时间是 20 + 1 * 0.1 = 20.1 秒。如果系统是双核的,而且线程是标准线程,那么 A B 两个线程就可以真并行,总时间只需要 10 秒,而协程的方案仍然需要 20.1 秒。

  • 我的微信
  • 微信扫一扫
  • weinxin
  • 微信公众号
  • 微信公众号扫一扫
  • weinxin
avatar