操作系统就是一个协调,管理和控制计算机硬件资源和软件资源的控制程序,操作系统位于计算机硬件与应用软件之间,本质也是一个软件,操作系统由操作系统的内核(运行于内核态,管理硬件资源)以及系统调用(运行于用户态,为应用程序员写的应用程序提供系统调用的接口)两部分组成
操作系统隐藏复杂的硬件调用接口,提供简单清晰的系统调用接口,为应用程序提供如何使用硬件资源的抽象
将应用程序对硬件资源的竟态请求变得有序化,管理硬件资源
第一代计算机:真空管与穿孔卡片
特点:没有操作系统的概念,
所有的程序设计都是直接操控硬件
优点:可以在一定时间内独占资源,随时调试程序
缺点:浪费计算机资源,同一时刻只能一个人使用
第二代计算机:晶体管和批处理系统
特点:工作人员有明确分工,拥有操作系统的概念,有了程序设计语言:FORTRAN语言或汇编语言,写在纸上穿孔打成卡片,在进行输入输出
第二代解决第一代计算机的方法:
将一堆人的输入积攒成一大波的输入
2.然后按照顺序计算
3.将一堆人的输出积攒一大波的输出
优点:批处理,节省机时
缺点:1.整个流程需要人为参与控制
2.计算的过程依然是顺序计算,串行
3.使用计算机需要等待,极大影响程序的开发效率,无法及时调试程序
第三代计算机:集成电路和多道程序设计
多道技术:多道指的是多个程序,多道技术的实现是为了解决多个应用程序竞争或共享同一个资源的有序调度问题,解决方式即多路复用,多路复用分为时间上的复用和空间上的复用
空间上的复用:将内存分为几部分,每个部分放入一个程序,同一时间内存中则有多道程序
时间上的复用:当一个程序在等待I/O时,另一个程序可以使用cpu,如果内存中可以同时存放足够多的作业,则cpu的利用率可以接近100%,操作系统采用多道技术可以控制进程的切换,或者说进程之间争抢cpu的执行权限,这种切换不只是在一个进程遇到I/O时执行,一个进程占用cpu时间过长也会切换,或者说被操作系统夺走cpu的执行权限
空间上的复用最大的问题是:程序之间必须分割,分割需要在硬件层实现,由操作系统控制,如果内存彼此不分割,则一个程序可以访问另外一个程序的内存,将丢失安全性与稳定性
分时操作系统:多个终端+多道技术
进程:cpu正在运行的一个过程或者说一个任务
并发:是伪并行,只是看起来是同时运行,单个cpu加多道技术可以实现
并行:同时运行,只有具备多个cpu才能实现并行
同步:在发出一个功能调用时,没有得到结果前该调用不会返回
异步:当一个异步功能发出后,调用者不能立刻得到结果,异步功能完成后,通过状态,通知或回调来通知调用者
阻塞调用:指调用结果返回之前,当前线程会被挂起(i/o操作),函数只有得到结果之后才会将阻塞的线程激活
同步异步针对的是函数/任务的调用方式,同步就是当一个进程发起一个函数调用的时候,一直等待函数完成,而进程继续处于激活状态,异步情况是当一个进程发起一个函数调用的时候,不会等函数返回而是继续往下执行,当函数返回的时候通过状态,通知,事件等方式通知进程任务完成
阻塞与非阻塞针对的是进程与线程:阻塞是当请求不能满足的时候就将进程挂起,而非阻塞不会阻塞当前进程
UNIX和windows关于创建的子进程:
1.相同的是:进程创建后,父进程与子进程有各自不同的地址空间(多道技术要求物理层面实现进程之间内存的隔离),任何一个进程在其地址空间中的修改都不会影响到另外一个进程
windows中,没有进程层次的概念,所有进程地位相同
进程的状态:运行,阻塞就绪
multiprocessing模块:
multiprocessing模块用来开启子进程,并在子进程中执行定制的任务
multiprocessing模块的功能众多,支持子进程,通信和共享数据,执行不同形式的同步,提供了Process,Queue,PIpe,Lock等组件
与线程不同,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内
Process类:由该类实例化得到的对象,表示一个子进程中的任务
1.需要使用关键字的方式来指定参数
2.args指定的为传给target函数的位置参数,是一个元祖形式,必须有逗号
group参数:未使用,值始终未None
target表示调用对象,即子进程要执行的任务
args表示调用对象的位置参数元组
kwargs表示调用对象的字典
name为子进程的名称
p.start():启动进程,并调用该子进程中的p.run()
p.run():进程启动时运行的方法,正是他去调用target指定的函数,自定义类需要实现该方法
p.terminate(:强制终止进程p),不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要注意.
p保存的锁也将不会释放,进而导致死锁
p.is_alive():如果p仍然运行返回True
p.join():主线程等待p终止(主线程处于等的状态),timeout是可选的超时时间,p.join只能join住start开启的进程,而不能join住run开启的进程
p.daemon:默认值为False:,如果要设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置
p.name:进程的名称
p.pid:进程的pib
p.exitcode:进程在运行时为None,如果为-N,表示被信号N结束
p.authkey,进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串,这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证时才能成功
主进程创建守护进程:
1.守护进程会在主进程代码执行结束后就终止
2.守护进程无法再开启子进程否则抛出异常
进程之间互相独立,主进程代码运行结束,守护进程随即终止
进程直接的内存空间是隔离的:
创建并开启子进程的两种方式:
通过继承Process类实现多进程必须实例化,且重写run()方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import time 2 import random 3 from multiprocessing import Process 4 class Pc(Process): 5 def __init__(self,name): 6 super().__init__() 7 self.name = name 8 def run(self): 9 print('%s studying...'%self.name) 10 time.sleep(random.random()) 11 print('%s end...'%self.name) 12 p1 = Pc('scx') 13 p2 = Pc('suncunxu') 14 p1.start() 15 p2.start()
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import time 2 import random 3 from multiprocessing import Process 4 def pc(name): 5 print('%s Studying...'%name) 6 time.sleep(2) 7 print('%s ending...'%name) 8 p1 = Process(target = pc,args=('suncunxu',) 9 p2 = Process(target = pc ,args = ('liji',) 10 p1.start() 11 p2.start()