在我们创建socket对象的时候,默认是使用TCP协议的,如果想要使用UDP协议,需要给个参数。
server = socket.socket(type=socket.SOCK_DGRAM)
如果使用了UDP协议,那么它的一些方法也会发生变化。
举例
服务端(Server)
import socket server = socket.socket(type=socket.SOCK_DGRAM) # 绑定ip地址和端口号不变 server.bind(('127.0.0.1', 8080)) # 接收消息的方法改变了,不与客户端进行连接就直接获取消息 msg, addr = server.recvfrom(1024) print('来自客户端:', msg.decode('utf8')) print('客户端地址:', addr) # 发送消息的方法改变了,根据客户端地址发送 server.sendto('来自服务端的消息'.encode('utf8'), addr)
客户端(Client)
import socket client = socket.socket(type=socket.SOCK_DGRAM) # 可以先写个变量存储服务端地址,后续用起来方便 server_addr = ('127.0.0.1', 8080) # 发送消息的方法改变了,根据服务端地址发送 client.sendto('来自客户端的消息'.encode('utf8'), server_addr) # 接收消息的方法改变了,可以获取服务端的消息和地址 msg, addr = client.recvfrom(1024) print('来自服务端:', msg.decode('utf8')) print('服务端地址:', addr)
由于使用的是UDP协议,不会建立双向通道,所以可以启动多个客户端给服务端发送消息,服务端都会接收到,谁先发送消息服务端就会优先收到,并且使用UDP协议是不会发生黏包问题的。
程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。
优点:用户独占全机,不会出现因资源已被其他用户占用而等待的现象。
缺点:CPU的利用不充分,资源的利用率低。
批处理系统:加载在计算机上的一个系统软件,在它的控制下,计算机能够自动地、成批地处理一个或多个用户的作业(这作业包括程序、数据和命令)。
主机与输入机之间增加一个存储设备——磁带,在运行于主机上的监督程序的自动控制下,计算机可自动完成:成批地把输入机上的用户作业读入磁带,依次把磁带上的用户作业读入主机内存并执行并把计算结果向输出机输出。完成了上一批作业后,监督程序又从输入机上输入另一批作业,保存在磁带上,并按上述步骤重复处理。
优点:不停地处理各个作业,从而实现了作业到作业的自动转接,减少了作业建立时间和手工操作时间,提高了计算机的利用率。
缺点:在作业输入和结果输出时,主机的高速CPU仍处于空闲状态,等待慢速的输入/输出设备完成工作
为克服与缓解高速主机与慢速外设的矛盾,在联机批处理系统的基础上增加一台不与主机直接相连而专门用于与输入/输出设备打交道的卫星机。
优点:主机不是直接与慢速的输入/输出设备打交道,而是与速度相对较快的磁带机发生关系,有效缓解了主机与设备的矛盾。主机与卫星机可并行工作,二者分工明确,可以充分发挥主机的高速计算能力。
缺点:每次主机内存中仅存放一道作业,每当它运行期间发出输入/输出(I/O)请求后,高速的CPU便处于等待低速的I/O完成状态,致使CPU空闲。
脱机批处理系统就是现代计算机核心部件的雏形。
总结:操作系统的发展史其实就是提升CPU利用率的过程
首先多道技术的目的是为了提升CPU利用率,降低程序等待时间。
串行
在没有使用多道技术时,程序的执行是串行的——多个任务排队执行,上一个任务结束时才开始执行下一个任务,总耗时就是多个任务完整时间叠加。
多道
使用了多道技术后,计算机内存中会同时存放几道相互独立的程序,在一个程序执行过程中,利用空闲提前准备,缩短总的执行时间并且还能提高CPU利用率。
CPU在两种情况下会被拿走:
程序是一堆没有被执行的代码(死的),进程是正在运行的程序(活的)。有了进程这个概念就可以更加精确的描述出一些实际状态。
进程调度算法发展史
1.先来先服务
那个程序先执行就会先运行完这个程序,然后再去执行下一个,如果第一个进程需要100h才能执行完毕,那么第二个进程就需要等待100h,所以这个算法对短作业不太友好。
2.短作业优先
会优先执行那些耗时短的进程。如果短作业有好几个,长作业就会到最好执行,所以对长作业不太友好。
3.时间片轮转法与多级反馈队列
时间片轮转法:先公平的将CPU分给每个人执行。
多级反馈队列:根据作业长短的不同再合理分配CPU执行时间。
总的来说,进程调度算法的目的就是为了能够让单核的计算机也能够做到运行多个程序。
并发
并发是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
简单的来说就是程序看上去像同时在执行就可以称之为是并发。
并行
并行是指在同一个时间段内,两个或多个程序执行,有时间上的重叠,必须同一时间同时运行才可以称之为并行。单核计算机肯定不能实现并行,必须要有多个CPU才能实现并行的效果。
拓展:高并发与高并行
高并发:如果我说我们写的软件可以支持1个亿的并发量,那么一个亿的用户来了之后都可以感觉到自己被服务着。
高并行:如果我说我们写的软件可以支持1个亿的并行量,这种明显是不可能的,这句话的言外之意就是计算机有一亿个CPU,这是目前做不到的。
同步指的是提交完任务之后原地等待任务的返回结果,期间不做任何事情。比如我喊你吃饭,你没有听到我就一直喊,喊道你回应我为止。
异步指的是提交完任务之后不愿地等待任务的结果,直接去做其他事情,有结果自动提醒。比如我喊你吃饭,我就去饭店了,不管你来不来。
一个进程是有着三个状态的。
就绪态:程序之进入运行态之前肯定要处于就绪状态。
运行态:程序被CPU执行着。
阻塞态:程序执行过程中有IO操作,程序会等待。
阻塞就是处于阻塞态,非阻塞就是处于就绪态和运行态,所以如果想要尽可能的提升程序执行效率,就要想办法让我们的程序一直处于就绪态和运行态,就是不要有IO操作。
同步异步是用来描述任务的提交方式,阻塞非阻塞是用来描述任务的执行状态,所以我们可以结合出四种情况:
同步阻塞:相当于在银行排队办理业务,期间不做任何事。
同步非阻塞:相当于银行排队办理业务,期间喝水吃东西,但是人还在队列中
异步阻塞:相当于通过银行叫号方式等待办理业务,等待时在椅子上坐着,但是不做任何事。
异步非阻塞:相当于通过银行叫号方式等待办理业务,等待时在椅子上坐着,期间喝水吃东西办公。这个状态就是程序运行的极致。