并发编程学习笔记
今日内容概要
- 作业讲解
- UDP协议
- 操作系统的发展史
- 多道技术
- 进程理论
- 进程的并行与并发
- 进程的三状态
- 同步和异步
- 阻塞与非阻塞
- 同步异步与阻塞非阻塞
今日内容详细
作业讲解
客户端上传电影
客户端
1.获取一个存有很多视频文件的路径 r'D:\J老师视频合集'
2.列举该路径下所有的视频文件名称供用户选择
3.拼接出该视频文件的完整路径
4.制作字典数据
5.制作字典报头
6.发送报头
7.发送字典
8.发送视频文件
服务端
1.接收固定长度的报头
2.解析数据字典的长度并接收
3.解析字典获取真实数据长度
4.接收真实数据
UDP协议
# 服务端
import socket
server = socket.socket(type=socket.SOCK_DGRAM) # 自己指定UDP协议(默认是TCP协议)
server.bind(('127.0.0.1', 8080))
msg, address = server.recvfrom(1024)
print('msg>>>:%s' % msg.decode('utf8'))
print('address>>>:',address)
server.sendto('我是服务端 你好啊'.encode('utf8'), address)
# 客户端
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
server_address = ('127.0.0.1', 8080)
client.sendto('我是客户端 想我了没'.encode('utf8'), server_address)
msg, address = client.recvfrom(1024)
print('msg>>>:%s' % msg.decode('utf8'))
print('address>>>:',address)
'''补充说明'''
1.服务端不需要考虑客户端是否异常退出
2.UDP不存在黏包问题(UDP多用于短消息的交互)
基于UDP实现简易版本的qq
# 服务端
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)
# 客户端 可多个同时执行发送信息,服务端一个一个接收回复
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)
操作系统的发展史
回顾:三大核心硬件
CPU:是计算机中真正干活的人
内存:给CPU准备需要运行的代码
硬盘:永存存储将来可能要被运行的代码
强调:CPU是整个计算机执行效率的核心
发展史 | 作用 |
---|---|
穿孔卡片 | 优势:一个人独占电脑 劣势:CPU利用率极低 |
联机批处理系统 | 缩短录入数据的时间让CPU连续工作的时间变长,提升CPU利用率 |
脱机批处理系统 | 是现代计算机的雏形,提升CPU利用率 |
总结:操作系统的发展史也可以看成是cpu利用率提升的发展史
多道技术
多道技术的出现就是为了提升CPU的利用率,降低程序的等待时间。目前我们研究并发都是以计算机是单核(一个CPU)的情况下
单道技术
所有的程序排队执行,总耗时是所有程序耗时之和
例子:
做饭需要30min
洗衣需要50min
烧水需要20min
单道总共需要耗时:30min + 50min + 20min=100min
多道技术
计算机利用空闲时间提前准备好一些数据 提高效率 总耗时较短
空间上的复用:多个任务共用一套计算机硬件
时间上的复用:切换+保存状态
CPU在两种情况下会切换(去执行其他程序):
1.程序遇到IO操作,CPU自动切走运行其他程序
2.程序长时间占用CPU,系统发现之后也会强行切走CPU,保证其他程序也可以使用
保存状态
每次切换之前要记录下当前执行的状态 之后切回来基于当前状态继续执行
例子:
做饭需要30min
洗衣需要50min
烧水需要20min
多道总共需要耗时:50min
进程理论
程序和进程的概念
程序:一堆躺在文件上的死代码
进程:正在被运行的程序(活的)
进程的调度算法
1.先来的先开始服务
比如说目前有3个进程,第一个进程需要1个小时,第二个和第三个进程都需要2秒钟,先到先服务,只能等第一个进程执行完后才会开始第二个第三个进程,对短作业任务不太友好。
2.短作业优先
如果说有10000个短作业进程每个都需要1秒种,而排在10000个短作业后的一个长作业需要半个小时,只能等10000个短作业执行完后才会执行长作业,多长作业任务不太友好
3.时间片轮转法+多级反馈队列
时间片轮转法:先公平的将CPU分给每个人执行.
多级反馈队列:根据作业长短的不同再合理分配CPU执行时间
'目的就是为了能够让单核的计算机也能够做到运行多个程序'
将固定的时间均分成很多份,所有的程序来了都公平的分一份
分配多次之后如果还有程序需要运行,则将其分到下一层
越往下表示程序总耗时越长,每次分的时间片越多,但是优先级越低
进程的并行与并发
并发
多个进程看上去像同时执行就可以称之为并发
原理:让CPU在多个程序之间利用多道技术来回切换+保存状态.
'单个CPU完全可以实现并发的效果,如果是并行那么肯定也属于并发''
并行
多个进程同时执行
'单个CPU肯定无法实现并行 必须要有多个CPU'
高并行与高并发
描述一个网址非常牛逼能够同时服务很多人的话术
1.我这个网站很牛逼 能够支持14亿并行量(高并行)
不合理 哪有那么多CPU(集群也不现实)
2.我这个网站很牛逼 能够支持14亿并发量(高并发)
非常合理!!! 国内最牛逼的网站>>>:12306
进程的三状态
1.就绪(Ready)状态
当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。
2.执行/运行(Running)状态
当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。
3.阻塞(Blocked)状态
正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。
1.所有的进程要想被运行 必须先经过就绪态
2.运行过程中如果出现了IO操作 则进入阻塞态
3.运行过程中如果时间片用完 则继续进入就绪态
4.阻塞态要想进入运行态必须先经过就绪态
同步和异步(重要)
用于描述任务的提交状态
同步
提交完任务之后原地等待任务的结果,期间不做任何事
异步
提交完任务之后不原地等待直接去做其他事,结果自动提醒
阻塞与非阻塞(重要)
用于描述进程的执行状态
阻塞
阻塞态:程序执行过程中有IO操作
非阻塞
运行态:程序被CPU执行着
就绪态:程序之进入运行态之前肯定要处于就绪态
同步异步与阻塞非阻塞
想要提升程序执行的效率,就要想办法让我们的程序一直处于就绪态和运行态
同步阻塞:在银行排队 并且在队伍中什么事情都不做
同步非阻塞:在银行排队 并且在队伍中做点其他事
异步阻塞:取号 在旁边座位上等着叫号 期间不做事
异步非阻塞:取号 在旁边座位上等着叫号 期间为所欲为
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了