一,理论
顾名思义啊,进程呢就是正在执行的一个过程。进程是对正在运行程序的一个抽象
进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最抽象的概念
之一,操作系统的其他所有内容都是围绕进程概念展开的
1946 年第一台计算机诞生,此时还没有操作系统,还处于手工操作,
1,穿孔卡片:
程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。
手工操作的特点:
1:用户独占全机,不会出现因资源已被其他用户占用而等待的现象,但是这样子,资源的利用率比较低
2:cpu等待手工操作,利用不充分
2;批处理----磁带储存
由于人机出现的矛盾,最后发展出现了批处理
批处理系统就是加载在计算机上的一个系统软件,在它的控制之下计算机能够自动的,成批的处理
一个或者多个用户作业
1;联机处理
首先出现的是联机处理系统,即作业的输入输出由cpu处理
2脱机批处理系统
为了克服缓解,高速主机和缓慢外设的矛盾,提高cpu的利用率,就这样又出现了脱机批处理
3;多道程序系统
所谓的多道程序设计,就是指允许多个程序同时进入内存并运行
4;分时系统
分时技术:把处理器的运行时间分成很短的时间片,按时间片轮流把处理机分配给各联机作业使用。
5;实时系统
6;通用操作系统
7;个人计算机操作系统
个人计算机上的操作系统是联机交互的单用户操作系统,它提供的联机交互功能与通用分时系统提供的功能很相似。
8;网络操作系统
二 进程
1简介
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
2,进程的调度
先来先服务
3,进程的并行与并发
并行 : 并行是指两者同时执行,比如赛跑,两个人都在不停的往前跑;(资源够用,比如三个线程,四核的CPU )
并发 : 并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率。
区别:
并行是从微观上,也就是在一个精确的时间片刻,有不同的程序在执行,这就要求必须有多个处理器。
并发是从宏观上,在一个时间段上可以看出是同时执行的,比如一个服务器同时处理多个session。
4,同步异步阻塞非阻塞
1,
(1)就绪(Ready)状态
当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。
(2)执行/运行(Running)状态当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。
(3)阻塞(Blocked)状态正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。
,2,同步与异步
所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列
。要么成功都成功,失败都失败,两个任务的状态可以保持一致。
所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了
。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,所以它是不可靠的任务序列
。
3,阻塞非阻塞
阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的
4,同步/异步与阻塞/非阻塞
- 同步阻塞形式
效率最低。拿上面的例子来说,就是你专心排队,什么别的事都不做。
- 异步阻塞形式
如果在银行等待办理业务的人采用的是异步的方式去等待消息被触发(通知)
,也就是领了一张小纸条,假如在这段时间里他不能离开银行做其它的事情,那么很显然,这个人被阻塞在了这个等待的操作上面;
异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。
- 同步非阻塞形式
实际上是效率低下的。
想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换
,效率可想而知是低下的。
- 异步非阻塞形式
效率更高,
因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换
。
比如说,这个人突然发觉自己烟瘾犯了,需要出去抽根烟,于是他告诉大堂经理说,排到我这个号码的时候麻烦到外面通知我一下,那么他就没有被阻塞在这个等待的操作上面,自然这个就是异步+非阻塞的方式了。
很多人会把同步和阻塞混淆,是因为很多时候同步操作会以阻塞的形式表现出来
,同样的,很多人也会把异步和非阻塞混淆,因为异步操作一般都不会在真正的IO操作处被阻塞
。
三,进程的创建
模块,multiprocess
from multiprocessing import Process import os def func(i): print('%d:,子进程%d,主进程%d'%(i,os.getpid(),os.getppid())) if __name__=='__main__': l=[] for i in range(10): p = Process(target=func,args=(i,)) p.start() l.append(p) for p in l: p.join() print('-------------')
C:UsershcAppDataLocalProgramsPythonPython36python3.exe C:/s9/day35/jincheng.py 0:,子进程7368,主进程13464 1:,子进程12640,主进程13464 2:,子进程13424,主进程13464 3:,子进程7060,主进程13464 4:,子进程12204,主进程13464 5:,子进程4588,主进程13464 6:,子进程11848,主进程13464 7:,子进程688,主进程13464 8:,子进程14276,主进程13464 9:,子进程200,主进程13464 ------------- Process finished with exit code 0
另一种创建进程
import os from multiprocessing import Process class Myprocess(Process): def __init__(self,arg1,arg2): super().__init__() self.arg1=arg1 self.arg2=arg2 def fu(self): print('子进程%d: ,%s,%s'%(os.getpid(),self.arg1,self.arg2)) self.aa() def aa(self): print('子进程2:%d'%(os.getpid())) if __name__=='__main__': p=Myprocess(1,2) p.start() p.fu()
C:UsershcAppDataLocalProgramsPythonPython36python3.exe C:/s9/day35/jincheng.py 子进程14864: ,1,2 子进程2:14864 zhu:14864 Process finished with exit code 0
数据隔离
import os from multiprocessing import Process n=6 def fu(): global n print('子进程%d:'%(os.getpid())) n=n-1 print(n) if __name__=='__main__': p=Process(target=fu) p.start() print('zhujincheng%d'%(os.getpid()),n)
zhujincheng5488 6 子进程1424: 5 Process finished with exit code 0
进程与进程之间数据是隔离的