并发编程之进程简述概括
了解进程之前,首先了解一下操作系统里的多道技术:
一,多道程序设计技术
这个是指允许多个程序同时进入内存并运行,CPU会不断交替的处理各个程序,当其中有一道程序因I/O而暂停运行时,CPU会马上处理另一道程序
多道程序 设计的优点:
很大程度上的提高了资源的利用率,同时也提高了CPU利用率
单处理机系统中多道程序运行时的特点:
多道技术的总结:
1.产生背景:针对单核,实现并发
ps:
现在的主机一般是多核,那么每个核都会利用多道技术
有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再重新调度,会被调度到4个
cpu中的任意一个,具体由操作系统调度算法决定。
2.空间上的复用:如内存中同时有多道程序
3.时间上的复用:复用一个cpu的时间片
强调:遇到io切,占用cpu时间过长也切,核心在于切之前将进程的状态保存下来,这样
才能保证下次切换回来时,能基于上次切走的位置继续运行
二,进程
进程是计算机中程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。说白了,进程就是指正在运行的程序的实例。
进程与程序的区别:
程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。
而进程是程序在处理机上的一次执行过程,它是一个动态的概念。
程序可以作为一种软件资料长期存在,而进程是有一定生命期的。
程序是永久的,进程是暂时的。
进程的特征:
动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。
并发性:任何进程都可以同其他进程一起并发执行
独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位;
异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进
结构特征:进程由程序、数据和进程控制块三部分组成。
多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。
总结:
进程是操作系统中最基本,最重要的概念。所有多道程序设计都是建立在进程的基础上。
三,进程的调度
如果有多个进程交替运行着,操作系统必须对这些进程进行调度。而这个调度是要遵循一定法则的,那么就出现了进程的调度算法。
四,进程的并行和并发
并行:并行是指两个程序同时执行,在资源够用的前提下,两个程序都在不停的执行。
并发:并发是指在资源有限的情况下,两者交替轮流使用资源
区别:
并行从微观上来讲,在一个精确的时间片刻,有不同的程序执行,这就必须有多个处理器
并发是从宏观上讲,在一个时间段上可以看出是同时执行的
五,进程中状态介绍
进程是被操作系统的调度算法控制着,那么程序在运行的时候,会有三个状态:
(1)就绪(Ready)状态
当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。
(2)执行/运行(Running)状态当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。
(3)阻塞(Blocked)状态正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。
六,同步与异步,以及阻塞与非阻塞
- 同步阻塞形式
效率最低。拿上面的例子来说,就是你专心排队,什么别的事都不做。
- 异步阻塞形式
如果在银行等待办理业务的人采用的是异步的方式去等待消息被触发(通知)
,也就是领了一张小纸条,假如在这段时间里他不能离开银行做其它的事情,那么很显然,这个人被阻塞在了这个等待的操作上面;
异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。
- 同步非阻塞形式
实际上是效率低下的。
想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,如果把打电话和观察排队的位置看成是程序的两个操作的话
这个程序需要在这两种不同的行为之 间来回的切换
,效率可想而知是低下的。
- 异步非阻塞形式
效率更高。
因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换
。
比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉大堂经理说,排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的 操作上面,自然这个就是异步+非阻塞的方式了。
很多人会把同步和阻塞混淆,是因为很多时候同步操作会以阻塞的形式表现出来
,同样的,很多人也会把异步和非阻塞混淆,因为异步操作一般都不会在真正的IO 操作处被阻塞
七,multiprocess.process模块
process模块是一个创建进程的模块。
强调:
1. 需要使用关键字的方式来指定参数
2. args指定的为传给target函数的位置参数,是一个元组形式,必须有逗号
参数介绍:
1 group参数未使用,值始终为None
2 target表示调用对象,即子进程要执行的任务
3 args表示调用对象的位置参数元组,args=(1,2,'egon',)
4 kwargs表示调用对象的字典,kwargs={'name':'egon','age':18}
5 name为子进程的名称