UDP协议、多道技术、进程理论以及同步异步、阻塞非阻塞

UDP协议

代码演示

# 服务端
import socket
server = socket.socket(type=socket.SOCK_DGRAM)
server.bind(('127.0.0.1',8080))
msg,addr=server.recvfrom(1024)
print('msg>>>:',msg.decode('utf8'))
print('addr>>>:',addr)
msg= input('send to client>>>:').strip()
server.sendto(msg.encode('utf8'),addr)

# 客户端
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
msg = input('send to server>>>:').strip()
client.sendto(msg.encode('utf8'),('127.0.0.1',8080))
msg,addr = client.recvfrom(1024)
print('msg>>>:',msg.decode('utf8'))
print(addr)

补充说明:

  1. 服务端不需要考虑客户端是否异常退出
  2. UDP不存在黏包问题(UDP多用于短消息的交互)

说明

并发编程前期学习阶段理论居多,后期才会有操作(调模块),学习时尽量理解知识的基本概念。

学习兵法编程其实就是在学习操作系统的发展史,也可以称之为时并发编程的发展史

操作系统的发展史

之前我们学习了计算机的三大核心硬件

  1. CPU:计算机中真正干活的人
  2. 内存:给CPU准备需要运行的代码
  3. 硬盘:存储将来可能要被运行的代码或程序文件

强调:CPU是整个计算机执行效率的核心

而整个操作系统的发展史可以分为三个系统

  1. 穿孔卡片:CPU的利用率很低
  2. 联机批处理系统:缩短录入数据的时间,让CPU连续工作的时间变长,提高了CPU的利用率
  3. 脱机批处理系统:是现代计算机的雏形

总结:操作系统的发展史可以看成是CPU利用率提升的发展史

多道技术

在一个核/一个CPU的前提下:

  • 单道技术:所有的程序排队执行,耗时为所有程序耗时之和
  • 多道技术:计算机利用空闲时间提前准备好一些别的程序的数据,提升了工作效率,总耗时较短

多道技术的切换+保存状态
image

  • 切换

    CPU在两种状态下会切换到并执行其他程序,第一种是:程序程序自身进入IO操作;第二种是程序长时间占用CPU

  • 保存状态

    每次切换之前要记录下当前执行的状态,之后切回来基于当前的状态继续执行

何为IO操作

​ 即输入输出的操作:如获取用户输入,time.sleep(),读取文件,保存文件等

进程理论

如何理解进程

  • 程序:一对躺在文件上的死代码
  • 进程:正在被运行的程序

进程的调度算法

  • 先来先服务算法:针对耗时比较短的,并且在后面的程序不友好
  • 短作业优先算法:针对耗时比较长的程序不友好
  • 时间片轮转法+多级反馈队列:将固定的时间均分成很多份,所有的程序来了都要公平的分一分,分配多次之后如果还有程序需要运行,则将其分到下一层,越往下表示程序总耗时越长,每次分得的时间片也就越多,优先级就越低。

进程的并行于并发

  1. 并行

    多个程序同时执行:单个CPU肯定无法实现并行,必须要有多个CPU

  2. 并发

    多个进程看上去像是在同时执行就可以称之为是并发

    单个CPU完全可以实现并发的效果,如果是并行那么肯定也属于并发

当描述一个网站非常牛逼能够同时服务很多人的话术,以下两种哪个是对的?

  1. 我这个网站很牛逼,能够支持14亿并行量(高并行)
  2. 我这个网站很牛逼,能够支持14亿并发量(高并发)

很明显,第一种完全不合理,要实现14亿的并行量就要有14亿颗的CPU(集群也不现实)。第二种就合理

进程的三状态

进程分为三种状态:就绪态、阻塞态、运行态。当我们程序在整个执行前后流程大致可以描述为以下
image

  • 所有进程要想被执行,就必须先经过就绪态
  • 运行过程中如果出现了IO操作,则会进入阻塞态
  • 运行过程中如果时间用完,则会进入就绪态
  • 阻塞态要想要进入运行态必须先经过就绪态

同步和异步

同步和异步是用来描述任务的提交状态

  1. 同步:提交完任务之后原地等待任务的结果,期间不做任何事

  2. 异步:提交完任务之后不原地等待直接去做其他事,结果自动提醒

补充

  1. 所谓同步就是一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成,这是一种可靠的任务序列。要么成功都成功,失败都失败,两个任务的状态可以保持一致。

  2. 所谓异步是不需要等待被依赖的任务完成,只是通知被依赖的任务要完成什么工作,依赖的任务也立即执行,只要自己完成了整个任务就算完成了。至于被依赖的任务最终是否真正完成,依赖它的任务无法确定,`所以它是不可靠的任务序列。

阻塞与非阻塞

阻塞与非阻塞用来描述进程的执行状态

  1. 阻塞:就是进程处于阻塞态
  2. 非阻塞:就是进程属于就绪态或者运行态

同步异步与阻塞非阻塞

组合起来可以分为4种,我们可以将这4种状态比作去银行排号取款

  1. 同步阻塞:在银行排队,并且在队伍中什么事情也不做
  2. 同步非阻塞:在银行排队,并且在队伍中做点其他事
  3. 异步阻塞:取号,在旁边座位上等着叫号,期间不做事
  4. 异步非阻塞:取号,在旁边座位上等着叫号,期间为所欲为
posted @ 2022-08-08 15:39  荀飞  阅读(45)  评论(0编辑  收藏  举报