一:昨日复习:
1.相关概念
并发:多个任务看起来是同时运行的,但是其实是来回的切换
并行:多个任务是真正意义上的同时运行,多核
串行:一个任务运行完成后才能开启下一个任务
2.操作系统的发展历史
批处理操作系统---》分时操作系统--》multics--》unix--》minix--》linux
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
今日内容:
一:僵尸进程与孤儿进程 *******
1.定义
(1)僵尸进程:基于父子进程相互独立运行,存在机制是为了保证父进程随时可以看到操作系统保留的子进程的状态和痕迹(pid)
是linux操作系统中一种特殊的数据结构,在Linux系统中所有的子进程在死后都会进入僵尸进程的状态,是指将该进程的重型资源放掉(CPU,内存,打开的文件),但是会保留该进程的状态信息,比如pid
处理父进程一直开启造成僵尸进程:kill-CHLD父进程考虑回收僵尸进程儿子,验证是否有设计;第二种杀掉父进程
(2)孤儿进程:父进程死掉,就成为孤儿进程,不会被爷爷进程接管,被pid为1的进程接管,它有回收僵尸进程回收机制
二:守护进程***
像守护皇帝的太监,皇帝运行完代码,它也死亡
from multiprocessing import Process import time def foo(): print(123) time.sleep(1) print('end123') def bar(): print(456) time.sleep(3) print('end456') if __name__ == '__main__': p1=Process(target=foo) p2=Process(target=bar) p1.daemon=True p1.start() p2.start() print('主进程')
第一种结果:
主进程
456
end456
第二种结果:
主进程
123
456
end456
三:互斥锁***
合租房子中的公厕,一个人用完,另外一个人才可以用;互斥锁就是在一个进程运行时,进行锁着其他不得使用,直至用完
from multiprocessing import Process,Lock import json import os import time def check(): with open('db.json',mode='rt',encoding='utf-8') as f: time.sleep(1) dic = json.load(f) print("%s查看到剩余票数为:%s" %(os.getpid(),dic['count'])) def get(): with open('db.json',mode='rt',encoding='utf-8') as f: time.sleep(1) dic = json.load(f) if dic['count'] > 0: dic['count'] -= 1 time.sleep(3) with open('db.json',mode='wt',encoding='utf-8') as f: json.dump(dic,f) print('%s购票成功' %os.getpid()) else: print("购票失败") def func(mutex): check() mutex.acquire() get() mutex.release() # with mutex: # get() if __name__ == '__main__': mutex = Lock() for i in range(10): p = Process(target=func,args=(mutex,)) p.start() # p.join() print("主")
四:ipc,管道,队列 ***
共享内存,队列就是管道+互斥锁实现的,建议用队列
五:信号量***
大家共用公共厕所,但是数量还是有限,也是一种锁