4.18python笔记
UDP协议实战、多道、进程理论
#UDP协议
UDP叫做用户数据报协议,是OSI七层参考模型中传输层使用的协议,他提供的是不可靠传输,既它在传输过程中不保证数据的完整性!
服务端
import socket
server = socket.socket(type=socket.SOCK_DGRAM) # 自己指定UDP协议(默认是TCP协议)
server.bind(('127.0.0.1', 8080)) # 绑定IP和端口号
msg, addr = server.recvfrom(1024) # 接收消息
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)
'''
socket() 创建一个空的套接字
bind() 绑定UDP网络地址
getsockname() 获取套接字绑定的IP地址和端口
recvfrom() 接受返回发送该数据报的客户端地址和字节表示的数据报内容
sendto() 要发送的信息和目标地址
'''
多道技术
目的:提升CPU利用率,降低程序等待时间
强调:目前我们研究并发都是以计算机是单核情况下,即只有一个CPU
1、串行:
即多个任务排队执行,总耗时就是多个任务完整时间叠加
2、多道:
即利用空闲提前准备,缩短总的执行时间并且还能提高CPU利用率
#空间上的复用(多任务):
多个任务共用一套计算机,就是将内存分为几部分,每个部分放入一个程序,这样,同一时间内存中就有了多道程序。
#时间上的复用(切换+保存状态):
当一个程序在等待I/O时,另一个程序可以使用cpu,如果内存中可以同时存放足够多的作业,则cpu的利用率可以接近100%
进程
#程序:完成特定任务的一系列指令集合
代码段+数据段
-----放在磁盘中的程序
#进程:进行就是正在进行中的程序
1、用户角度: 进程是程序的一次动态执行过程
2、操作系统: 进程是操作系统分配资源的基本单位,也是最小单位
进程的三种状态
1、就绪状态。某些进程“万事俱备”(必要资源),只差CPU。(就绪队列)
2、执行状态。某进程占有CPU并在CPU上执行其程序。
3、阻塞状态。某些进程由于某种原因不能继续运行下去,等待处 理问题。也称为等待状态或封锁状态。如:请求I/O。(多个等待队列)
进程状态转换的原因
1)就绪-→执行:
对就绪状态的进程,当进程调度程序按一种选定的策略从中选中一个就绪进程,为之分配了处理机后,该进程便由就绪状态变为执行状态;
2)执行-→阻塞:
正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态。
如:进程提出输入/输出请求而变成等待外部设备传输信息的状态,进程申请资源(主存空间或外部设备)得不到满足时变成等待资源状态,进程运行中出现了故障(程序出错或主存储器读写错等)变成等待干预状态等等;
3)阻塞-→就绪:
处于阻塞状态的进程,在其等待的事件已经完成,如输入/输出完成,资源得到满足或错误处理完毕时,处于等待状态的进程并不马上转入执行状态,而是先转入就绪状态,然后再由系统进程调度程序在适当的时候将该进程转为执行状态;
4)执行-→就绪:
正在执行的进程,因时间片用完而被暂停执行,或在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行而被迫让出处理机时,该进程便由执行状态转变为就绪状态。
并发与并行
#并发
看上去像是同时在执行就可以称为并发,实际上是在很短的时间内让CPU利用多道技术快速来回切换并保存状态
#并行
必须是同一时间同时运行才可以称为并行
因此:单核计算机肯定能实现并发,但一定不能实现并行,并行必须是多个CPU
#区别:
并发的实质是一个物理CPU(也可以是多个物理CPU)在若干个程序之间多路复用,并发性是对有限物
理资源强制行使 多用户共享以提高效率。
并行指两个或两个以上事件或活动在同一时刻发生,在多道程序环境下,并行使多个程序同一时刻可在
不同CPU上同时执行。
并发是指一个处理器同时处理多个任务。
并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。
并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。
同步与异步
#同步:
提交完任务之后原地等待任务的返回结果,期间不做任何事情
#异步:
提交完任务之后不原地等待任务的结果,直接去做其他事情,有结果自动提醒(相当于分出一个分支去处理任务并得出结果返回给主程序)
阻塞与非阻塞
就绪态:程序之进入运行态之前肯定要处于就绪态
运行态:程序被CPU执行着
阻塞态:程序执行过程中有IO操作
#阻塞:
即处于阻塞态
#非阻塞:
即处于就绪态、运行态
同步异步与阻塞非阻塞结合
#同步异步:用来描述任务的提交方式
#阻塞非阻塞:用来描述任务的执行状态
两者相结合产生四个状态:同步阻塞、同步非阻塞、异步阻塞、异步非阻塞
#同步阻塞:
eg:银行排队办理业务 期间不做任何事
提交完任务后等待结果过程中进入阻塞状态
#同步非阻塞:
eg:银行排队办理业务 期间喝水吃东西 但是人还在队列中
提交完任务后等待结果时未进入阻塞状态,然后继续进入队列执行
#异步阻塞:
eg:在椅子上坐着 但是不做任何事
提交完任务后让该任务等待结果,自己去处理其他任务,该任务过程中进入阻塞状态,阻塞态结束后返回结果
#异步非阻塞:
eg:在椅子上坐着 期间喝水吃东西办公 (程序运行的极致)
提交完任务后让该任务等待结果并顺利执行完返回结果,自己去处理其他任务