一、进程
1.进程的概念
进程是正在进行的一个过程或者一个任务。而负责执行任务的则是cpu。
2.进程与程序的区别
程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。同一个程序执行两次是两个进程。
3.并发与并行
无论是并行还是并发,在用户看来都是’同时’运行的,而一个cpu同一时刻只能执行一个任务。
1)并发:是伪并行,即某个时段看起来是同时运行。单个cpu+多道技术就可以实现并发,(并行也属于并发)
2)并行:同时运行,只有具备多个cpu才能实现并行。
4.同步、异步及阻塞、非阻塞同步:A调用B,B处理直到获得结果,才返回给A。
需要调用者一直等待和确认调用结果是否返回, 然后继续往下执行。
异步:A调用B,B直接返回。无需等待结果,B通过状态,通知等来通知A或回调函数来处理。
调用结果返回时, 会以消息或回调的方式通知调用者。
阻塞:A调用B,A被挂起直到B返回结果给A,A继续执行。
调用结果返回前,当前进程挂起不能够处理其他任务,一直等待调用结果返回。
非阻塞:A调用B,A不会被挂起,A可以执行其他操作。
调用结果返回前,当前进程不挂起, 可以去处理其他任务
二、线程
1.什么是线程
线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。
2.线程和进程的区别
1)线程共享创建它的进程的内存空间,进程的内存是独立的
2)线程可以直接访问其进程的数据段,进程拥有父进程的数据段副本
3)线程可以直接与其进程的其他线程通信,进程间通信需要通过一个中间代理来实现。
4)新线程很容易创建,创建新进程需要对父进程实现一次复制。
5)线程可以控制和操作同一进程里的其他线程,进程只能控制子进程。
6)对主线程的更改(取消,优先级更改等)可能会影响到进程中其他线程的行为; 对父进程的更改不会影响子进程
3.多线程
多线程指的是,在一个进程中开启多个线程,简单的讲:如果多个任务共用一块地址空间,那么必须在一个进程内开启多个线程。
详细的讲分为4点:
-
多线程共享一个进程的地址空间。
-
线程比进程更轻量级,线程比进程更容易创建可撤销,在许多操作系统中,创建一个线程比创建一个进程要快10-100倍,在有大量线程需要动态和快速修改时,这一特性很有用
-
若多个线程都是cpu密集型的,那么并不能获得性能上的增强,但是如果存在大量的计算和大量的I/O处理,拥有多个线程允许这些活动彼此重叠运行,从而会加快程序执行的速度。
-
在多cpu系统中,为了最大限度的利用多核,可以开启多个线程,比开进程开销要小的多。(这一条并不适用于python)
三、协程
1.协程的概念
协程是单线程下的并发,一种用户态的轻量级线程,即协程是由用户程序自己控制调度的。
2.协程属性
1) python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其他线程运行)
2) 单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换,以此来提升效率(!!!非io操作的切换与效率无关)
3)操作系统控制线程的切换,用户在单线程内控制协程的切换
3.优点和缺点
优点:
协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级,单线程内就可以实现并发的效果,最大限度地利用cpu。
缺点:
协程的本质是单线程下,无法利用多核,(可以是一个程序开启多个进程,每个进程内开启多个线程,每个线程内开启协程)
协程指的是单个线程,因而一旦协程出现阻塞,将会阻塞整个线程