UDP协议、多道技术、进程理论以及同步异步、阻塞非阻塞
UDP协议
代码演示
# 服务端
import socket
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1',8080))
msg,addr=server.recvfrom(1024)
print('msg>>>:',msg.decode('utf8'))
print('addr>>>:',addr)
msg= input('send to client>>>:').strip()
server.sendto(msg.encode('utf8'),addr)
# 客户端
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
msg = input('send to server>>>:').strip()
client.sendto(msg.encode('utf8'),('127.0.0.1',8080))
msg,addr = client.recvfrom(1024)
print('msg>>>:',msg.decode('utf8'))
print(addr)
补充说明:
- 服务端不需要考虑客户端是否异常退出
- UDP不存在黏包问题(UDP多用于短消息的交互)
说明
并发编程前期学习阶段理论居多,后期才会有操作(调模块),学习时尽量理解知识的基本概念。
学习兵法编程其实就是在学习操作系统的发展史,也可以称之为时并发编程的发展史
操作系统的发展史
之前我们学习了计算机的三大核心硬件
- CPU:计算机中真正干活的人
- 内存:给CPU准备需要运行的代码
- 硬盘:存储将来可能要被运行的代码或程序文件
强调:CPU是整个计算机执行效率的核心
而整个操作系统的发展史可以分为三个系统
- 穿孔卡片:CPU的利用率很低
- 联机批处理系统:缩短录入数据的时间,让CPU连续工作的时间变长,提高了CPU的利用率
- 脱机批处理系统:是现代计算机的雏形
总结:操作系统的发展史可以看成是CPU利用率提升的发展史
多道技术
在一个核/一个CPU的前提下:
- 单道技术:所有的程序排队执行,耗时为所有程序耗时之和
- 多道技术:计算机利用空闲时间提前准备好一些别的程序的数据,提升了工作效率,总耗时较短
多道技术的切换+保存状态
-
切换
CPU在两种状态下会切换到并执行其他程序,第一种是:程序程序自身进入IO操作;第二种是程序长时间占用CPU
-
保存状态
每次切换之前要记录下当前执行的状态,之后切回来基于当前的状态继续执行
何为IO操作:
即输入输出的操作:如获取用户输入,time.sleep(),读取文件,保存文件等
进程理论
如何理解进程
- 程序:一对躺在文件上的死代码
- 进程:正在被运行的程序
进程的调度算法
- 先来先服务算法:针对耗时比较短的,并且在后面的程序不友好
- 短作业优先算法:针对耗时比较长的程序不友好
- 时间片轮转法+多级反馈队列:将固定的时间均分成很多份,所有的程序来了都要公平的分一分,分配多次之后如果还有程序需要运行,则将其分到下一层,越往下表示程序总耗时越长,每次分得的时间片也就越多,优先级就越低。
进程的并行于并发
-
并行
多个程序同时执行:单个CPU肯定无法实现并行,必须要有多个CPU
-
并发
多个进程看上去像是在同时执行就可以称之为是并发
单个CPU完全可以实现并发的效果,如果是并行那么肯定也属于并发
当描述一个网站非常牛逼能够同时服务很多人的话术,以下两种哪个是对的?
- 我这个网站很牛逼,能够支持14亿并行量(高并行)
- 我这个网站很牛逼,能够支持14亿并发量(高并发)
很明显,第一种完全不合理,要实现14亿的并行量就要有14亿颗的CPU(集群也不现实)。第二种就合理
进程的三状态
进程分为三种状态:就绪态、阻塞态、运行态。当我们程序在整个执行前后流程大致可以描述为以下
- 所有进程要想被执行,就必须先经过就绪态
- 运行过程中如果出现了IO操作,则会进入阻塞态
- 运行过程中如果时间用完,则会进入就绪态
- 阻塞态要想要进入运行态必须先经过就绪态
同步和异步
同步和异步是用来描述任务的提交状态
-
同步:提交完任务之后原地等待任务的结果,期间不做任何事
-
异步:提交完任务之后不原地等待直接去做其他事,结果自动提醒
补充
-
所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。
-
所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,`所以它是不可靠的任务序列。
阻塞与非阻塞
阻塞与非阻塞用来描述进程的执行状态
- 阻塞:就是进程处于阻塞态
- 非阻塞:就是进程属于就绪态或者运行态
同步异步与阻塞非阻塞
组合起来可以分为4种,我们可以将这4种状态比作去银行排号取款
- 同步阻塞:在银行排队,并且在队伍中什么事情也不做
- 同步非阻塞:在银行排队,并且在队伍中做点其他事
- 异步阻塞:取号,在旁边座位上等着叫号,期间不做事
- 异步非阻塞:取号,在旁边座位上等着叫号,期间为所欲为