进程:是资源分配的最小单位;
² 调度由操作系统完成;
² 进程空间独立,数据安全性好,有专门的进程间通信方法
² 进程的创建和删除要比线程消耗更多的计算机资源
² 有独立的内存空间(上下文切换的时候需要保存栈、cpu寄存器、虚拟内存、以及打开的相关句柄等信息,开销大)
1、操作系统进行资源分配和调度的基本单位,多个进程之间相互独立
2、稳定性好,如果一个进程崩溃,不影响其他进程,但是进程消耗资源大,开启的进程数量有限制
线程:是程序执行的最小单位(资源调度最小单位);
² 一个进程可以有多个线程,每个线程会共享父进程的资源(创建线程开销占用比进程小很多,可创建的数量也会很多)
² 线程的使用会给系统带来上下文切换的额外负担;
² 一个进程可以包含多个线程,线程共享进程的资源空间
1、CPU进行资源分配和调度的基本单位,线程是进程的一部分,是比进程更小的能独立运行的基本单位,一个进程下的多个线程可以共享该进程的所有资源
2、如果IO操作密集,则可以多线程运行效率高,缺点是如果一个线程崩溃,都会造成进程的崩溃
协程:² 调度完全由用户控制;
² 一个线程(进程)可以有多个协程;
² 每个线程(进程)循环按照指定的任务清单顺序完成不同的任务(当任务被堵塞时,执行下一个任务;当恢复时,再回来执行这个任务;任务间切换只需要保存任务的上下文,没有内核的开销,可以不加锁的访问全局变量)
² 协程需要保证是非堵塞的且没有相互依赖
² 写成基本上不能同步通讯,多采用异步的消息通讯,效率比较高;
协程,为何比线程还快:高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。协程能保留上一次调用的状态,管是进程还是线程,每次阻塞、切换都需要陷入系统调用,使用线程时需要非常小心地处理同步问题,二协程完全不存在这个问题。
协程与线程进行比较:1)一个线程可以多个协程,一个进程也可以单独拥有多个协程,这样Python中则能使用多核CPU。
2)线程进程都是同步机制,而协程则是异步
3)协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态
进程与线程比较:线程是指进程内的一个执行单元,也是进程内的可调度实体。线程与进程的区别:
1)地址空间:线程是进程内的一个执行单元,进程内至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间
2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源
3)线程是处理器调度的基本单位,但进程不是
4)二者均可并发执行
5)每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口,但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制
² 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点;
² 多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。
同步异步指的是在客户端
同步意味着客户端提出了一个请求以后,在回应之前只能等待
异步意味着客户端提出一个请求以后,还可以继续提其他请求,不管有无结果
阻塞非阻塞指的是服务器端
阻塞意味着服务器接受一个请求后,在返回结果以前不能接受其他请求
非阻塞意味着服务器接受一个请求后,尽管没有返回结果,还是可以继续接受其他请求
并行:是指同一时刻同时做多件事情,而并发是指同一时间间隔内做多件事情;
并行是指同时发生的两个并发事件,具有并发的含义,而并发则不一定并行,也亦是说并发事件之间不一定要同一时刻发生。
并发:的实质是一个物理CPU(也可以多个物理CPU)在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率。并行性指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不同CPU上同时执行。
并行,是每个CPU运行一个程序。
多线程:在单个程序中同时运行多个线程完成不同额工作,称为多线程。线程共享内存空间;进程的内存是独立的,同一个进程的线程之间可以直接交流;两个进程想通信,必须通过一个中间代理来实现,一个线程可以控制和操作同一进程里的其它线程;但是进程只能操作子进程;
优缺点:1、多进程的优点是稳定性好,一个子进程崩溃了,不会影响主进程以及其余进程。但是缺点是创建进程的代价非常大,因为操作系统要给每个进程分配固定的资源。2、多线程优点是小路较高一些,但是致命的缺点是任何一个线程崩溃都可能造成整个进程的崩溃,因为他们共享了进程的内存资源池。
CPU密集型(CPU-bound)
CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写 I/O (硬盘/内存),I/O在很短的时间内就可以完成,而CPU还有许多运算需要处理,CPU Loading很高.
在多重程序系统中,大部分时间用来做计算、逻辑判断等CPU动作的程序称之CPU bound.例如一个计算圆周率至小数点一千位一下的程序,在执行的过程中绝大部分的时间用在三角函数和开根号的计算,便是属于CPU bound的程序.
CPU bound的程序一般而言CPU占有率相当高.这可能是因为任务本身不太需要访问I/O设备,也可能是因为程序是多线程实现因此屏蔽了等待I/O的时间.
I/O密集型(I/O bound)
IO密集型指的是系统的CPU性能相对硬盘、内存要好很多,因此,系统运作,大部分情况是CPU在等I/O(磁盘/内存)的读/写操作,此时CPU Loading并不高.
I/O bound的程序一般在达到性能极限时,CPU占用率仍然较低.这可能是因为任务本身需要大量I/O操作,而pipeline做得不是很好,没有充分利用处理器能力.
CPU密集型 vs IO密集型
我们可以把任务分为计算机密集型和IO密集型.
计算密集型任务的特点是要进行大量的计算,消耗CPU资源,比如计算圆周率、对视频进行高清解码等等,全靠CPU的运算能力.这种计算密集型任务虽然也可以多任务完成,但是任务越多,花在任务切换的时间越多,CPU执行任务的效率就越低,所以,要最高效地利用CPU,计算密集型任务同时进行数量应当等于CPU的核心数.
计算密集型任务由于主要消耗CPU资源,因此,代码运行效率至关重要.Python这样的脚本语言运行效率很低,完全不适合计算密集型任务.对于计算密集型任务,最好用C语言编写.
第二种任务的类型是IO密集型,涉及到网络、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU的内存和速度).对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度.常见的大部分任务都是IO密集型任务,比如Web应用.
IO密集型任务执行期间,99%的时间都花在IO上,花在CPU上的时间很少,因此,用运行速度极快的C语言替换用Python这样运行速度极低的脚本语言,完全无法提升运行效率.对于IO密集型任务,最适合的语言就是开发效率最高(代码量最少)的语言,脚本语言是首选,C语言最差.
总之,计算密集型程序适合C语言多线程,I/O密集型适合脚本语言开发的多线程.
*CPU密集型适合用多进程开发
应用:IO密集的用多线程,在用户输入,sleep时候,可以切换到其他线程执行,减少等待的时间CPU密集的用多进程,因为假如IO操作少,用多线程的话,因为线程共享一个全局解释器锁,当前运行的线程会霸占GIL,其他线程没有GIL,就不能充分利用多核CPU的优势
来源:https://www.cnblogs.com/qingaoaoo/p/12389696.html