并发编程

UDP协议

服务端

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)  # 自己指定UDP协议(默认是TCP协议)
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) # 服务端地址

操作系统的发展史

学习并发编程其实就是在学习操作系统 理论居多 实战很少 都是封装的代码

1.穿孔卡片
	优势:一个人独占电脑
	劣势:CPU利用率极低

2.联机批处理系统
	一次性可以录入多个用户指令、缩短了CPU等待的时间、提高了CPU的利用率
  
3.脱机批处理系统
	是现代计算机核心部件的雏形、提高CPU的利用率

# 总结:操作系统的发展史其实就是提升CPU利用率的过程

多道技术

目的:提升CPU利用率 降低程序等待时间

'''强调:目前我们研究并发都是以计算机是单核的情况下:只有一个CPU'''
串行
	多个任务排队执行 总耗时就是多个任务完整时间叠加
多道
	利用空闲提前准备 缩短总的执行时间并且还能提高CPU利用率

"""
多道技术
	1.空间上的复用
		多个任务共用一套计算机硬件
	2.时间上的复用
		切换+保存状态
			CPU在两种情况下会被拿走
				1.程序遇到IO操作 CPU自动切走运行其他程序
				2.程序长时间占用CPU 系统发现之后也会强行切走CPU 保证其他程序也可以使用
"""

进程理论

# 什么是程序、什么是进程
	程序:一堆没有被执行的代码(死的)
	进程:正在运行的程序(活的)
    
# 为什么有进程的概念
	就是为了更加精确的描述出一些实际状态

# 进程调度算法发展史
	1.先来先服务
  	对短作业任务不太友好
	2.短作业优先
  	对长作业任务不太友好
	3.时间片轮转法与多级反馈队列
  	时间片轮转法:先公平的将CPU分给每个人执行
    多级反馈队列:根据作业长短的不同再合理分配CPU执行时间
  '''目的就是为了能够让单核的计算机也能够做到运行多个程序'''

重要概念

并发与并行

# 并发与并行
	并发
  	看上去像同时在执行就可以称之为是并发
    """
    饭店里面有多桌客人(任务) 
    但是只有一个服务员(CPU) 
    如何让所有客人都感觉被服务员服务着(CPU执行)
    让服务员在多桌客人之间快速的来回切换并保存状态即可
    让CPU在多个程序之间利用多道技术来回切换+保存状态
	
	单核肯定能够实现并发 但是不能实现并行!!!
    """
  并行
  	必须同一时间同时运行才可以称之为并行
		"""单核计算机肯定不能实现并行!!! 必须要有多个CPU"""
    
# 高并发与高并行
	高并发:我们写的软件可以支持1个亿的并发量
    	一个亿的用户来了之后都可以感觉到自己被服务着
	高并行:我们写的软件可以支持1个亿的并行量
    	上述话语的言外之意是计算机有一亿个CPU

同步与异步

	同步
  	提交完任务之后原地等待任务的返回结果 期间不做任何事情
	异步
  	提交完任务之后不愿地等待任务的结果 直接去做其他事情 有结果自动提醒

阻塞与非阻塞

image.png

进程三状态图
	就绪态:程序之进入运行态之前肯定要处于就绪态
	运行态:程序被CPU执行着
	阻塞态:程序执行过程中有IO操作
    '''
    如果想要尽可能的提升程序执行效率 
    就要想办法让我们的程序一直处于就绪态和运行态(不要有IO操作)
    '''
  阻塞:阻塞态
  非阻塞:就绪态、运行态
  ps:以后不需要考虑是哪个状态 知识今天深入学习一下

image.png

同步异步与阻塞非阻塞结合

同步异步:用来描述任务的提交方式
阻塞非阻塞:用来描述任务的执行状态
# 上述两组属于两个不同概念 但是可以结合
以在银行办理业务为例
1.同步阻塞:
	效率是最低的,
	拿上面的例子来说,就是你专心排队,什么别的事都不做。
2.同步非阻塞:
    实际上是效率低下的,想象一下你一边打着电话一边还需要抬头看到底队伍排到你了没有,如果把打电话和观察排队的位置看成是程序的两个操作的话,这个程序需要在这两种不同的行为之间来回的切换,效率可想而知是低下的。
3.异步阻塞:
    如果在银行等待办理业务的人采用的是异步的方式去等待消息被触发(通知),也就是领了一张小纸条,假如在这段时间里他不能离开银行做其它的事情,那么很显然,这个人被阻塞在了这个等待的操作上面;
	异步操作是可以被阻塞住的,只不过它不是在处理消息时阻塞,而是在等待消息通知时被阻塞。
4.异步非阻塞:
    效率更高,因为打电话是你(等待者)的事情,而通知你则是柜台(消息触发机制)的事情,程序没有在两种不同的操作中来回切换。	
posted @ 2022-04-19 00:06  Rain_Kz  阅读(32)  评论(0)    收藏  举报