一、黏包现象
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完全可以实现并发的效果 如果是并行那么肯定也属于并发
如果说到了并发,就是以为程序服务多个用户,不是单单的服务一个
标签:UDP,addr,python,黏包,编程,server,并发,CPU,socket From: https://www.cnblogs.com/wznn125ml/p/16900916.html