Python-进程

UDP协议

UDP(User Datagram Protocol,用户数据报协议)是不可靠的、不需要建立双下通道,数据传输效率高,但是可能会丢失。UDP协议类似于发短信:发了之后不管你看不看,只要发了就行。

服务端

import socket
server = socket.socket(type=socket.SOCK_DGRAM)  # 自己指定UDP协议(默认是TCP协议)
server.bind(('127.0.0.1', 8080))
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)
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)

基于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)
    

操作系统的发展史

1.穿孔卡片

优势:一个人独占电脑
劣势:CPU利用率极低

2.联机批处理系统

一次性可以录入多个用户指令、缩短了CPU等待的时间、提高了CPU的利用率

3.脱机批处理系统

是现代计算机核心部件的雏形、提高CPU的利用率

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

img

多道技术

多道技术的出现就是为了提升CPU的利用率,降低程序的等待时间。目前我们研究并发都是以计算机是单核(一个CPU)的情况下。

串行

多个任务排队执行,总耗时就是多个任务完整时间叠加多道.
例子:
    做饭需要30min
    洗衣需要50min
    烧水需要20min
串行总共需要耗时:30min + 50min + 20min=100min

多道

利用空闲提前准备,缩短总的执行时间并且还能提高CPU利用率.
空间上的复用:多个任务共用一套计算机硬件
时间上的复用:切换+保存状态
CPU在两种情况下会被拿走:
    1.程序遇到IO操作,CPU自动切走运行其他程序
    2.程序长时间占用CPU,系统发现之后也会强行切走CPU,保证其他程序也可以使用
例子:
    做饭需要30min
    洗衣需要50min
    烧水需要20min
多道总共需要耗时:50min

进程理论

程序和进程的概念

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

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

产生进程的概念就是为了更加精确的描述出一些实际状态。

img

进程调度算法发展史

1.先来的先开始服务

比如说目前有3个进程,第一个进程需要1个小时,第二个和第三个进程都需要2秒钟,先到先服务,只能等第一个进程执行完后才会开始第二个第三个进程,对短作业任务不太友好。

2.短作业优先

如果说有10000个短作业进程每个都需要1秒种,而排在10000个短作业后的一个长作业需要半个小时,只能等10000个短作业执行完后才会执行长作业,多长作业任务不太友好

3.时间片轮转法与多级反馈队列

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

并发与并行

并发

看上去像同时在执行就可以称之为是并发.
原理:让CPU在多个程序之间利用多道技术来回切换+保存状态.
'单核肯定能够实现并发 但是不能实现并行!!!''

并行

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

高并发与高并行

高并发:我们写的软件可以支持1个亿的并发量,一个亿的用户来了之后都可以感觉到自己被服务着.
高并行:我们写的软件可以支持1个亿的并行量,上述话语的言外之意是计算机有一亿个CPU.

同步与异步

同步

提交完任务之后原地等待任务的返回结果,期间不做任何事情.
比如说用洗衣机洗衣服,洗衣服期间一直在等待洗衣机结束清洗,其他什么事情都不做,等洗衣机结束清洗了再去做其他的事情。

异步

提交完任务之后不愿地等待任务的结果,直接去做其他事情,有结果自动提醒.
也可以用洗衣机洗衣服来举例子,就是在洗衣机洗衣服的期间去做其他的事情,洗衣机结束完后会滴一声,提醒洗衣机清洗任务完成,然后我们再把衣服拿去晒。

阻塞与非阻塞

一个程序被执行是存在三个状态的。

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

想要提升程序执行的效率,就要想办法让我们的程序一直处于就绪态和运行态。

阻塞就是阻塞态,非阻塞就是就绪态和运行态。

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

同步异步:用来描述任务的提交方式

阻塞非阻塞:用来描述任务的执行状态

我们可以将上面2个不同的概念进行结合,实现程序运行不同效果。

同步阻塞:银行排队办理业务 期间不做任何事
同步非阻塞:银行排队办理业务 期间喝水吃东西 但是人还在队列中
异步阻塞:在椅子上坐着 但是不做任何事
异步非阻塞:在椅子上坐着 期间喝水吃东西办公	(程序运行的极致)
posted @ 2022-04-18 18:28  早安_1207  阅读(41)  评论(0)    收藏  举报
返回顶端