- UDP协议
- 操作系统的发展史
- 多道技术
- 进程理论
- 并行与并发
- 进程的三状态
- 同步与异步
- 阻塞与非阻塞
- 同步异步与阻塞非阻塞
server:
import socket server = socket.socket(type=socket.SOCK_DGRAM) # 默认使用TCP协议,需要选择UDP协议 server.bind(('127.0.0.1', 8080)) msg, address = server.recvfrom(1024) # 接收到消息和客户端地址 print(msg.decode('utf8'), address) # 指定地址发送信息 server.sendto('from server'.encode('utf8'), address)
client:
import socket client = socket.socket(type=socket.SOCK_DGRAM) server_address = ('127.0.0.1', 8080) client.sendto('from client'.encode('utf8'), server_address) msg, address = client.recvfrom(1024) print(msg.decode('utf8'), address)
相较于TCP协议,UDP协议不用建立双向通道,直接指定地址发送信息,不需要考虑客户端是否退出,基于报文发送针对短消息也不会出现黏包问题
但没有双向通道和二次确认机制,发送的信息可能会丢失
- 穿孔卡片
程序员将对应程序与数据的穿孔卡片装入输入机,然后启动输入机把程序和数据输入到计算机内存,接着启动程序进行运算;计算完毕,打印机输出计算结果;程序员取走结果后,才让下一个人上机- 程序员能够一个人独占全机,不会出现资源被其他用户占用而等待的现象
- CPU利用率非常低,只有在运算的时候工作了,其余时间都是空闲的
- 联机批处理系统
将多个用户的作业写入磁带,计算机直接读取磁带上的数据处理,减少了作业建立时间和手工操作时间,提高了CPU的利用率 - 脱机批处理系统
现代计算机的雏形,将作业从输入机上传到卫星机,卫星机通过高速磁带传递给主机运算;在将结果保存到磁带,通过卫星机传递给输出机,提升CPU的利用率
操作系统的发展史也可以看做是提升CPU利用率的发展史
前提:只使用一个核/一个CPU
单道技术
所有程序依次执行,总耗时就是所有程序耗时之和
多道技术
利用计算机的空闲时间提前准备好一些数据,提高效率
切换、保存状态
CPU在两种情况下会切换执行程序
1. 程序进入IO操作(输入输出操作)
获取用户输入、文件操作、time.sleep
2. 程序长时间占用CPU
保存状态
在切换前会记录当前的执行状态,再次执行时基于保存状态继续执行
- 如何理解进程
程序:保存在文件里的代码
进程:正在被运行的程序 - 进程的调度算法
- 先来先服务算法
按照先后顺序执行,对于耗时短的程序不友好 - 短作业优先调度
耗时短的作业优先执行,对于耗时长的程序不友好 - 时间片轮转法+多级反馈队列
让每个程序都统一执行一个时间片段,一个程序执行了多次都还没有结束,判断是长时间作业,分到下一层
越往下分配的时间片越多,但是优先级越低
- 并行
多个进程同时执行,单个CPU无法实现 - 并发
多个进程看上去像是同时执行就可以称为并发,单个CPU就能够实现,并行也属于并发
- 所有程序想要被运行都必须先经过就绪态
- 运行过程中出现了IO操作,进入阻塞态
- 运行时间片到了,返回就绪态
- 阻塞结束,返回就绪态
同步
提交了任务后原地等待任务的结果
异步
提交任务后不等待结果,得到结果自动提醒阻塞与非阻塞 用于描述进程的执行状态
阻塞
阻塞态
非阻塞
就绪态、运行态同步异步与阻塞非阻塞 同步阻塞:执行多个任务时,提交一个任务,之后就一直等待着他执行结束,其他什么事也不做
同步非阻塞:执行多个任务时,提交一个任务,在任务阻塞时切换其他任务执行,并随时回来看看阻塞是否结束
异步阻塞:执行多个任务时,提交一个任务,之后就等待任务返回结果回来,期间也不会做其他事
异步非阻塞:执行多个任务时,提交一个任务,在任务阻塞时切换其他任务执行,任务结束结果会自动返回 - 先来先服务算法