day34
简介:
用户数据报协议(User Datagram Protocol,UDP)是一种传输层协议。 在 TCP/IP 网络中,它与 TCP 协议一样用于处理数据包,是一种无连接的协议。 TCP 协议在进行数据传输时,需要建立连接,并且每次传输的数据都需要进行确认。 当不再进行传输数据时,还需要断开连接。这样做虽然安全,但是效率较低。而 UDP 协议正好避免了这些过程,它是一种没有复杂控制,提供面向无连接的通信服务协议。
UDP 协议具备以下特点:
1.没有各种连接:在传输数据前不需要建立连接,也避免了后续的断开连接。 2.不重新排序:对到达顺序混乱的数据包不进行重新排序。 3.没有确认:发送数据包无须等待对方确认。因此,使用 UDP 协议可以随时发送数据,但无法保证数据能否成功被目标主机接收。 4.不会出现黏包问题,主要适用于数据量比较小的数据交互。比如一些聊天软件
如何区分当前是UDP协议还是TCP协议:
如果代码中出现recvfrom 使用的是UDP协议 如果代码中出现recv 使用的是TCP协议
服务端:
import socket server = socket.socket(type=socket.SOCK_DGRAM) # 自己指定UDP协议(默认是TCP协议) server.bind(('127.0.0.1', 8080)) # 固定地址 msg, addr = server.recvfrom(1024) # 接收1024KB数据 print('msg>>>:', msg.decode('utf8')) print('addr>>>:', addr) server.sendto(b'hello baby', addr) # 发送给对应地址的数据
客户段端:
import socket client = socket.socket(type=socket.SOCK_DGRAM) server_addr = ('127.0.0.1', 8080) # 服务端的地址提前准备好 这里类似于查找通讯录 client.sendto(b'hello server baby', server_addr) # 回消息 msg, addr = client.recvfrom(1024) print('msg>>>:', msg.decode('utf8')) print('addr>>>:', addr)
1946年第一台计算机诞生--20世纪50年代中期,计算机工作还在采用手工操作方式。此时还没有操作系统的概念。 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行; 计算完毕,打印机输出计算结果; 用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。
手工操作方式两个特点:
1.用户独占全机。不会出现因资源已被其他用户占用而等待的现象,但资源的利用率低。 2.CPU 等待手工操作。CPU的利用不充分。
20世纪50年代后期,出现人机矛盾 :手工操作的慢速度和计算机的高速度之间形成了尖锐矛盾,手工操作方式已严重损害了系统资源的利用率(使资源利用率降为百分之几,甚至更低),不能容忍。唯一的解决办法:只有摆脱人的手工操作,实现作业的自动过渡。这样就出现了成批处理。
批处理系统:加载在计算机上的一个系统软件,在它的控制下,计算机能够自动地、成批地处理一个或多个用户的作业(这作业包括程序、数据和命令)。
主机与输入机之间增加一个存储设备——磁带,在运行于主机上的监督程序的自动控制下,计算机可自动完成: 成批地把输入机上的用户作业读入磁带,依次把磁带上的用户作业读入主机内存并执行并把计算结果向输出机输出。 完成了上一批作业后,监督程序又从输入机上输入另一批作业,保存在磁带上,并按上述步骤重复处理。 监督程序不停地处理各个作业,从而实现了作业到作业的自动转接,减少了作业建立时间和手工操作时间,有效克服了人机矛盾,提高了计算机的利用率。 但是,在作业输入和结果输出时,主机的高速CPU仍处于空闲状态,等待慢速的输入/输出设备完成工作: 主机处于“忙等”状态。
为克服与缓解:高速主机与慢速外设的矛盾,提高CPU的利用率,又引入了脱机批处理系统,即输入/输出脱离主机控制。
总结:操作系统的发展史其实就是提升CPU利用率!
所谓多道程序设计技术,就是指允许多个程序同时进入内存并运行。 即同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种硬、软件资源。 当一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序。
# 目的:提升CPU利用率 降低程序等待时间 '''强调:目前我们研究并发都是以计算机是单核的情况下:只有一个CPU''' 串行 多个任务排队执行 总耗时就是多个任务完整时间叠加 多道 利用空闲提前准备 缩短总的执行时间并且还能提高CPU利用率
""" 多道技术 1.空间上的复用 多个任务共用一套计算机硬件 2.时间上的复用 切换+保存状态 CPU在两种情况下会被拿走 1.程序遇到IO操作 CPU自动切走运行其他程序 2.程序长时间占用CPU 系统发现之后也会强行切走CPU 保证其他程序也可以使用 """ 做饭需要30min 洗衣需要50min 烧水需要20min 串行总共需要耗时:30min + 50min + 20min 多道总共需要耗时:50min
什么是程序、什么是进程?
程序:未被执行的代码 进程:正在运行的程序
进程调度算法发展史
1.先来先服务 对短作业任务不太友好 2.短作业优先 多长作业任务不太友好 3.时间片轮转法与多级反馈队列: 时间片轮转法:先公平的将CPU分给每个人执行 多级反馈队列:根据作业长短的不同再合理分配CPU执行时间 '''目的就是为了能够让单核的计算机也能够做到运行多个程序'''
并发:是伪并行,即看起来是同时运行。单个cpu+多道技术就可以实现并发,(并行也属于并发) 并行:同时运行,只有具备多个cpu才能实现并行
高并发:我们写的软件可以支持1个亿的并发量 一个亿的用户来了之后都可以感觉到自己被服务着 高并行:我们写的软件可以支持1个亿的并行量 上述话语的言外之意是计算机有一亿个CPU
同步 提交完任务之后原地等待任务的返回结果 期间不做任何事情 异步 提交完任务之后不愿地等待任务的结果 直接去做其他事情 有结果自动提醒
配合进程三状态图食用 就绪态:程序之进入运行态之前肯定要处于就绪态 运行态:程序被CPU执行着 阻塞态:程序执行过程中有IO操作 ''' 如果想要尽可能的提升程序执行效率 就要想办法让我们的程序一直处于就绪态和运行态(不要有IO操作) ''' 阻塞:阻塞态 非阻塞:就绪态、运行态 ps:以后不需要考虑是哪个状态 知识今天深入学习一下
同步异步:用来描述任务的提交方式 阻塞非阻塞:用来描述任务的执行状态 # 上述两组属于两个不同概念 但是可以结合 同步阻塞:银行排队办理业务 期间不做任何事 同步非阻塞:银行排队办理业务 期间喝水吃东西 但是人还在队列中 异步阻塞:在椅子上坐着 但是不做任何事 异步非阻塞:在椅子上坐着 期间喝水吃东西办公 (程序运行的极致)