网络编程(续)

UDP协议

import socket
server = socket.socket(type=socket.SOCK_DGRAM)  # 自己指定UDP协议(默认是TCP协议)
'''
family:套接字家族,可以使用 AF_UNIX 或者 AF_INET(IPv6用AF_INET6)等。
type:套接字类型,主要有(TCP) SOCK_STREAM、 (UDP)SOCK_DGRAM,还有一些其他类型。
proto:一般不填默认为 0。
eg:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
'''
server.bind(('127.0.0.1', 8080))
msg, addr = server.recvfrom(1024)  # 接收UCP数据,与recv()类似,但返回值是(data,adderss)。

data包含接收数据的字符串,

address是发送数据的套接字地址。
print('msg>>>:', msg.decode('utf8'))
print('addr>>>:', addr)
server.sendto(b'hello baby', addr)  # 发送UCP数据,将数据发送到套接字,address是元组(host,port),指定远端地址。返回值是发送的字节数。


import socket
client = socket.socket(type=socket.SOCK_DGRAM)
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)
'''如果先启动客户端后启动服务器,会报错:
ConnectionResetError: [WinError 10054] 远程主机强迫关闭了一个现有的连接。'''

操作系统的发展史

学习并发编程其实就是再学习操作系统,基本都是封装代码,主要理解

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

  2. 联机批处理系统
    一次性可以录入多个用户指令、缩短了CPU等待的时间、提高了CPU的利用率

  3. 脱机批处理系统
    是现代计算机核心部件的雏形、提高CPU的利用率

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

多道技术

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

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

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

做饭需要30min
洗衣需要50min
烧水需要20min
串行总共需要耗时:30min + 50min + 20min
多道总共需要耗时:50min

进程理论

程序:一堆没有被执行的代码(死的)

进程:正在运行的程序(活的)

为什么有进程的概念

就是为了更加精确的描述出一些实际状态

进程调度算法发展史

  1. 先来先服务
    对短作业任务不太友好

  2. 短作业优先
    多长作业任务不太友好

  3. 时间片轮转法与多级反馈队列
    时间片轮转法:先公平的将CPU分给每个人执行
    多级反馈队列:根据作业长短的不同再合理分配CPU执行时间
    目的就是为了能够让单核的计算机也能够做到运行多个程序

重要概念

并发与并行

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

饭店里面有多桌客人(任务)
但是只有一个服务员(CPU)
如何让所有客人都感觉被服务员服务着(CPU执行)
让服务员在多桌客人之间快速的来回切换并保存状态即可
让CPU在多个程序之间利用多道技术来回切换+保存状态

单核肯定能够实现并发 但是不能实现并行!!!

并行
必须同一时间同时运行才可以称之为并行
单核计算机肯定不能实现并行!!! 必须要有多个CPU

多cpu和多核

多核

多内核multicore是指在一枚处理器(processor)中集成两个或多个完整的计算引擎内核。多核系统更易于扩充,并且能够在更纤巧的外形中融入更强大的处理性能,这种外形所用的功耗更低、计算功耗产生的热量更少。

多cpu

多个cpu

高并发与高并行

高并发:我们写的软件可以支持1个亿的并发量
一个亿的用户来了之后都可以感觉到自己被服务着

高并行:我们写的软件可以支持1个亿的并行量
上述话语的言外之意是计算机有一亿个CPU

同步与异步

同步
提交完任务之后原地等待任务的返回结果 期间不做任何事情

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

阻塞与非阻塞

进程三状态图
就绪态:程序之进入运行态之前肯定要处于就绪态
运行态:程序被CPU执行着
阻塞态:程序执行过程中有IO操作

如果想要尽可能的提升程序执行效率
就要想办法让我们的程序一直处于就绪态和运行态(不要有IO操作)

阻塞:阻塞态
非阻塞:就绪态、运行态
ps:以后不需要考虑是哪个状态 知识今天深入学习一下

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

同步异步:用来描述任务的提交方式
阻塞非阻塞:用来描述任务的执行状态

上述两组属于两个不同概念 但是可以结合

同步阻塞:银行排队办理业务 期间不做任何事
同步非阻塞:银行排队办理业务 期间喝水吃东西 但是人还在队列中
异步阻塞:在椅子上坐着 但是不做任何事
异步非阻塞:在椅子上坐着 期间喝水吃东西办公 (程序运行的极致)

posted @ 2022-04-18 22:19  小金同学要加油  阅读(35)  评论(0)    收藏  举报