首页 » Python » python_fullstack基础(十八)-并发编程

python_fullstack基础(十八)-并发编程

原文 http://blog.csdn.net/dragonyangang/article/details/79231219

2018-02-02 02:01:11阅读(454)

并发编程 一、进程 1、理论背景 ①操作系统背景 手工操作—穿孔卡片
原理:用户独占计算机,CPU等待手工操作,资源利用和CPU利用效率极低 批处理—磁带处理、批处理系统
原理:主机与输入机之间增加磁带存储设备,使得计算机可以自动将磁带读入计算机,成批完成作业
分类:脱机批处理系统、联机批处理系统 多道程序系统
原理:指允许多个程序同时进入内存并交替运行
特点:宏观上并行、微观上串行 分时系统
原理:把处理机的运行时间分成很短的时间片,按时间片轮流把处理机分配给各联机作业使用
特点:多路性、交互性、独立性、及时性;在进行I/O切换的时候实际上效率相比下降低了 实时系统
原理:程序独占CPU,为了让程序能够及时响应随机发生的外部事件,并在严格的时间范围内完成对该事件的处理
分类:实时控制系统、实时信息处理系统
特点:及时响应、高可靠性。 通用操作系统
定义:具有多种类型操作特征的操作系统。可以同时兼有多道批处理、分时、实时处理的功能,或其中两种以上的功能。 操作系统的进一步发展
分类:个人计算机操作系统、网络操作系统、分布式操作系统 操作系统的作用
作用:
1、隐藏了丑陋的硬件调用接口,为应用程序员提供调用硬件资源的更好,更简单,更清晰的模型(系统调用接口) 2、将应用程序对硬件资源的竞态请求变得有序化 ②何为进程、何为进程调度

进程

狭义定义:进程是正在运行的程序的实例 广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动 进程的意义:是操作系统动态执行的基本单元,操传统操作系统中,进程既是基本的分配单元,也是基本的执行单元 操作系统引入进程的原因:
理论角度:是对正在运行的程序过程的抽象
实现角度:是一种数据结构,目的是描述动态系统的内在规律,有效管理、调度计算机系统主存储器运行的程序

进程的特征:

动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
并发性:任何进程都可以同其他进程一起并发执行
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
结构特征:进程由程序、数据和进程控制块三部分组成。
多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。

进程与程序的区别:

程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
而进程是程序在处理机上的一次执行过程,它是一个动态的概念。
程序可以作为一种软件资料长期存在,而进程是有一定生命期的。
程序是永久的,进程是暂时的。

进程调度

先来先服务调度算法:
先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。FCFS算法比较有利于长作业(进程),而不利于短作业(进程)。由此可知,本算法适合于CPU繁忙型作业,而不利于I/O繁忙型的作业(进程)。

短作业优先调度算法:
短作业(进程)优先调度算法(SJ/PF)是指对短作业或短进程优先调度的算法,该算法既可用于作业调度,也可用于进程调度。但其对长作业不利;不能保证紧迫性作业(进程)被及时处理;作业的长短只是被估算出来的。

时间片轮转法:
时间片轮转(Round Robin,RR)法的基本思路是让每个进程在就绪队列中的等待时间与享受服务的时间成比例。在时间片轮转法中,需要将CPU的处理时间分成固定大小的时间片,如果一个进程在被调度选中之后用完了系统规定的时间片,但又未完成要求的任务,则它自行释放自己所占有的CPU而排到就绪队列的末尾,等待下一次调度。同时,进程调度程序又去调度当前就绪队列中的第一个进程。

多级反馈队列:
应设置多个就绪队列,并为各个队列赋予不同的优先级。当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完成,便可准备撤离系统;如果它在一个时间片结束时尚未完成,调度程序便将该进程转入第二队列的末尾按照FCFS原则等待调度执行,以此类推,而且仅当第一队列空闲时,调度程序才调度第二队列中的进程运行

③进程的并发、并行 并行:是指两者同时执行 并发:是指资源有限的情况下,两者交替轮流使用资源,以便提高效率 区别:并行是从微观上,也就是在一个精确的时间片刻,有不同的程序在执行,这就要求必须有多个处理器;并发是从宏观上,在一个时间段上可以看出是同时执行的,比如一个服务器同时处理多个session。
<a href=python_fullstack基础(十八)-并发编程" src="http://img.blog.csdn.net/20180201182841042?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHJhZ29ueWFuZ2FuZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="这里写图片描述" title=""> ④同步、异步、阻塞、非阻塞

同步:
系统功能调用时,在没有得到结果之前,该调用就不会返回。按照这个定义,其实绝大多数函数都是同步调用。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。

异步:
异步的概念和同步相对。当一个异步功能调用发出后,调用者不能立刻得到结果。当该异步功能完成后,通过状态、通知或回调来通知调用者。如果异步功能用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一 种很严重的错误)。如果是使用通知的方式,效率则很高,因为异步功能几乎不需要做额外的操作。至于回调函数,其实和通知没太多区别。

阻塞:
阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。函数只有在得到结果之后才会将阻塞的线程激活。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。

非阻塞:
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程。

总结:

同步与异步针对的是函数/任务的调用方式:同步就是当一个进程发起一个函数(任务)调用的时候,一直等到函数(任务)完成,而进程继续处于激活状态。而异步情况下是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行当,函数返回的时候通过状态、通知、事件等方式通知进程任务完成。 阻塞与非阻塞针对的是进程或线程:阻塞是当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程

同步阻塞形式:
效率最低。一直等待进程结束,其他什么也不做

异步阻塞形式:
异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞

同步非阻塞形式:
实际上是效率低下的,因为程序需要在这两种不同的行为之间来回的切换,效率浪费在了程序切换中

异步非阻塞形式:
效率较高,程序没有在两种不同的操作中来回切换

总结:
同步和阻塞混淆很容易混淆,因为很多时候同步操作会以阻塞的形式表现出来,同样很多人也会把异步和非阻塞混淆,因为异步操作一般都不会在真正的I/O操作处被阻塞。

⑤进程的创建、结束(了解)

进程的创建的4种形式:

系统初始化(查看进程linux中用ps命令,windows中用任务管理器,前台进程负责与用户交互,后台运行的进程与用户无关,运行在后台并且只在需要时才唤醒的进程,称为守护进程,如电子邮件、web页面、新闻、打印) 一个进程在运行过程中开启了子进程(如nginx开启多进程,os.fork,subprocess.Popen等) 用户的交互式请求,而创建一个新进程(用户双击操作) 一个批处理作业的初始化(只在大型机的批处理系统中应用)

进程的结束

正常退出(自愿,如用户点击交互式页面的叉号,或程序执行完毕调用发起系统调用正常退出,在linux中用exit,在windows中用ExitProcess) 出错退出(自愿,python a.py中a.py不存在) 严重错误(非自愿,执行非法指令,如引用不存在的内存,I/O等,可以捕捉异常,try…except…) 被其他进程杀死(非自愿,如kill -9 PID)

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹