day04.18网络编程udp协议实操与并发编程
网络编程之UDP协议实操
# 服务端 import socket server = socket.socket(type=socket.SOCK_DGRAM) # 自己指定UDP协议(默认是TCP协议) server.bind(('127.0.0.1', 8080)) # 获取地址和端口号 msg, addr = server.recvfrom(1024) # 解压赋值 msg和addr 接收客户端消息 print('msg>>>:', msg.decode('utf8')) print('addr>>>:', addr) server.sendto(b'hello baby', addr) # 发送消息,bytes类型 # 客户端 import socket client = socket.socket(type=socket.SOCK_DGRAM) # 基于udp协议 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)
多用户的即时通讯
# 服务端 import socket server = socket.socket(type=socket.SOCK_DGRAM) server.bind(('127.0.0.1', 8080)) while True: msg, addr = server.recvfrom(1024) print(addr) 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 = '来自客户端1的消息:%s' % msg client.sendto(msg.encode('utf8'), 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 = '来自客户端2的消息:%s' % msg client.sendto(msg.encode('utf8'), server_addr) msg, addr = client.recvfrom(1024) print(msg.decode('utf8'), addr)
并发编程
学习并发编程的过程其实就是学习操作系统 。
操作系统
操作系统就是一个协调、管理和控制计算机硬件资源和软件资源的控制程序。
操作系统由操作系统的内核(运行内核态和管理硬件资源)和系统调用(运行用户态,为应用程序提供系统调用的接口)两部分组成。
''' 操作系统的功能: 1.隐藏丑陋复杂的硬件接口,提供良好的抽象接口 2.管理、调度进程,并且将多个进程对硬件的竞争变得有序 操作系统的作用: 1.为应用程序提供如何使用硬件资源的抽象概念 2.管理硬件资源 '''
操作系统发展简史
由穿孔卡片>>>联机批处理系统>>>脱机批处理系统。
操作系统的发展史其实就是不断提升CPU利用率的过程。
- 穿孔卡片:
程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。
特点:用户独占全机。不会出现因资源已被其他用户占用而等待的现象,但资源的利用率低。CPU的利用不充分。
- 联机批处理系统:
批处理系统:加载在计算机上的一个系统软件,在它的控制下,计算机能够自动地、成批地处理一个或多个用户的作业(这作业包括程序、数据和命令)。
联机批处理系统:即作业的输入/输出由CPU来处理。
主机与输入机之间增加一个存储设备——磁带,在运行于主机上的监督程序的自动控制下,计算机可自动完成:成批地把输入机上的用户作业读入磁带,依次把磁带上的用户作业读入主机内存并执行并把计算结果向输出机输出。完成了上一批作业后,监督程序又从输入机上输入另一批作业,保存在磁带上,并按上述步骤重复处理。
特点:可以一次性可以录入多个用户指令、缩短了CPU等待的时间、提高了CPU的利用率。但是cpu还是会有空闲状态。
- 脱机批处理系统
卫星机:一台不与主机直接相连而专门用于与输入/输出设备打交道的。
脱机批处理系统是现代计算机核心部件的雏形、极大提高了CPU的利用率。
进程理论
进程:程序仅仅是一堆代码而已,进程指的是程序的运行过程。同一个程序执行两次,那也是两个进程!!!
进程的调度需要遵循时间片轮转法与多级反馈队列规则!!!
时间轮转法:将cpu平均分配给待运行的程序
多级反馈队列:根据程序运行时间的长短,合理分配cpu的工作时间,未能执行完成的程序进入反馈队列当中等待执行,程序执行的优先级降低。
有了进程的调度理论,单核计算机也可以同时运行多个应用程序了。
多道技术
多道技术中的多道指的是多个程序,多道技术的实现是为了解决多个程序竞争或者说共享同一个资源(CPU)的有序调度问题,解决方式即多路复用,多路复用分为时间上的复用和空间上的复用。
相对于串行(eg:多个任务排队执行,总耗时就是多个任务完整时间叠加)来讲,多道技术(同时执行多个任务,缩短总的执行时间,以最长的任务时间为准)能够极大提高cpu的利用率。
- 空间上的复用:
将内存分为几部分,每个部分放入一个程序,这样,同一时间内存中就有了多道程序。即:多个任务共用一套计算机硬件。
由于多个程序同时在计算机中运行,开始有了空间隔离的概念,只有内存空间的隔离,才能让数据更加安全、稳定。
- 时间上的复用:
当一个程序在等待I/O时,另一个程序可以使用CPU,如果内存中可以同时存放足够多的作业,则CPU利用率可以达到100%。
操作系统采用了多道技术之后,可以控制进程的切换,或者说进程之间去争抢CPU的执行权限。这种切换不仅会在一个进程遇到I/O时进行,一个进程占用CPU的时间过长也会切换,或者说被操作系统夺走CPU的执行权限。核心在于切之前将进程的状态保存下来,这样才能保证下次切换回来时,能基于上次切走的位置继续运行。
并发与并行
- 并发:
并发是伪并行,即看起来是同时运行。单个CPU+多道技术就可以实现并发(并行也属于并发的一种)。
- 并行:
必须同一时间同时运行,只有具备多个CPU才能实现并行。单核计算机肯定不能实现并行。
- ps:
单核下,可以利用多道技术,多个核,每个核也都可以利用多道技术(多道技术是针对单核而言的)。
高并发就是指能够同时服务很多个用户,C/S架构下的软件开发的服务端就具有高并发的特性。
阻塞与非阻塞
阻塞>>>:阻塞状态是因为程序遇到了I/O操作,或者sleep,导致后续代码不能被CPU执行。
非阻塞>>>:非阻塞与之相反,表示程序正在被CPU执行。
进程有三种状态:
- 就绪态:程序之进入运行态之前肯定要处于就绪态 # 非阻塞态
- 运行态:程序正在被CPU执行着,运行当中 # 非阻塞态
- 阻塞态:程序执行过程中有IO操作或者sleep等等
多道技术会在进程执行时间过长或遇到I/O时自动切换其他进程,意味着I/O操作与进程被剥夺CPU执行权都会造成进程阻塞。
同步异步与阻塞和非阻塞的结合
同步异步:用来描述任务的提交方式
阻塞与非阻塞:用来描述任务的执行状态
同步阻塞:相当于串行
同步非阻塞:单任务+多道技术下的多程序运行
异步阻塞:多任务+串行
异步非阻塞:多任务+多道技术>>>:程序运行的极致状态
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?