小白学python-------------并发编程之进程理论与多道技术
在了解进程之间先简单回顾下操作系统的的功能
一.操作系统
操作系统是位于应用程序与硬件之间,本质上是一个软件.它是协调,管理,控制计算机硬件资源与软件资源的控制程序.
操作系统的两大功能:
1.将复杂的硬件操作封装成简单的接口让应用程序或者用户使用.
2.将应用程序之间对硬件的竞争变得有序.
操作系统计算过程:
1.串行
一个应用程序完完整整运行完毕后,另一个程序才开始运行
2.并发
看起来多个应用程序一起运行即可,单核可以实现并发
3.并行
真正意义上的多个任务同时进行,只有多核才能实现并行
4.CPU是用来计算的
CPU是无法执行IO操作的,一旦遇到IO操作,CPU应该去执行别的任务(操作系统控制).
5.多道技术
5.1.空间上的复用:多个进程共用一个内存
想要并发执行的多个应用程序代码应该先从硬盘加载到内存里面去(这是多道技术规定的),并且每一个应用程序的内存空间独立的,都要在物理级别上互相隔离的,这是操作系统控制的.如果不隔离就丧失了稳定性和安全性.
5.2.时间上的复用:多个进程共用同一个CPU的时间
有两种情况
5.2.1.提高程序的执行效率==+>遇到IO阻塞(就是内存从硬盘存取数据,此时的工作与CPU无关.记住所有的工作都是由操作系统控制的,无论是IO操作还是CPU切换)的情况:
当第一个程序遇到IO操作时(记住此时程序是还在运行的),CPU立马切走去执行第二个程序(在切走之前要保存状态,下次切回来从保存状态的地方继续执行),当第二个程序也遇到IO操作时,CPU立马切走执行第三个程序......当第一个程序完成IO操作时,会进入就绪状态(后面会提到三个状态),然后等待操作系统再次分配CPU,再次切回来继续执行.这个过程很快,快到人们感觉像是多个程序是共同运行的,或者说是并发的.
补充:状态是保存到内存里面的,核心的部分是保存到CPU的寄存器里面的,了解即可.
5.2.2.降低程序的执行效率===>应用程序中没有IO操作,只有计算的情况(可以说此时是为了并发而并发,由操作系统控制进行CPU切换):
第一个进程占用CPU时间过长(操作系统会始终监管着进程对CPU的占用),操作系统也会将CPU进行切换,此时第一个程序会暂停下来(保存状态).这样做的目的是为了保证每个进程都能对CPU进行占用,雨露均沾.所以说是为了并发效果不得以而为之.
怎么样确保应用程序的执行效率高?
所以写程序应该考虑一件事:如何让你写的程序占用CPU更多的时间,由于CPU的分配是操作系统控制的,所以尽可能少的让操作系统把CPU拿走,尽可能低的把IO降下来,获取CPU的几率就提升了.所以以后写程序最最核心的点就是怎么样少写IO,怎么样减少跟硬盘打交道.尽可能多的跟内存打交道.所以说做运维做优化,都是想法设法的不跟硬盘打交道,能够能从内存拿的数据就是内存拿,以此降低IO操作.
二.什么是进程
进程是正在运行的程序,或者说是一个应用程序运行的过程.即进程是一个抽象的概念.
补充:一个应用程序运行指的是首先将这个应用程序的代码由操作系统从硬盘读入到内存中,然后操作系统再调用cpu,通过cpu调用内存的代码进行执行的过程.所以说这整个过程都是通过操作系统去完成的.
一个应用程序的启动包括销毁都是通过操作系统完成的.
进程是起源于操作系统的,是操作系统最核心的概念,操作系统所有其他的概念都是围绕进程展开的.
补充:在cmd输入tasklist可以看到当前电脑的所有进程,每个进程都有一个PID,这个PID就是进程在操作系统内对应的身份证号.
三.进程与程序的区别
程序是一段代码,而进程是程序运行的过程.
强调:同一个程序执行两次,那也是两个进程.比如说启动两次QQ影音,一个播放动画片,一个播放电视剧.
四.进程的创建(了解)
一个主进程在运行过程中开启子进程
在windows上一个主进程创建子进程,会向操作系统发送请求,然后操作系统申请一个内存空间,然后把主进程的代码拷贝一份过去.(子进程的初始状态的一些数据跟主进程不一样,对于我们使用来说看不出区别,了解即可)
子进程与父进程在运行角度来看是两个进程,它们分配的内存空间是两个,独立并且在物理层次上相互隔离的.随着子进程的运行把子进程的代码修改掉了,但是不影响主进程的代码,两者互不影响.
在windows上开启子进程有些特殊,子进程拷贝父进程的名称空间,子进程要拷贝父进程的数据,子进程在申请内存空间时,会将父进程当作模块导入,将导入模块的成果放进子进程里面,所以开启子进程时,要放在__main__下面写.
在linux上一个主进程创建子进程,会向操作系统发送请求,然后操作系统申请一个内存空间,然后把主进程的代码拷贝一份过去.(子进程的初始状态跟主进程一样,了解即可)
五.进程的三种状态(掌握)
阻塞,就绪,运行
当一个进程遇到IO操作时,会进入阻塞状态,那么操作系统会把CPU分配给其他就绪的进程,(有的进程属于VIP或者紧急进程,优先级比较高,所以操作系统也会把没有进入阻塞状态的进程暂停掉,把CPU分配给VIP或者紧急进程.而被暂停的普通进程会保存状态,进入就绪状态,等待操作系统分配CPU,),当阻塞的进程完成IO操作后也会进入就绪状态,等待操作系统分配CPU然后运行.