加入abc三个依次执行,可是a阻塞了,就直接不执行a了,直接跳过去执行b,和c,最后在执行apython
多道程序设计, 提升了cpu的利用率算法
进程:本质上就是一个一段程序的运行过程(抽象的概念)编程
线程:最小的执行单元(实例)多线程
进程:最小的资源单位(操做系统在分资源时,只能分到进程这里)并发
进程就至关于一个容器,里面能够容纳多个线程app
进程只是把资源集中到一块儿,(进程只是一个资源单位,或者说一个资源集合),而线程才是cpu上的执行单位异步
假若有两个程序A和B,程序A在执行到一半的过程当中,须要读取大量的数据输入(I/O操做), 而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源。 是否是在程序A读取数据的过程当中,让程序B去执行,当程序A读取完数据以后,让 程序B暂停,而后让程序A继续执行? 固然没问题,但这里有一个关键词:切换 既然是切换,那么这就涉及到了状态的保存,状态的恢复,加上程序A与程序B所须要的系统资 源(内存,硬盘,键盘等等)是不同的。天然而然的就须要有一个东西去记录程序A和程序B 分别须要什么资源,怎样去识别程序A和程序B等等,因此就有了一个叫进程的抽象
通俗的说就是
想象一位有一手好厨艺的计算机科学家egon正在为他的女儿元昊烘制生日蛋糕。socket
他有作生日蛋糕的食谱,ide
厨房里有所需的原料:面粉、鸡蛋、韭菜,蒜泥等。函数
在这个比喻中:
作蛋糕的食谱就是程序(即用适当形式描述的算法)
计算机科学家就是处理器(cpu)
而作蛋糕的各类原料就是输入数据。
进程就是厨师阅读食谱、取来各类原料以及烘制蛋糕等一系列动做的总和。
线程的出现是为了下降上下文切换的消耗,提升系统的并发性,并突破一个进程只能干同样事的缺陷,
使到进程内并发成为可能。
假设,一个文本程序,须要接受键盘输入,将内容显示在屏幕上,还须要保存信息到硬盘中。若只有
一个进程,势必形成同一时间只能干同样事的尴尬(当保存时,就不能经过键盘输入内容)。如有多
个进程,每一个进程负责一个任务,进程A负责接收键盘输入的任务,进程B负责将内容显示在屏幕上的
任务,进程C负责保存内容到硬盘中的任务。这里进程A,B,C间的协做涉及到了进程通讯问题,并且
有共同都须要拥有的东西-------文本内容,不停的切换形成性能上的损失。如有一种机制,可使
任务A,B,C共享资源,这样上下文切换所须要保存和恢复的内容就少了,同时又能够减小通讯所带
来的性能损耗,那就行了。是的,这种机制就是线程。
多线程指的是,在一个进程中开启多个线程,简单的讲:若是多个任务共用一块地址空间,那么必须在一个进程内开启多个线程。详细的讲分为4点:
1. 多线程共享一个进程的地址空间
2. 线程比进程更轻量级,线程比进程更容易建立可撤销,在许多操做系统中,建立一个线程比建立一个进程要快10-100倍,在有大量线程须要动态和快速修改时,这一特性颇有用
3. 若多个线程都是cpu密集型的,那么并不能得到性能上的加强,可是若是存在大量的计算和大量的I/O处理,拥有多个线程容许这些活动彼此重叠运行,从而会加快程序执行的速度。
4. 在多cpu系统中,为了最大限度的利用多核,能够开启多个线程,比开进程开销要小的多。(这一条并不适用于python)
并发:在同一时间间隔内执行(指系统具备处理多个任务的能力,cpu切换)
并行:在同一时刻执行 (同时处理多个任务,)
关系:
并行是并发的一个子集
全部的并发处理都有排队等候,唤醒和执行这三个步骤,因此并发是宏观的观念,在微观上他们都是序列被处理的,只不过资源不会在某一个上被阻塞(通常是经过时间片轮转),因此在宏观上多个几乎同时到达的请求同时在被处理。若是是同一时刻到达的请求也会根据优先级的不一样,前后进入队列排队等候执行。
并发与并行是两个既类似可是却不相同的概念:
并发性:又称共行性,是指处理多个同时性活动的能力,。
并行:指同时发生两个并发事件,具备并发的含义。并发不必定并行,也能够说并发事件之间不必定要同一时刻发生。
并发的实质是一个物理CPU(也能够是多个物理CPU)在若干个程序之间多路复用,并发性是对有限物理资源强制行使 多用户共享以提升效率。
并行指两个或两个以上事件或活动在同一时刻发生,在多道程序环境下,并行使多个程序同一时刻可在不一样CPU上同时执行。
并发是在同一个cpu上同时(不是真正的同时,而是看来是同时,由于CPU要在多个程序之间切换)运行多个程序。
并行是每个CPU运行一个程序。
打个比方:并发就像一我的(CPU)喂两个小孩(程序)吃饭,表面上是两个小孩在吃饭,实际是一我的在喂。
并行就是两我的喂两个小孩子吃饭。
并行须要两个或两个以上的线程跑在不一样的处理器上,并发能够跑在一个处理器上经过时间片进行切换。
同步与异步
同步: 当一个进程执行到I/O(等待外部数据)的时候,你等待:------同步
异步: 不等待:一直等到数据接收成功,再回来处理----异步
同步 所谓同步,就是在发出一个功能调用时,在没有获得结果以前,该调用就不会返回。按照这个定义,其实绝大多数函数都是同步调用。可是通常而言,咱们在说同步、异步的时候,特指那些须要其余部件协做或者须要必定时间完成的任务。 异步 #异步的概念和同步相对。当一个异步功能调用发出后,调用者不能马上获得结果。当该异步功能完成后,经过状态、通知或回调来通知调用者。若是异步功能用状态来通知,那么调用者就须要每隔必定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这实际上是一 种很严重的错误)。若是是使用通知的方式,效率则很高,由于异步功能几乎不须要作额外的操做。至于回调函数,其实和通知没太多区 阻塞 阻塞调用是指调用结果返回以前,当前线程会被挂起(如遇到io操做)。函数只有在获得结果以后才会将阻塞的线程激活。有人也许会把阻塞调用和同步调用等同起来,实际上他是不一样的。对于同步调用来讲,不少时候当前线程仍是激活的,只是从逻辑上当前函数没有返回而已。 #举例: #1. 同步调用:apply一个累计1亿次的任务,该调用会一直等待,直到任务返回结果为止,但并未阻塞住(即使是被抢走cpu的执行权限,那也是处于就绪态); #2. 阻塞调用:当socket工做在阻塞模式的时候,若是没有数据的状况下调用recv函数,则当前线程就会被挂起,直到有数据为止。 非阻塞 #非阻塞和阻塞的概念相对应,指在不能马上获得结果以前也会马上返回,同时该函数不会阻塞当前线程。 总结 #1. 同步与异步针对的是函数/任务的调用方式:同步就是当一个进程发起一个函数(任务)调用的时候,一直等到函数(任务)完成,而进程继续处于激活状态。而异步状况下是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行当,函数返回的时候经过状态、通知、事件等方式通知进程任务完成。 #2. 阻塞与非阻塞针对的是进程或线程:阻塞是当请求不能知足的时候就将进程挂起,而非阻塞则不会阻塞当前进程