Python 进程
主要内容:
一.背景知识
二.操作系统
三.进程
一. 背景知识
顾名思义,进程即正在执行的一个过程. 进程是对正在运行程序的一个抽象.
进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老,最重要的抽象概念之一.操作系统的其他所有内容都是围绕进程的概念展开的.
所以,想要真正了解进程,必须首先了解操作系统.
二. 操作系统
1. 为什么要有操作系统?
程序员无法把所有的硬件操作细节都一一了解到,于是我们让操作系统来管理这些硬件,处理这些繁琐的工作.从而让程序员从这些繁琐的工作中解脱出来,只需要考虑自己应用软件的编写即可,应用软件调用操作系统提供的功能来间接的使用硬件.
2. 什么是操作系统?
(1)概括来说,操作系统就是一个协调,管理和控制计算机硬件资源和软件资源的控制系统.
操作系统位于计算机硬件与应用软件之间,其本质也是一个软件.
操作系统的组成:
内核: 运行于内核态,管理硬件资源
系统调用: 运行于用户态,为应用程序提供系统调用接口
可以看出"操作系统仅运行于内核态的"这种说法是不准确的.
(2)具体来说,操作系统分为两部分功能:
#功能一: 隐藏了丑陋的硬件调用接口,为程序员提供了更好,更简单,更清晰的调用硬件资源的模型(指系统调用接口).有了这些接口以后,程序员就不必再考虑直接操作硬件这些繁琐工作,专心开发自己的应用程序即可. 例如: 操作系统提供了文件这个抽象概念,对文件的操作就是对磁盘的操作,有了文件我们无需再去考虑关于磁盘的读写控制(比如控制磁盘转动,移动磁头读写数据等细节) #功能二: 管理硬件资源,将应用程序对硬件资源的竟态请求(硬件资源竞争的无序竞争)变得有序化 例如:很多应用软件其实是共享一套计算机硬件,比方说有可能有三个应用程序同时需要申请打印机来输出内容,那么a程序竞争到了打印机资源就打印,然后可能是b竞争到打印机资源,也可能是c,这就导致了无序,打印机可能打印一段a的内容然后又去打印c...操作系统的一个功能就是将这种无序变得有序
3. 操作系统与普通软件的区别
(1)操作系统由硬件保护,不能被用户修改.应用软件则不一定.
(2)操作系统是一个大型,复杂,长寿的软件.
大型和复杂: linux或windows的源代码可达到五百万行数量级
长寿: 操作系统很难编写,如此大的代码量,一旦完成,操作系统创造者便不会轻易重写.
4. 操作系统发展史
第一代(1940~1955) 手工操作----穿孔卡片
第二代(1955~1965) 磁带存储---批处理系统
第三代(1955~1965) 多道程序系统(重点!)
(1)多道技术产生的技术背景: cpu在执行一个任务的过程中,若需要操作硬盘,则发送操作硬盘的指令,指令一旦发出,硬盘上的机械手臂滑动读取数据到内存中,这一段时间,cpu需要等待,时间可能很短,但对于cpu来说已经很长很长,长到可以让cpu做很多其他的任务,如果CPU在这段时间内切换到去做其他的任务,就可以得到充分利用了.
(2)多道程序设计技术:
所谓多道程序设计技术,就是指允许多个程序同时进入内存并运行.即同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种硬、软件资源.一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序.
在A程序计算时,I/O空闲,A程序I/O操作时,CPU空闲(B程序也是同样);必须A工作完成后,B才能进入内存中开始工作,两者是串行的,全部完成 共需时间=T1+T2.
将A、B两道程序同时存放在内存中,它们在系统的控制下,可相互穿插、交替地在CPU上运行:当A程序因请求I/O操作而放弃CPU时,B程序就可占用CPU运行,这样 CPU不再空闲,而正进行A I/O操作的I/O设备也不空闲,显然,CPU和I/O设备都处于“忙”状态,大大提高了资源的利用率,从而也提高了系统的效率,A、B全部完成所需时间<<T1+T2.
多道程序设计技术不仅使CPU得到充分利用,同时改善I/O设备和内存的利用率,从而提高了整个系统的资源利用率和系统吞吐量(单位时间内处理作业(程序)的个数),最终提高了整个系统的效率.
单处理机系统中多道程序运行时的特点:
1)多道:计算机内存中同时存放几道相互独立的程序;
2)宏观上并行:同时进入系统的几道程序都处于运行过程中,即它们先后开始了各自的运行,但都未运行完毕;
3)微观上串行:实际上,各道程序轮流地用CPU,并交替运行。
多道程序系统的出现,标志着操作系统渐趋成熟的阶段,先后出现了作业调度管理、处理机管理、存储器管理、外部设备管理、文件系统管理等功能。
由于多个程序同时在计算机中运行,开始有了空间隔离的概念,只有内存空间的隔离,才能让数据更加安全、稳定。
除了空间隔离之外,多道技术还第一次体现了时空复用的特点,遇到IO操作就切换程序,使得cpu的利用率提高了,计算机的工作效率也随之提高。
(3)时空复用
空间上的复用:将内存分为几部分,每个部分放入一个程序,这样,同一时间内存中就有了多道程序。
时间上的复用:当一个程序在等待I/O时,另一个程序可以使用cpu,如果内存中可以同时存放足够多的作业,则cpu的利用率可以接近100%.
时间复用上的缺点:程序员A的程序运行10分钟就能够运行结束,程序员B的程序需要运行24小时,如何程序员B的程序先运行,并且程序员B的程序没有任何I\O操作,那么程序员A需要等待24小时之后才能执行,那么这就不太合理了.
空间复用上的缺点:首先丧失的是安全性,比如你的qq程序可以访问操作系统的内存,这意味着你的qq可以拿到操作系统的所有权限。其次丧失的是稳定性,某个程序崩溃时有可能把别的程序的内存也给回收了,比方说把操作系统的内存给回收了,则操作系统崩溃.
为了解决空间复用上的问题:程序之间的内存必须分割,由操作系统控制。如果内存彼此不分割,则一个程序可以访问另外一个程序的内存.
为了解决时间出现了分时系统.
(4)分时系统
分时技术:把处理机的运行时间分成很短的时间片,按时间片轮流把处理机分配给各联机作业使用.若某个作业在分配给它的时间片内不能完成其计算,则该作业暂时中断,把处理机让给另一作业使用,等待下一轮时再继续其运行。由于计算机速度很快,作业运行轮转得很快,给每个用户的印象是,好象他独占了一台计算机。而每个用户可以通过自己的终端向系统发出各种操作控制命令,在充分的人机交互情况下,完成作业的运行。具有上述特征的计算机系统称为分时系统,它允许多个用户同时联机使用计算机。
特点:
(1)多路性: 若干个用户同时使用一台计算机。微观上看是各用户轮流使用计算机;宏观上看是各用户并行工作。
(2)交互性: 用户可根据系统对请求的响应结果,进一步向系统提出新的请求。这种能使用户与系统进行人机对话的工作方式,明显地有别于批处理系统,因而,分时系统又被称为交互式系统。
(3)独立性: 用户之间可以相互独立操作,互不干扰。系统保证各用户程序运行的完整性,不会发生相互混淆或破坏现象。
(4)及时性: 系统可对用户的输入及时作出响应。分时系统性能的主要指标之一是响应时间,它是指:从终端发出命令到系统予以应答所需的时间。
(5)实时系统
虽然多道批处理系统和分时系统能获得较令人满意的资源利用率和系统响应时间,但却不能满足实时控制与实时信息处理两个应用领域的需求。于是就产生了实时系统,即系统能够及时响应随机发生的外部事件,并在严格的时间范围内完成对该事件的处理。
实时系统在一个特定的应用中常作为一种控制设备来使用。
实时系统可分成两类:
(1)实时控制系统---当用于飞机飞行、导弹发射等的自动控制时,要求计算机能尽快处理测量系统测得的数据,及时地对飞机或导弹进行控制,或将有关信息通过显示终端提供给决策人员。当用于轧钢、石化等工业生产过程控制时,也要求计算机能及时处理由各类传感器送来的数据,然后控制相应的执行机构。
(2)实时信息处理系统---当用于预定飞机票、查询有关航班、航线、票价等事宜时,或当用于银行系统、情报检索系统时,都要求计算机能对终端设备发来的服务请求及时予以正确的回答。此类对响应及时性的要求稍弱于第一类。
实时操作系统的主要特点:
(1)及时响应。每一个信息接收、分析处理和发送的过程必须在严格的时间限制内完成。
(2)高可靠性。需采取冗余措施,双机系统前后台工作,也包括必要的保密措施等。
5. 关于操作系统必备的理论基础
#一 操作系统的作用: 1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2:管理、调度进程,并且将多个进程对硬件的竞争变得有序 #二 多道技术: 1.产生背景:针对单核,实现并发 ps: 现在的主机一般是多核,那么每个核都会利用多道技术 有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再重新调度,会被调度到4个 cpu中的任意一个,具体由操作系统调度算法决定。 2.空间上的复用:如内存中同时有多道程序 3.时间上的复用:复用一个cpu的时间片 强调:遇到io切,占用cpu时间过长也切,核心在于切之前将进程的状态保存下来,这样 才能保证下次切换回来时,能基于上次切走的位置继续运行
三. 什么是进程?
1. 定义
狭义定义: 进程是正在运行的程序的实例.
广义定义: 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动.它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元.
举例: 在py1文件中有一个变量a=1, 在py2文件中也有个变量a=1.当这两个文件同时运行时,它们各自的内部变量a并不会产生冲突.因为两个文件运行起来后是两个独立的进程,操作系统让它们在内存上隔离开了.
2. 进程的概念
第一, 进程是一个实体.每一个进程都有它自己的地址空间,一般情况下,包括文本区域,数据区域和堆栈.文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量.
第二, 进程是一个"执行中的程序".程序是一个没有生命的实体,只有处理器赋予程序生命时(由操作系统执行),它才能成为一个活动的实体,我们称其为"进程".
进程是操作系统中最基本最重要的概念. 多道程序系统出现以后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念,所有多道程序设计操作系统都建立在进程的基础上.
3. 进程的特征
动态性: 进程的实质是"程序在多道程序系统中的一次执行过程",进程是动态产生,动态消亡的.
并发性: 任何进程都可以同其他进程一起并发执行.
独立性: 进程是一个"能独立运行的基本单位",同时也是"系统分配资源和调度的独立单位".
异步性: 进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的,不可预知的速度向前推进
结构特征: 进程由程序,数据和进程控制块三部分组成.
多个不同的进程可以包含相同的程序: 一个程序在不同的数据集里就构成不同的进程,能得到不同的结果.但是执行过程中,程序不能发生改变.
4. 进程与程序的区别:
程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念.
进程是程序在处理机上的一次执行过程,它是一个动态的概念.
程序可以作为一种软件资料长期存在,而进程是有一定生命期的.
程序是永久的,进程是暂时的.
四. 并发与并行
并发: 并发是伪并行,即看起来是同时运行,但事实上是单个CPU在极短的时间内来回切换任务.所以单个CPU+多道技术就可以实现并发.(注意:并行也属于并发)
并行: 即同时运行,单个CPU只执行单个任务,多个CPU同时工作就实现了并行.
单核下可以利用多道技术,多核下是每个核利用多道技术(多道技术是针对单核而言的).
五. 同步/异步/阻塞/非阻塞(重点)
1. 进程状态介绍
在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入这几个状态: 就绪,运行和阻塞.
(1)就绪(Ready)状态: 此时进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行.
(2)执行/运行(Running)状态: 此时进程已获得处理机,其程序正在处理机上执行.
(3)阻塞(Blocked)状态: 正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态.引起进程阻塞的事件可有多种,如:等待I/O完成, 申请缓冲区不能满足, 等待信件(信号)等.
事件请求: input, sleep, 文件输入输出, recv, accept等
事件发生: sleep, input,...完成了
2. 同步异步(参考资料)
同步和异步关注的是消息通信机制.
同步异步指的是"调用者与被调用者"两者之间的关系,而不是经常容易误解的"多个被调用者之间的关系".
(1)同步
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回,一旦调用返回,就得到返回值了.
换句话说,就是由调用方主动等待这个调用结果.按照此定义,其实绝大多数函数都是同步调用.但一般而言,我们在说同步异步的时候,特指那些需要其他程序或者IO协作或者需要一定时间完成的任务.
简而言之: 调用者调用了一个功能时,无论被调用者是在阻塞还是非阻塞状态,调用者都要等待被调用者执行完毕,才能继续执行自己的任务.
举例说明: 待补充
(2)异步
异步的概念和同步相对.调用动作发出之后,本次操作就直接返回了,并没有拿到"被调用者执行完毕后的返回值".
换句话说,当一个"异步功能的调用"发出后,调用者不能立刻拿到"被调用者执行完毕后的返回值".但是此时调用者可以继续执行后续的代码,而不是一味地等待.
另外需要强调的一点:
当异步功能完成后,被调用者可以通过"状态,通知或回调"来通知调用者.如果异步功能用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低.
如果是使用通知的方式,效率则很高,因为异步功能几乎不需要做额外的操作.至于回调函数,其实与通知没有太多区别.
举例说明: 待补充
3. 阻塞与非阻塞
(1)阻塞
阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到I/O操作).调用线程只有在得到结果之后才会返回.函数只有在得到结果之后才会将阻塞的线程激活.
有人也许会吧阻塞调用和同步调用等同起来,实际上它们是不同的: 对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已.
举例说明:
# 1.同步调用: 调用apply()函数来apply一个累计1亿次的任务,该调用会一直等待,直到任务返回结果为止,但并未阻塞住(即便是被抢走CPU的执行权限,那也是处于就绪状态). # 2.阻塞调用: 当socket工作在阻塞模式的时候,如果没有数据的情况下调用recv函数,则当前线程就会被挂起(阻塞状态),直到有数据为止.
(2)非阻塞
非阻塞和阻塞的概念相对应,非阻塞调用指:在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程.
总结:
1)同步异步针对的是函数(任务)的调用方式: 同步就是当一个进程发起一个函数(任务)调用的时候,一直等到函数(任务)完成,而进程继续处于激活(非阻塞)状态.异步是当一个进程发起一个函数(任务)调用的时候,不会等待函数返回,而是继续往下执行,当函数返回的时候通过"状态,通知,事件"等方式通知进程任务完成.
2)阻塞与非阻塞针对的是进程或线程: 阻塞是当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程.
4. 同步/异步 与 阻塞/非阻塞
(1)同步阻塞形式,效率最低.
(2)同步非阻塞形式,效率较低.
(3)异步阻塞形式,效率低.
(4)异步非阻塞,效率最高.
************************************************
总结: 待续
************************************************