进入python的世界_day33_网络编程—— 黏包现象、UDP协议、并发编程理论
一、黏包现象
1.何为黏包


流式协议:所有的数据类似于水流 连接在一起的
数据量很小 并且时间间隔很多 那么就会自动组织到一起
recv
我们不知道即将要接收的数据量很大 如果 知道的话 不会产生黏包
2.如何解决
首先我们看以下不依赖模块自己手动调整——手动改接收字节长度参数

- 一个中文三个字节没忘记吧?
但是呢,我们用户传数据我们怎么能预测刚好他传过来的数据占多少字节,所以我们只能用一个新的模块,struct模块来做先锋兵。
3.struct模块
其实很好理解,就是在传真正的数据前,把数据转成bytes类型,然后用struct模块封一个固定长度的报头,报头里有真正数据的长度,然后把这个报头先传给接收端,然后再传真正的数据。
接收端收到报头反解析出真实数据长度,然后坐等收到完整的真是数据即可(注意,反解析的时候会得到一个元组,记得取索引0)
二、UDP协议
UDP不需要考虑黏包问题(UDP多用于短消息交互)
服务端不需要考虑客户端异常退出,硬传就完事,但是注意,服务端关闭后,虽然客户端可以继续传,但是服务端再上线也看不到消息了。
# 服务端
import socket
server = socket.socket(type=socket.SOCK_DGRAM) # UDP协议
server.bind(('127.0.0.1', 8080))
while True:
data, addr = server.recvfrom(1024)
print('客户端地址>>>:', addr)
print('上述地址发送的消息>>>:', data.decode('utf8'))
msg = input('>>>:').strip()
server.sendto(msg.encode('utf8'), addr)
# 客户端
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080)
while True:
msg = input('>>>:').strip()
client.sendto(msg.encode('utf8'), server_addr)
data, addr = client.recvfrom(1024)
print(data.decode('utf8'), addr)
三、操作系统发展史
1.穿孔卡片
计算机初期 通过穿孔卡片与计算机交互CPU利用率非常的低,好处是那时候程序员可以一个人独占计算机,想干嘛就干嘛
2.联机批处理系统
缩短录入数据的时候 让CPU连接工作的时间变长>>>:提升CPU的利用率
3.脱机批处理系统
是现代计算机的雏形>>>:提升CPU利用率
总结:
操作系统发展史 可以看成是CPU利用率提升的发展史
四、多道技术
- 前提:一般而言,默认一台电脑就一个CPU(什么双路E5洋垃圾只是极个别),CPU是真正的干活人
1.单道技术
所有的程序排队执行 总耗时是所有程序耗时之和
2.多道技术
计算机利用空闲时间 提前准备好一些数据 提高效率 总耗时较短
多道技术详细
1.切换
计算机的CPU在两种情况下会切换(不让你用 给别人用)
1.程序有IO操作
输入\输出操作
input、time.sleep、read、write
2.程序长时间占用CPU
我们得雨露均沾 让多个程序都能被CPU运行一下
2.保存状态
CPU每次切换走之前都需要保存当前操作的状态 下次切换回来基于上次的进度继续执行
-
助记:
其实就好比做饭,扫地、洗衣服
煮饭的时候可以洗衣服、扫地之类的
五、进程理论
1.解释进程与程序的区别
程序就是写好了的一堆代码堆叠而成,还没被运行
进程就是进行中的程序,被运行了这样
2.进度的调度算法
-
1.FCFS first come first service
先来先执行,对短作业不友好,可以理解为排队办理业务前面的人先来,但是有一大堆业务要办,这就会让后面只办理一个业务的人等很久
-
2.短作业优先调度
短的先上去执行,对长作业不友好
-
3.时间片轮转法+多级反馈队列(目前还在用)
将时间均分 然后根据进程时间长短再分多个等级
等级越靠下表示耗时越长 每次分到的时间越多 但是优先级越低
3.进程的三个状态

就绪态、运行态、阻塞态
1. 所有进程要想被运行 必须先经过就绪态
2. 运行过程中如果出现了IO操作 则进入阻塞态,比如time.sleep()
3. 运行过程中如果时间片用完 则继续进入就绪态
4. 阻塞态想要进入运行态 必须先经过就绪态
六、进程的并行与并发
并行
多个进程同时执行
单个CPU肯定无法实现并行 必须要有多个CPU(并行是真正的共同执行)
并发
多个进程看上去像同时执行就可以称之为并发
单个CPU完全可以实现并发的效果 如果是并行那么肯定也属于并发
如果说到了并发,就是以为程序服务多个用户,不是单单的服务一个

浙公网安备 33010602011771号