一、操作系统
一、操作系统的发展
没有操作系统———传孔卡片
批处理系统———串行,速度快
联机批处理,读磁带的时候速度快
脱机批处理,读磁带和cpu工作并发
多道程序系统———并行
操作系统的各种管理功能
时空的复用:空间隔离开来,CPU看起来可以处理多个任务
分时系统———更好的实现了并行
缺点:让CPU的工作效率下降了
实时系统———对一个任务实时响应
优点:快
缺点:能处理的任务更少
通用操作系统
兼具多个操作系统的特性
二、操作系统的功能
封装了对硬件的操作过程,给应用层序提供好用的接口
对多个作业进行调度管理来分配硬件资源
三、进程与程序
程序:就是一堆代码
进程:运行当中的程序。进程是操作系统资源分配的最小单位
为什么要引入进程的概念?
为了隔离资源
进程是怎么被调度的呢?
先来先服务算法:(FCFS)
短作业优先算法
时间片轮算法
多级反馈转算法
进程的状态:就绪、运行、阻塞
进程的创建和结束:
创建进程有很多方式———就是让一个程序运行起来
所有的进程都是被进程创建出来的
父进程与子进程:进程1创建了进程2,那么进程1就是父进程,进程2就是子进程
二、进程
1、在学习进程之前首先认识一下如何看到进程:
os.getpid() 获取当前python运行的程序的进程号 (pid:process id :进程id )
os.getppid() 获取当钱python运行的程序的父进程号(ppid:parents process id 父进程id )
关于multiprocess模块——综合的、多元的 进程模块(包):python中创建进程用来替我做事。
import os from multiprocessing import Process #导入进程模块 import time def func(): time.sleep(2) print('子进程号%d'%os.getpid()) if __name__ =='__main__': p=Process(target=func) p.start() #启动子进程 print('第一次主进程号%d'%os.getpid()) p.join() #阻塞 print('第二次主进程号%d'%os.getpid())
有两种情况:
1、没有p.join() :这种情况下不阻塞,执行主程序,调用子进程。子进程和父进程是异步执行。
创建进程对象 传要执行的函数 以及参数 进程对象.start() 主进程和子进程就是异步执行 如果主进程中的代码已经结束了,子进程还没结束,主进程会等待子进程 p.join 就是主进程会阻塞在join的位置,等待p进程结束 windows操作系统中 创建进程的语句一定要放在if __name__ == '__main__':条件语句下面
2、有p.join():主进程阻塞在join的位置,等待p进程的结束(异步阻塞)
2、开启多个子进程
import os import time from multiprocessing import Process def func(i): time.sleep(3) print('%d :子进程%d干的事,父进程%d干的事'%(i,os.getpid(),os.getppid())) if __name__=='__main__': p_lst=[] for i in range(10): p=Process(target=func,args=(i,)) #实例化,调用线程类,传参数 p.start() #启动线程(类似传达一下消息 p_lst.append(p) for p in p_lst: p.join() #阻塞 print('-------主进程-------')
创建一个线程,然后启动(对象名.start),它会在未知的时间里创建线程,所以至于它是不是在主线程之前还是之后启动都不能确定。如果想要主线程在所有线程后等待,那么需要预先创建一个空列表,然后把所有启动的子线程放入列表中,对列表中的子线程总体进行循环阻塞后,启动主线程。
3、另一种开启多进程的方法
import os from multiprocessing import Process class MyProcess(Process): #必须创建一个类,必须继承Process方法 def run(self): #必须实现run方法 print('子进程%d'%os.getpid()) self.walk() def walk(self): print('子进程walk%d'%os.getpid()) if __name__ =='__main__': p=MyProcess() #先实例化一个对象 p.start() #启动子进程 p.join() print('主进程%d'%os.getpid()) #主进程