UDP协议(了解)
称之为是数据包协议
特点:
1,不需要建立链接
2,不需要知道对方是否接收到
3,数据不安全
4,数据传输快
5,能支持并发
6,不会粘包
7,无需先启动服务端在启动客户端
优点:
-
传输速度快
-
能支持并发
-
不会粘包
缺点:
-
数据不安全,容易丢失
import socket
client = socket.socket(type=socket.SOCK_DGRAM)
address = ('127.0.0.1', 9002)
while True:
msg = input('Client---> Server:').encode('utf-8')
client.sendto(msg, address)
import socket
# socket.SOCK_DGRAM--->UPD协议
server = socket.socket(type=socket.SOCK_DGRAM)
# 服务端需要绑定一个地址,让别人知道你在哪
server.bind(
('127.0.0.1', 9002)
)
while True:
# 发送数据给服务端的用户地址
data, addr = server.recvfrom(1024)
print(addr)
print(data)
TCP协议(称之为流式协议)
优点:
数据安全
缺点:
传输速度慢
粘包
面试:TCP和UDP的区别,简述优缺点即可。*
并发编程
1)操作系统发展史
-
1.1 穿孔卡片
-
读取数据速度特别慢
-
CPU的李永率极低
-
单用户(一份代码)使用
-
-
1.2 批量处理
-
读取速度特别慢
-
CPU的利用率特别低
-
联机(多份代码)使用
-
效率还是很低
-
-
1.3 脱机批处理
-
读取数据速度提高
-
CPU的利用率速度提高
-
1)多道技术(基于单核背景下生产的):
单道:一条路走到黑---》串行
比如:a,b需要使用CPU, a先使用,b等待a使用完毕后,b才能使用CPU
多道(重要)
比如:a,b需要使用CPU,a先使用,b等待a,直到a进入“IO或执行时间过长”
a会(切换+保存状态), 然后b可以使用cpu,待b执行遇到“IO或执行时间过长”
再将CPU执行权限交给a,直到两个进程结束。
空间上的复用(重要):
多个程序使用一个cpu
时间上的复用(重要):
切换 + 保存状态
1,当执行程序遇到IO时, 操作系统会将cpu的执行权限剥夺
优点:
cpu的执行效率提高
2,当执行程序执行时间过长时,操作系统会将cpu的执行权限剥夺
缺点:
程序的执行效率低
并发与并行
并发:
在单核(一个cpu)情况下,当执行两个a,b程序时,a先执行, 当a遇到IO时, b开始执行争抢cpu的执行权限,再让b执行,他们看起像同时运行。
并行:在多核(多个cpu)的情况下, 当执行两个a, b程序时,a与b同时执行,他们是真正意义上的同时运行。
面试题:在单核情况下能否实现并行? 不行
进程
什么是进程?
进程是一个资源单位
进程与程序:
程序:是一堆代码文件。
进程:执行代码的过程,称之为进程。
进程调度:(了解)
先来先服务调度算法(了解)
比如程序 a, b,若a先来, 则让a先服务, 待a服务完毕后, b再服务
缺点:执行效率低
短作业优先调度算法(了解)
执行时间越短,则先先调度。
缺点: 导致执行时间长的程序,需要等待所有时间短的程序执行完毕后,才能执行。
现代操作系统的进程调度算法: 时间片轮转法 + 多级反馈队列 (知道)
时间片轮转法
比如同时有10个程序需要执行,操作系统会给你10秒,然后时间片轮转法会将10秒分成10等分。
多级反馈队列:
1级队列: 优先级最高,先执行次队列中程序。
2级队列: 优先级以此类推 3级队列:
同步与异步
同步与异步指的是“提交任务的方式”
同步(串行):
两个a,b程序都要提交并执行,假如a先提交执行,b必须等a执行完毕后,才能提交任务。
异步(并发):
两个a,b程序都要提交并执行,假如a先提交并执行,b无需等a执行完毕,就可以直接提交任务。
阻塞与非阻塞:
-
阻塞(等待):
凡是遇到IO都会阻塞。
IO:
input()
output()
time.sleep(3)
文件的读写
数据的传输
-非阻塞 (不等待) :
除了IO都是非阻塞
(比如: 从1+1开始计算到100万)
就是计算量比较大
进程的三种状态:就绪态:同步与异步
运行态:程序的执行时间过长---》将程序返回给就绪态
阻塞态:遇到IO
面试题:阻塞与同步是一样的吗?非阻塞与异步是一样的吗?
同步与异步: 提交任务的方式
阻塞与非阻塞: 进程的状态。
创建进程的两种方式:
# 方式一:
from multiprocessing import Process
# import time
#
# def tack(name): # 任务
# print(f'start...{name}的子进程')
# time.sleep(3)
# print(f'end...{name}的子进程')
#
# if __name__ == '__main__':
# target = 任务(函数地址)--》创建一个子进程
# p_obj1 = Process(target=tack, args=('wanglu', ))
#
#
# p_obj1.start()# 告诉操作系统,去创建一个子进程
# p_obj1.join() # 告诉主进程,等子进程结束后,再结束
#
# print('正在执行当前主进程...')
#
# list1 = []
# for line in range(10):
# p_obj = Process(target=tack, args=('wanglu', ))
# p_obj.start()
# list1.append(p_obj)
#
# for obj in list1:
# obj.join()
#
# print('谢幕。。。')
# 方式二:
from multiprocessing import Process
import time
class MyProcess(Process):
def run(self):
print(f'start...{self.name}的子进程')
time.sleep(3)
print(f'end...{self.name}的子进程')
if __name__ == '__main__':
list1 = []
for i in range(10):
obj = MyProcess()
obj.start()
list1.append(obj)
for obj in list1:
obj.join()
print('谢幕。。。') -