一、操作系统基础知识
(一)操作系统背景知识:1946年第一台计算机
1.手工操作 —— 穿孔卡片
用户独占,不用等待,资源利用率低,cpu利用不充分
2.批处理:---串行
联机批处理,作业的输入/输出由CPU来处理,读磁带速度快,不足CPU利用率低 脱机批处理,输入/输出脱离主机控制,由卫星机控制,读磁带和cpu共同工作,节省了等待时间,不足是 遇到I/O时候,cpu等待时间浪费资源
3.多道程序系统:---并行***
是同一时间允许多个程序并行,当一个道的程序遇到 I/O操作等待的时候, cpu立马转向另一道运行,节省了等待时间 实质上多道的转换也是需要时间的,所以多道程序其实是降低了CPU的效率,但是达到多个程序同时运行效果
#***标志着操作系统的渐趋成熟,出现了文件系统管理,作业调度管理,存储器管理,外部设备管理 #***出现空间隔离概念,内存互相隔离,让数据更安全 #***出现时空复用概念,遇到IO操作就切换程序,cpu效率提高
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
分时间片工作,按时间片轮流把处理机分配给各联机作业使用
但是其实并没有提高效率,因为自己的时间片没有走完,可能就被轮走了,时间片轮转也是耗费时间的
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
实时系统,实时控制和信息处理,独享资源,一般用于飞机飞行、导弹发射;预定飞机票、查询有关航班、航线、票价等
4.通用操作系统:
具有多种类型操作特征的操作系统。可以同时兼有多道批处理、分时、实时处理的功能,或其中两种以上的功能。
UNIX操作系统:通用的多用户分时交互型的操作系统
(二)操作系统的进一步发展
""" 1.个人计算机操作系统:专供个人使用 2.网络操作系统:增加了个人操作系统中按照网络协议增添了网络管理模块 3.分布式操作系统:统一的操作系统实现统一操作,分布式系统更强调分布式计算和处理,因此对于多机合作和系统重构、坚强性和容错能力有更高的要求,希望系统有:更短的响应时间、高吞吐量和高可靠性。 """
(三)操作系统的功能
""" 操作系统就是一个协调、管理和控制计算机硬件资源和软件资源的控制程序, 程序员直接跳过繁琐的硬件操作,通过应用软件直接使用操作系统提供的功能来间接使用硬件。 """
# 二、进程---正在运行的一个程序的抽象
""" 必备的理论基础:首先是操作系统提供良好的借口,让竞争变的有序,其次是多道技术,时空的复用,空间的隔离。 强调:遇到I/O 切,遇到cpu占用过多的也切,核心能够把切走的进程保存,下次切到了继续从之前的位置运行 """
(一)概念:
""" 进程是资源分配和调度的最小单元,进程是一个实体,动态产生和消亡,它是程序的容器,是执行中的程序,程序是永久的,进程是暂时。多道程序设计操作系统都建立在进程的基础上 """
(二)特点:
""" 动态性:进程的实质是程序在多道程序系统中的一次执行过程,进程是动态产生,动态消亡的。 并发性:任何进程都可以同其他进程一起并发执行 独立性:进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位; 异步性:由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进 结构特征:进程由程序、数据和进程控制块三部分组成。 多个不同的进程可以包含相同的程序:一个程序在不同的数据集里就构成不同的进程,能得到不同的结果;但是执行过程中,程序不能发生改变。 """
(三)进程调度算法:
""" 先到先服务算法: 短作业优先算法:对短作业或短进程优先调度的算法 时间片轮转法:让每个进程在就绪队列中的等待时间与享受服务的时间成比例 多级反馈法:目前公认最好的算法: (1) 应设置多个就绪队列,并为各个队列赋予不同的优先级 (2) 当一个新进程进入内存后,首先将它放入第一队列的末尾,按FCFS原则排队等待调度 (3) 仅当第一队列空闲时,调度程序才调度第二队列中的进程运行 """
进程的状态:就绪,执行,阻塞(recv sleep input 等 )
(四)、进程的并行与并发
""" 并行:多核且资源够用状态下,同时执行 并发 : 并发是指资源有限的情况下,两者交替轮流使用资源 区别:并行是不同的程序真正的同时运行;并发是看似同时执行,其实只是在一段时间内轮流执行,看似同时执行 """
三、同步异步
""" 同步:两个任务相互依赖,状态可以保持一致。 异步:两个任务,不依赖任务完成,只是通知有这个任务,至于执行与否不关心 # 举例: 去银行排队办理业务 同步是一心一意排队等待 异步是领取一个号码,就不管了,到了会有柜员喊号办理业务 """
四、阻塞与非阻塞:阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的
(1)进程的创建与结束
""" 四种方式: 1.初始化进程 2,进程中开启另一个进程 3.用户的交互式请求,而创建一个新进程(如用户双击暴风影音) 4.一个批处理作业的初始化(只在大型机的批处理系统中应用) """
简单进程的创建
multiprocess中process模块创建进程(综合的 处理进程 的包) import os from multiprocessing import Process #导入创建进程模块 def func(): print('啦啦啦') print('子进程',os.getpid()) #打印当前程序的进程 子进程 3692 if __name__=='__main__': #必须有这个 p=Process(target=func) #创建一个进程对象 print('主进程', os.getpid()) #主进程 15416 print('呼哈哈') p.start() #开启这个进程,这个时候,进程才算真的创建起来了 print('主进程',os.getpid()) #主进程 15416 #执行的打印顺序是:呼哈哈--主进程15664--啦啦啦--子进程5948 #说明我们确实创建了一个子进程 #异步非阻塞:因为既打印了’呼哈哈‘,又打印了’啦啦啦‘,也就是在创建子进程的时候,你影响主进程,
(2)join方法 进程对象.join() ---->阻塞作用
def func(): print('子进程',os.getpid()) #子进程 7872 print('你好') if __name__=='__main__': p=Process(target=func) p.start() p.join() #加阻塞,结果是主进程会等待子进程运行完才会执行 print('主进程',os.getpid()) #主进程 10572# 说明是异步 # 执行的打印顺序是:子进程 16276-->你好--->主进程 8732 # 说明主进程被阻塞了,加join后,让程序从原来的 异步非阻塞 变成了--->异步阻塞
(3)进程可以传参,但是必须传一个元祖,当括号里只有一个值的时候要加一个逗号
def func(msg): print('子进程',os.getpid()) #子进程 7872 print('你好%s'%msg) if __name__=='__main__': p=Process(target=func,args=('你好',)) #传参 p.start() p.join() #加阻塞,结果是主进程会等待子进程运行完才会执行 print('主进程',os.getpid())
(4)开启多个子进程,用for 循环
def func(i): print('%d,子进程%d,主进程%d'%(i,os.getpid(),os.getppid())) if __name__=='__main__': p_l = [] for i in range(10): p=Process(target=func,args=(i,)) p.start() p_l.append(p) for p in p_l: p.join() #异步阻塞每个开启的子进程阻塞,就可以事项打印‘主进程’在子进程结束后再执行,变成异步阻塞
print('主进程')
(5)用面向对象知识来创建进程:通过继承
import os from multiprocessing import Process class MyProcess(Process): def run(self): print('子进程:%d'%os.getpid()) self.walk() # --->在子进程中调用 def walk(self): # 自定义的 可以不定义 print('子进程:%d' % os.getpid()) if __name__ == '__main__': p = MyProcess() p.start() # ---> run方法 # p.walk() # ---> 也可以在主进程中调用walk print('主进程 :',os.getpid())