什么是进程?
正在进行的一个过程或者说一个任务,而负责执行任务的是CPU
进程与程序的区别
程序只是一堆代码而已,而进程是程序的运行过程
同一个程序执行两次,是开启两个不同的进程,比如:同一个视频播放器,开启两次分别播放不同的电影
并发与并行
无论是并发还是并行,在用户看来都是“同时”运行,不管是进程还是线程,都只是一个任务而已,真正干活的是cpu,cpu来做这些任务,而一个cpu同一时刻只能执行一个任务
并发:是伪并行,即看起来是同时运行。cpu执行一会任务A,再去执行任务B,再去执行任务C,保证每个任务都在执行中。 单个CPU+多道技术,实现多个进程的并发执行
并行:同时运行多个任务,只有具备多个CPU才能实现并行,并行也属于并发
单核下,利用多道技术实现并发;多核,也可以利用多道技术(多道技术是针对单核而言的)
多道技术:内存中同时存入多个程序,cpu从一个进程快速切换到另外一个进程,使每个进程各自运行几十或者几百毫秒,这样,虽然在某一个瞬间,一个cpu只能执行一个任务,但在1秒内,cpu却可以运行多个进程,这就给人产生了并行的错觉,即伪并行
多个cpu共享同一个物理内存
进程的调度,分配给哪个cpu执行,由操作系统决定
同步\异步and阻塞\非阻塞
同步:发出一个功能调用时,在没有得到结果之前,该调用就不会返回。绝大多数函数都是同步调用。
例如:multiprocessing.Pool下的apply,发起同步调用后,就在原地等待任务结束,根本不考虑任务是在计算还是在io阻塞,总之就是等待任务结束
异步:发出一个异步功能调用,调用者不能立即得到结果,当异步功能完成后,通过状态,通知或者回调来通知调用者。
如果异步功能用状态来通知,那么调用者就需要每隔一段时间检查一次,效率特别低
使用通知的方法,效率则很高,因为异步功能几乎不需要做额外的操作
回调函数,和通知的方法,差不多
例如:multiprocessing.Pool().apply_async(),发起异步调用后,并不会等待任务结束才返回,相反,会立即获取一个临时结果(并不是最终的结果,可能是封装好的一个对象)
阻塞:阻塞调用是指,调用结果返回之前,当前线程会被挂起(如遇到io操作),函数只有在得到结果之后才会将阻塞的线程激活
有人也许会把阻塞调用和同步调用等同起来,实际上是不同的。对于异步调用来说,很多时候当前线程还是激活的,只是在逻辑上当前函数没有返回而已
例如:同步调用:apply一个累计1亿次的任务,该调用会一直等待,直到任务返回结果为止,但并未阻塞(即便被抢走cpu的执行权限,也是处于就绪态)
阻塞调用:当socket工作在阻塞模式的时候,如果没有数据的情况下调用recv函数,则当前线程会被挂起,直到有数据为止
非阻塞:与阻塞的概念相对应,指在不能立即得到结果之前也会立刻返回,同时该函数不会阻塞当前线程
小结:阻塞与非阻塞针对的是线程或者进程,阻塞是当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程
同步与异步,针对的是函数/任务的调用方式,同步就是当一个进程发起一个函数/任务调用时,一直等到函数/任务完成,而进程继续处于激活状态;而异步情况下是当一个进程发起一个函数/任务调用的时候,不会等函数返回,而是继续往下执行,函数通过状态,通知,事件等方式通知进程任务完成。
进程的创建
进程的终止
进程的层次结构
进程的状态
进程并发的实现
原文:https://www.cnblogs.com/yizhixiaowenzi/p/12260541.html