定义:进程是运行中的程序,运行中的程序可以理解为内存中的代码指令和运行相关的数据被CPU读写并计算的过程。
有人会认为,要提升CPU的利用率,可以开多个进程,但是开多个进程的话,进程间通讯是个比较麻烦的事情(进程之间地址空间是独立的,需要通过其他方式,例如:管道来解决)
相反,线程之间是可以实现数据共享的,因为线程之间使用的是同一个地址空间。
定义:一个程序中的多个执行路径。更准确的定义是:线程是一个进程内部的一个控制序列。
分类:内核线程、用户级线程、协程
特点:用户态线程之间的地址空间是隔离的;内核态,所有线程都共享同一内核地址空间。
线程和进程一样都是由操作系统的调度器来统一调度,线程本身的数据结构需要占用内存,频繁创建和销毁线程会加大系统的压力。另外,线程太多,系统调度的开销也会增大。
基于上面的情况,提出了线程池解决方案,在初始化的时候批量创建线程,然后用户后续通过队列等方式提交业务逻辑,线程池中的线程进行逻辑的消费工作,这样就可以在操作的过程中降低线程创建和销毁的开销,但是调度的开销还是存在的。
在多核场景下,如果是I/O密集型场景,就算开多个线程来处理,也未必能提升CPU的利用率,反而会增加线程切换的开销。另外,多线程之间假如存在临界区或者共享数据,那么同步的开销也是不可忽视的。
协程,正好可以解决上面的相关问题。
定义:协程是轻量级线程。
在一个用户线程上可以跑多个协程,这样就提高了单核的利用率。协程不像进程或者线程,可以让系统负责相关的调度工作,协程是处于一个线程中,系统是无感知的,所以需要在该线程中阻塞某个协程的话,就需要手工进行调度。
要在用户线程上实现协程是一件很难受的事情,原理类似于调度器根据条件的改变不停地调用各个协程的callback机制,但是前提是大家都在一个用户线程下。要注意,一旦有一个协程阻塞,其他协程也都不能运行了。因此要处理好协程。
多进程的出现是为了提升CPU的利用率,特别是I/O密集型运算,不管是多核还是单核,开多个进程必然能有效提升CPU的利用率。而多线程则可以共享同一进程地址空间上的资源,为了降低线程创建和销毁的开销,又出现了线程池的概念,最后,为了提升用户线程的最大利用效率,又提出了协程的概念。
原文:https://www.cnblogs.com/nizuimeiabc1/p/14674345.html