# 服务端 import socket server = socket.socket(type=socket.SOCK_DGRAM) # 指定协议为UDP协议 server.bind(('127.0.0.1', 9000)) while True: msg, addr = server.recvfrom(1024) print('信息>>>>:', msg.decode('utf8')) print('信息来自>>>>:', addr) message = input('回复的信息>>>>:').strip() server.sendto(message.encode('utf8'), addr) # 客户端 import socket client = socket.socket(type=socket.SOCK_DGRAM) # 指定协议为UDP协议 while True: message = input('请输入要发送的信息>>>>:').strip() client.sendto(message.encode('utf8'), ('127.0.0.1', 9000)) msg, addr = client.recvfrom(1024) print('信息>>>>:', msg.decode('utf8')) print('信息来自>>>>:', addr)
UDP协议没有建立链接通道的操作,从而也没有断开链接通道的需求。可以直接对某个地址发送信息,只需要在发送数据的时候进行地址的指定就可以发送。并且在发送信息的时候不需要对方确认接收。而且使用的接收和发送指令都是不同于TCP协议的。
联机批处理系统
一次性可以录入多个用户指令、缩短了CPU等待的时间、提高了CPU的利用率
脱机批处理系统
是现代计算机核心部件的雏形、提高CPU的利用率
总结:操作系统的发展史其实就是提升CPU利用率的过程
这里需要注意的是,目前阶段,我们研究并发是基于单核CPU情况
1. 串行:是指多个任务执行的顺序是类似于串起来的环节,总是在每一个任务做完以后才会执行下一个任务
2. 多道:是指利用不同环节是否占用对不同的任务进行执行不同的阶段(从硬盘)
进程调度算法的发展本质上也是为了让单核计算能够做到运行多个程序
类似于只有一个服务员的餐厅同时来了多位客人,并且还要服务好每位客人的问题。只有合理安排服务顾客A的空闲时间去服务其他客人才能保证服务各位客人,看似在服务多位客人,其实同一时间只服务了一位客人
以上面举得例子为例,如果想同一时间服务好每一位客人,那么就要求必须有与客人数相等的服务员数量
单核计算机只能实现并发,不能实现并行
这里需要介绍进程的三种状态:就绪态、运行态、阻塞态
就绪态:程序才被执行前要处于就绪态
运行态:程序被CPU执行过程中
阻塞态:程序执行过程中有IO操作
阻塞:进程处于阻塞态
非阻塞:进程处于就绪态或者运行态
想要提升程序的执行效率,就是要提升程序处于就绪态和运行态的时间比例(极致状态就是一直处于该状态)
同步异步:用来描述任务的提交方式
阻塞非阻塞:用来描述任务的执行状态