进程、线程、协程

1.进程

定义:进程是运行中的程序,运行中的程序可以理解为内存中的代码指令和运行相关的数据被CPU读写并计算的过程。

有人会认为,要提升CPU的利用率,可以开多个进程,但是开多个进程的话,进程间通讯是个比较麻烦的事情(进程之间地址空间是独立的,需要通过其他方式,例如:管道来解决)

相反,线程之间是可以实现数据共享的,因为线程之间使用的是同一个地址空间。

进程、线程、协程

 

2.线程

定义:Linux系统调用clone()函数出来的一个轻量级进程,一个程序中的多个执行路径。更准确的定义是:线程是一个进程内部的一个控制序列。

分类:内核线程、用户级线程、协程

特点:用户态线程之间的地址空间是隔离的;内核态,所有线程都共享同一内核地址空间。

线程和进程一样都是由操作系统的调度器来统一调度,线程本身的数据结构需要占用内存,频繁创建和销毁线程会加大系统的压力。另外,线程太多,系统调度的开销也会增大。

基于上面的情况,提出了线程池解决方案,在初始化的时候批量创建线程,然后用户后续通过队列等方式提交业务逻辑,线程池中的线程进行逻辑的消费工作,这样就可以在操作的过程中降低线程创建和销毁的开销,但是调度的开销还是存在的。

进程、线程、协程

 

在多核场景下,如果是I/O密集型场景,就算开多个线程来处理,也未必能提升CPU的利用率,反而会增加线程切换的开销。另外,多线程之间假如存在临界区或者共享数据,那么同步的开销也是不可忽视的。

协程,正好可以解决上面的相关问题。

3.协程

定义:协程是轻量级线程。

在一个用户线程上可以跑多个协程,这样就提高了单核的利用率。协程不像进程或者线程,可以让系统负责相关的调度工作,协程是处于一个线程中,系统是无感知的,所以需要在该线程中阻塞某个协程的话,就需要手工进行调度。

进程、线程、协程

 

要在用户线程上实现协程是一件很难受的事情,原理类似于调度器根据条件的改变不停地调用各个协程的callback机制,但是前提是大家都在一个用户线程下。要注意,一旦有一个协程阻塞,其他协程也都不能运行了。因此要处理好协程。

总结:

多进程的出现是为了提升CPU的利用率,特别是I/O密集型运算,不管是多核还是单核,开多个进程必然能有效提升CPU的利用率。而多线程则可以共享同一进程地址空间上的资源,为了降低线程创建和销毁的开销,又出现了线程池的概念,最后,为了提升用户线程的最大利用效率,又提出了协程的概念。

 

本文转自:https://www.toutiao.com/i6930260171335778820/?tt_from=mobile_qq&utm_campaign=client_share&timestamp=1613605911&app=news_article&utm_source=mobile_qq&utm_medium=toutiao_android&use_new_style=1&req_id=20210218075151010212148030485FF47B&share_token=322d9db0-a04d-4449-b805-192b9f595a53&group_id=6930260171335778820

posted @ 2021-04-18 19:35  ppjj  阅读(278)  评论(0编辑  收藏  举报