UDP协议
服务端
import socket
while True:
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8080))
msg, address = server.recvfrom(1024)
print('msg>>>:%s' % msg.decode('utf8'))
# 客户端的IP地址
print('address>>>:', address)
# 客户端发来的数据
res = input('返回给客户端>>>:').strip()
server.sendto(res.encode('utf8'), address)
客户端
import socket
while True:
client = socket.socket(type=socket.SOCK_DGRAM)
server_address = ('127.0.0.1', 8080)
res = input('发给服务端>>>:').strip()
client.sendto(res.encode('utf8'), server_address)
msg, address = client.recvfrom(1024)
print('address>>>:', address)
# 客户端的IP地址
print('msg>>>:%s' % msg.decode('utf8'))
# 客户端发来的数据
'''
UDP服务端不需要考虑客户端是否异常退出
UDP不存在黏包问题
UDP多用于短消息的交互
'''
操作系统理论
操作系统的发展史
'''
三大核心硬件
CPU 内存 硬盘
'''
1穿孔卡片
CPU利用率非常低,但程序员可以一人独占计算机
2.联机批处理系统
缩短录入数据时间,让CPU连续工作的时间变长,提升CPU利用率
3.脱机批处理系统
是现代计算机的雏形,提升CPU利用率
4.操作系统的发展史也可以看成是CPU利用率提升的发展史
多道技术
前提:一核/一CPU
1.单道技术
所有程序排队执行,总耗时是所有程序耗时之和
2.多道技术
计算机利用空闲时间提前准备好一些数据,提高效率,总耗时较短
3.多道技术(切换+保存状态)
3.1CPU在两种情况下回切换(先去执行其他程序)
程序自身进入IO操作
'''
IO:输入输出操作
获取用户输入
time.sleep()
保存文件
读取文件
'''
3.2保存状态
每次切换之前都会记录当前执行状态了,切换回来后就可以基于当前状态继续执行
进程理论
1.什么是进程
程序:一堆躺在文件中的代码
进程:正在执行的代码
2.进程的调度算法
2.1如果先来先服务,对耗时断的程序不友好
2.2如果短作业优先,对耗时长的程序不友好
2.3时间片轮转法+多级反馈队列
让用户感觉所有程序都在执行
'''
将固定的时间分成很多份,所有的程序都执行一份
分配多次之后如果还有程序,则分到下一层
越往下表示程序总耗时越长,每次分的时间片越多 但是优先级越低
'''
进程的并行与并发
1.并行
多个进程同时执行,单个CPU无法实现并行,必须要有多个CPU
'当一个CPU执行一个线程时,另一个CPU可以执行另一个线程'
2.并发
多个进程好像在同时执行,单个CPU可以实现并发,并行也属于并发
'在同一个时间段内,两个或多个程序执行,但任一个时刻点上只有一个程序在运行'
3.描述一个网址很牛(扩展:面试小坑)
3.1这个网址很厉害,可以支持10亿并行量(高并行)>>>不合理,哪来那么多CPU
3.2这个网址很厉害,可以支持10亿并发量(高并发)>>>合理,12306nb
进程的三状态
1.所有的进程想要运行,就要先进入就绪态
2.运行过程中如果出现了IO操作,就会进入阻塞态
3.运行过程中如果时间片用完了,则在进入就绪态
4.阻塞态想要运行,就要先进入就绪态
同步异步与阻塞非阻塞
1.同步和异步
1.1同步
提交任务之后等待任务结束,期间什么都不做
1.2异步
提交任务之后就去做其他事,结果会自动提醒
2.阻塞与非阻塞
2.1阻塞
阻塞态
2.2非阻塞
就绪态、运行态
3.同步异步与阻塞非阻塞
同步阻塞:在银行排队,并在队伍中什么事情都不做
同步非阻塞:在银行排队,并且在队伍中做点其他事
异步阻塞:取号再在旁边座位上等着叫号,期间不做事
异步非阻塞:取号再在旁边座位上等着叫号,期间做点其他事