一、操作系统
一、多道操作系统
有多个程序在操作系统中执行
当一个程序遇到IO操作的时候就把CPU让出来给其他程序用
二、分时操作系统
时间片
不是遇到IO的时候才让出CPU,而是时间到了就将CPU让出来
切换要占时间 :单纯的分时系统没有提高CPU的利用率
三、实时系统
及时响应。每一个信息接收、分析处理和发送的过程必须在严格的时间限制内完成。
高可靠性。需采取冗余措施,双机系统前后台工作,也包括必要的保密措施等
四、个人计算机操作系统
五、分布式操作系统
二、进程
进程
进程就是运行中的程序,没有运行的程序是一个文件
pid是一个全系统唯一的对某个进程的标识
随着进程的重启,pid也可能会变化
进程是操作系统中最小的资源分配单位
同一个程序执行两次,就会在操作系统中出现两个进程,
所以我们可以同时运行一个软件,分别做不同的事情也不会混乱。
进程调度
先来先服务 FCFS
短作业优先算法
时间片轮转法
多级反馈队列算法
同步阻塞:不能充分利用cpu
异步非阻塞:过度利用cpu
IO多路复用:比较完善的在网络编程中的解决方案
三、multiprocess模块
import os import time from multiprocessing import Process def func(): for i in range(10): time.sleep(0.5) print('子进程:',os.getpid(),os.getppid()) if __name__ == '__main__': print('主进程',os.getpid(),os.getppid()) p = Process(target=func) p.start() for i in range(10): time.sleep(0.3) print('*'*i) # 给子进程传参数 def fun(arg): for i in range(10): time.sleep(0.5) print('子进程:%s'%arg,os.getpid(),os.getppid()) if __name__ == '__main__': print('主进程:',os.getpid(),os.getppid()) p = Process(target=fun,args=(1,)) p.start() for i in range(10): time.sleep(0.3) print('*'*i) # 进程之间数据隔离问题 count = 100 def fun(): global count count -= 1 print('子进程:',count) if __name__ == '__main__': print('主进程',os.getpid(),os.getppid()) p = Process(target=fun) p.start() time.sleep(3) print('主进程',count) # 启动多个进程 def fun(arg): print('子进程:%s' %arg,os.getpid(),os.getppid()) if __name__ == '__main__': for i in range(10): Process(target=fun,args=(i,)).start() # 子进程和父进程之间的关系 def fun(arg): print('子进程:%s' %arg,os.getpid(),os.getppid()) time.sleep(5) print('子进程end') if __name__ == '__main__': for i in range(10): Process(target=fun,args=(i,)).start() print('父进程') # 1.父进程和子进程的启动是异步的 # 父进程只负责通知操作系统启动子进程 # 接下来的工作由操作系统接手 父进程继续执行 # 2.父进程执行完毕之后并不会直接结束程序, # 而是会等待所有的子进程都执行完毕之后才结束 # 父进程要负责回收子进程的资源
四、Process类
import time import random import os from multiprocessing import Process # join同步控制 def fun(index): time.sleep(random.random()) print('第%s个邮件已经发送完毕' %index) if __name__ == '__main__': p_lst = [] for i in range(10): p = Process(target=fun,args=(i,)) p.start() p_lst.append(p) for p in p_lst: p.join() print('10个邮件已经发送完毕') # 开启进程的第二种方式 class MyProcess(Process): def __init__(self,arg): super().__init__() self.arg = arg def run(self): print('子进程',os.getpid(),os.getppid(),self.arg) if __name__ == '__main__': p_lst = [] for i in range(10): p = MyProcess(i) p.start() p_lst.append(p) for p in p_lst: p.join() print('主进程', os.getpid())
五、守护进程
import time from multiprocessing import Process def func1(): count = 1 while True: time.sleep(0.5) print(count * '*') count += 1 def func2(): print('func2 start') time.sleep(5) print('func2 end') if __name__ == '__main__': p1 = Process(target=func1) p1.daemon = True p1.start() Process(target=func2).start() time.sleep(3) print('主进程')
六、锁
import time import json from multiprocessing import Process,Lock def search(person): with open('ticket.txt') as f: dic = json.load(f) time.sleep(0.2) print('%s查询到余票%s' % (person,dic['count'])) def get_ticket(person): with open('ticket.txt') as f: dic = json.load(f) time.sleep(0.2) if dic['count'] > 0: print('%s买到票了' %person) dic['count'] -= 1 time.sleep(0.2) with open('ticket.txt','w') as f: json.dump(dic,f) else: print('%s没买到票' %person) def ticket(person,lock): search(person) lock.acquire() get_ticket(person) lock.release() if __name__ == '__main__': lock = Lock() for i in range(10): p = Process(target=ticket,args=(i,lock)) p.start()
七、信号量
import time import random from multiprocessing import Process,Semaphore def ktv(person,sem): sem.acquire() print('%s走进ktv' %person) time.sleep(random.randint(1,5)) print('%s走出ktv' %person) sem.release() if __name__ == '__main__': sem = Semaphore(4) for i in range(10): p = Process(target=ktv,args=('person%s' %i,sem)) p.start() # 信号量的实现机制:计数器+锁
八、事件
import time import random from multiprocessing import Process,Event def triffic_light(e): print("