操作系统的发展
将应用程序对硬件资源的静态请求变得有序化
第一代:真空管,插件版,没有操作系统概念,同一时间只能一个使用(浪费资源)
第二代:晶体管和批处理技术,节省机时,需要人参与控制
第三代:集成电路芯片,多道程序设计
现代计算机:
一般多核,每个核都有多道技术
当一个程序运行阻塞,IO结束会重新调度,最大为核数
调度cpu的任意一个,有操作系统调度算法决定
IO:不只是输入输出设备,硬盘读取代码到内存,内存保存在硬盘中,网络IO
串行:一个完完整整的执行完了在执行下一个
并发:看起来是同时运行的(切换+保存状态)
并行:真正做到同时运行,只有多核才能实现并行
多道技术:
空间复用:公用一个内存条,每一个进程都有自己独立的内存空间,互不干扰,物理级别的隔离
(给时间复用铺路)
时间复用:公用一个cpu,
cpu的切换:IO的时候,占用时间过长的时候切换
进程概述
进程:正在进行的一个任务
进程的创建:系统初始化;一个进程在运行过程中开启子进程;用户交互请求,创建新进程
进程的三个基本状态:运行,阻塞,就绪
就绪:除了处理器资源,别的都准备就绪,只要分配了处理器进程就可以执行
运行:进程占用处理器资源,此状态进程数目小于等于处理器数目,通常会执行计算机的空闲进程
阻塞:缺少某种条件,在条件满足前及时分配了处理器资源给该进程,也无法运行
开启子进程的两种方式
方式一:
from multiprocessing import Process
# 导入模块,可以开启子进程
import time
def task(x):
print(f'{x},start')
time.sleep(2)
print(f'{x},end')
if __name__ == '__main__':
p = Process(target=task,args=('lqz',)) # 目标
p2 = Process(target=task,args=('lhf',))
p.start()
p2.start() # 告诉操作系统开启进程,告诉完就执行完了,操作系统什么时候开子进程我们不能控制
time.sleep(5)
print('主进程')
方式二:
from multiprocessing import Process
import time
class Test(Process):
def __init__(self,sex):
self.sex = sex
def run(self):
print(f'{self.sex}.start')
time.sleep(5)
print(f'{self.sex}.end')
if __name__ == '__main__':
p = Test()
p.start()
print('主进程')
僵尸进程,孤儿进程
僵尸进程:子进程结束时保用pid等状态信息(没死透)
孤儿进程:父进程死了自己在死