多道技术、、同步与异步、阻塞与非阻塞
一、UDP协议
# 服务端
import socket
server = socket.socket(type=socket.SOCK_DGRAM)
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多用于短消息的交互)
二、操作系统(并发编程)的发展史
穿孔卡片
程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数据运行;计算完毕,打印机输出计算结果;用户取走结果并卸下纸带(或卡片)后,才让下一个用户上机。
手工操作方式两个特点:CPU利用率非常低,用户独占计算机
联机批处理系统
缩短录入数据的时候,让CPU连续工作的时间变长
脱机批处理系统
是现代计算机的雏形>>>提升CPU利用率
三、多道技术
单道技术
所有的程序排队执行,总耗时是所有程序耗时之和
多道技术
多道程序设计技术,就是指允许多个程序同时进入内存并运行。即同时把多个程序放入内存,并允许它们交替在CPU中运行,它们共享系统中的各种硬、软件资源。当一道程序因I/O请求而暂停运行时,CPU便立即转去运行另一道程序。
计算机利用空闲时间提前准备好一些数据,提高效率,总耗时短
切换+保存状态
CPU在俩种下会切换(去执行其他程序)
程序进入IO操作后,获取用户操作,一直等待输入,保存状态
程序长时间占有CPU,保存状态,每次切换出去的时候保存状态
例子:
做饭耗时50min
洗衣耗时30min
烧水耗时10min
单道技术:50+30+10
多道技术:50
四、进程理论
如何理解进程?
程序:一堆躺在文件上的死代码
进程:正在被运行的程序(活的)
进程的调度算法
进程调度的由来:要想要多个进程交替运行,操作系统必须对这些进程进行调度,这个调度也不是随时就能调度的,所以就有一些法则,如下:
先来先服务算法:争对耗时比较短的程序不友好
短作业优先调度:争对耗时比较长的程序不友好
时间片轮转法+多级反馈队列:将固定的时间均分成很多分,所有的程序公平一点
分配多次之后,如果还有程序需要运行,则将其分到下一层越往下表示程序总耗时越长,每次分的越多,但是优先级越低
额外知识
同一个程序执行两次,就会在操作系统中出现两个进程,所以我们可以同时运行一个软件,分别做不同的事情也不会混乱。
五、进程的并行与开发
并行
多个进程同时执行
单个CPU肯定无法实现并行,必须要有多个CPU
例子:两者同时执行,比如赛跑,两个人都在不停的往前跑;(资源够用,比如三个线程,四核的CPU )
并发
多个进程看上去像同时执行就可以称之为并发
单个CPU完全可以实现并发的效果,如果是并行那么肯定也属于并发
例子:一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率。
面试时遇到的情况案例
如果听到描述一个网址非常牛逼能够同时服务很多人的话术 1.我这个网站很牛逼,能够支持14亿【并行量(高并行)】 不合理,哪有那么多CPU(集群也不现实) 2.我这个网站很牛逼 能够支持14亿【并发量(高并发)】 非常合理!!! 国内最牛逼的网站>>>:12306
并行与并发的区别
并行是从微观上,也就是在一个精确的时间片刻,有不同的程序在执行,这就要求必须有多个处理器。 并发是从宏观上,在一个时间段上可以看出是同时执行的,比如一个服务器同时处理多个session。
六、进程的三状态
在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞。
三种状态的解释说明
- 就绪(Ready)状态当进程已分配到除CPU以外的所有必要的资源,只要获得处理机便可立即执行,这时的进程状态称为就绪状态。
- 执行/运行(Running)状态当进程已获得处理机,其程序正在处理机上执行,此时的进程状态称为执行状态。
- 阻塞(Blocked)状态正在执行的进程,由于等待某个事件发生而无法执行时,便放弃处理机而处于阻塞状态。引起进程阻塞的事件可有多种,例如,等待I/O完成、申请缓冲区不能满足、等待信件(信号)等。
三种状态过程
- 所有的进程要想被运行 必须先经过就绪态
- 运行过程中如果出现了IO操作 则进入阻塞态
- 运行过程中如果时间片用完 则继续进入就绪态
- 阻塞态要想进入运行态必须先经过就绪态
七、同步和异步
概念
用于描述任务的提交状态
同步
提交完任务之后原地等待任务的结果 期间不做任何事
要么成功都成功,要么失败都失败,俩任务的状态可以保持一致
异步
提交完任务之后不原地等待直接去做其他事 结果自动提醒
至于被依赖的任务最终是否真正完成,依赖他的任务无法确定
八、阻塞与非阻塞
概念知识
阻塞和非阻塞这两个概念与程序(线程)等待消息通知(无所谓同步或者异步)时的状态有关。也就是说阻塞与非阻塞主要是程序(线程)等待消息通知时的状态角度来说的
执行状态
阻塞---阻塞态
非阻塞----就绪态 运行态
九、同步异步与阻塞非阻塞
同步阻塞
在银行排队 并且在队伍中什么事情都不做,效率最低
同步非阻塞
在银行排队 并且在队伍中做点其他事
异步阻塞
取号 在旁边座位上等着叫号 期间不做事,实际上效率
异步非阻塞
取号 在旁边座位上等着叫号 期间为所欲为,效率更高