UDP协议
# udp是无链接的,先启动哪一端都不会报错
# 服务端
import socket
# 需要自己指定udp协议(默认是TCP协议)
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)
server.sendto(b'hai hai hai', addr)
# 客户端
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080) # 往哪发,类似于通讯录
client.sendto(b'hello server', server_addr)
msg, addr = client.recvfrom(1024)
print('msg>>>:', msg.decode('utf8'))
print('addr>>>:', addr)
基于UDP实现简易版本的qq
# 服务器
import socket
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1', 8080))
while True:
msg, addr = server.recvfrom(1024)
print(msg.decode('utf8'))
back_msg = input('回复消息: ').strip()
server.sendto(back_msg.encode('utf8'), addr)
# 客户端1
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080)
while True:
msg = input('回复消息: ').strip()
msg = f'来自客户端1的消息:{msg}'
client.sendto(msg.encode('utf-8'), server_addr)
msg, addr = client.recvfrom(1024)
print(msg.decode('utf8'),addr
# 客户端2
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
server_addr = ('127.0.0.1', 8080)
while True:
msg = input('回复消息: ').strip()
msg = f'来自客户端2的消息:{msg}'
client.sendto(msg.encode('utf-8'), server_addr)
msg, addr = client.recvfrom(1024)
print(msg.decode('utf8'),addr)
操作系统的发展史
穿孔卡片机
1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式。此时还没有操作系统的概念。
优势:一个人独占一台电脑,机房内,只能够进入一个人
劣势:cpu利用极低,全是手工在操作
联机批处理系统
一次性可以录入多个用户指令、缩短了CPU等待的时间、提高了CPU的利用率,计算机处理数据之后再输出给用户看
脱机批处理系统
为克服与缓解:高速主机与慢速外设的矛盾,提高CPU的利用率,又引入了脱机批处理系统,即输入/输出脱离主机控制。
'''
用户可以远程传入指令,将指令传入高速磁带,交给主机来处理,目的也是为了提高CPU的利用率
'''
也是现在计算机的雏形
# 总结:操作系统的系统发展史其实就是提升CPU利用率的过程
多道技术
# 针对单核,来进行研究
# 目的:提高CPU的运行效率
'''
串行:多个任务排队执行,总耗时就是多个人物完成时间叠加
空间上的复用:多个人物排队执行,总耗时就是多个任务完整时间叠加
'''
# 多道:利用空闲的时间提前准备,缩短总执行时间并且还能提高cpu利用率
'''
时间上的复用:切换+保存状态
cpu在两种情况下会被拿走:
1.程序遇到IO操作,CPU自动切走运行其他程序
2.程序长时间占用CPU 系统发现之后也会强行切走CPU保证其他程序可以使用
'''
进程理论
什么是程序、什么是进程
程序:没有被再执行的代码(死的)
进程:正在执行的程序(活的)
为什么有进程的概念
为了更加精确的描述出一些实际状态
'在描述的时候用进程比较方便'
进程的调度算法发展史
1.先来先服务
缺陷:如果所有的进程都要排队进行, 正在运行的程序如果需要10小时,而它后面的程序只需要一两秒需要等它运行完才可以,不合理'对短作业不友好'
2.短作业优先
缺陷:'对长作业不友好',如果短作业程序太多了,很难轮到长作业
3.时间片轮转法与多级反馈队列:
时间片轮转法:先公平的将CPU分给每个人执行
多级反馈队列:根据作业长短的不同再合理分配CPU执行时间
'''目的就是为了能够让单核的计算机也能够做到运行多个程序'''
并发与并行
并发
看上去像同时在执行就可以称之为是并发
eg:
'''
饭店里面有多桌客人(任务)
但是只有一个服务员(CPU)
如何让所有客人都感觉被服务员服务着(CPU执行)
让服务员在多桌客人之间快速的来回切换并保存状态即可
让CPU在多个程序之间利用多道技术来回切换+保存状态
单核肯定能够实现并发 但是不能实现并行!!!
'''
并行
必须同一时间同时运行才可以称之为并行
"""单核计算机肯定不能实现并行 必须要有多个CPU"""
高并发与高并行
高并发:我们写的软件可以支持1个亿的并发量
一个亿的用户来了之后都可以感觉到自己被服务着
高并行:我们写的软件可以支持1个亿的并行量
上述话语的言外之意是计算机有一亿个CPU
同步与异步:
同步
提交完任务之后原地等待任务的返回结果 期间不做任何事情
'''
喊了一个人吃饭,中途就什么也不做,然后等他一起去吃饭
'''
异步
提交完任务之后不愿地等待任务的结果,直接去做其他事情,有结果自动提醒
'''
喊了一个人吃饭,中途去做自己的事,然后他完事了一起去吃饭
'''
阻塞与阻塞
阻塞与非阻塞
进程分为三个状态,如下图
'''就绪态:程序进入运行态之后肯定处于就绪态
运行态:程序被CPU执行时
阻塞态:程序执行过程中的IO操作 '''
阻塞:阻塞态
非阻塞:就绪态\运行态
同步异步与阻塞非阻塞结合
同步异步:用来描述人物的提交方式
阻塞非阻塞:用来描述人物的执行状态
可以结合为四种状态:
同步阻塞:排队期间不做任何事
同步非阻塞:排队期间喝水吃东西,但人还在队列中
异步阻塞:在椅子上坐着,但是不做任何事
异步非阻塞:在椅子上坐着,期间喝水吃东西(程序运行的极致)