第二十七章:并发编程

UDP协议 

用户数据报协议,是OSI模型中属于传输层的协议

提供,不可靠的,不要求顺序的,数据量小的,速度快的传输服务

不可靠:

发送完成后不需要确认信息 并且立即删除缓存中的数据

不要求顺序:

当一个数据较大时 会分为多个数据报来传输,对方无法获知数据的顺序,以及是否完整

数据量较小的:

数据越大丢包的可能性越高 ,建议的数据量不要超过1472

速度快:

相对于TCP而言快很多 不需要确认信息 ,也不需要建立链接

通讯流程

如果TCP比喻为手机打电话的过程 那么UDP可以看做是对讲机  

1.买机器    创建UDP的socket

2.固定频道 bind一个ip和端口

3.收发数据      recvfrom   sendto

 

接收

1.买机器    创建UDP的socket

2.收发数据      recvfrom   sendto

注意 不能先收    要收数据 必须明确端口号  没有端口号是不可能使用网络服务的

 

 

TCP  与 UDP 的其他区别

1.没有连接 

2.不会粘包     每次发送都是一个独立的数据包   

 

TCP 对数据完整性要求较高 : 在线支付  ,文字信息

UDP: 对数据不要求完整性 但是要快 :  视频 语音 游戏 

DNS

域名解析服务器 

域名 就是一串有规律的字符串  ,用于绑定IP,目的是为了方便记忆

域名解析服务器    就是帮你将域名转换为ip地址 

本质就是一个数据库  里面存的就是域名和ip对应关系  

一台机器性能有限

分为

根域名服务器        只存储定义域名服务器的信息 

顶级域名服务器 只存储二级域名服务器的信息 

二级域名服务器    二级存三级

三级域名   三级可以存四级  通常直接存储具体的ip信息 

.....................

本地DNS  用于加速解析   

 

自己搭建DNS 的作用

1.CDN     内容分发网络       就是在你的周围建立更多镜像服务   

2.集群  

操作系统

也是一个软件,

受保护的不能随意修改 

代码量巨大  内核在500万以上

长寿 ,一旦完成一般不改

linux是脱袜子  将(shell 保留解释权!)  移植到minux上 结合产生的

操作系统的作用:

1.将复杂丑陋的硬件细节隐藏起来,提供了简单的调用接口

2.将应用程序对于硬件的竞争变的有序 

 

操作系统发展史 

1.第一带计算机   真空管和穿孔卡片  没有进程 没有操作系统  

2.第二代计算机  7094 1401    晶体管  批处理系统

输入输出  以及计算设备 不能互联  需要人参与    一批一批的处理   开发效率慢  并且串行执行

3.第三代计算机    集成电路 与多道技术

多终端联机  spooling   同一台机器既能进行科学计算  又能做字符处理       通用计算机

多道技术   解决串行导致的效率低下问题

多用户终端    可以同时为多个用户提供服务  每个用户以为自己独享一台计算机  

4.第四代   个人电脑

大规模使用了集成电路,大多都提供了GUI界面 

多道技术  

产生背景 ,所有程序串行 导致资源浪费  

目的是让多个程序可以并发执行  , 同时处理多个任务  

关键技术

空间复用

指的是 同一时间 内存中加载多个不同程序数据,

每个进程间内存区域相互隔离,物理层面的隔离 

时间复用  切换 + 保存

切换条件:

1.一个进程执行过程中遇到了IO操作  切换到其他进程

2.运行时间过长,会被操作系统强行剥夺执行权力  

单纯的切换不够,必须在切换前保存当前的状态,以便于恢复执行 

 

进程

一个正在被运行的程序就称之为进程,是程序具体执行过程,一种抽象概念

进程来自于操作系统 

 

 

多进程

进程和程序的区别 

程序就是一堆计算机可以识别文件,程序在没有被运行就是躺在硬盘上的一堆二进制

运行程序时,要从硬盘读取数据到内存中,CPU从内存读取指令并执行 ,

一旦运行就产生了进程   

一个程序可以多次执行 产生多个进程,但是进程之间相互独立

当我们右键运行了一个py文件时 ,其实启动的是python解释器,你的py文件其实是当作参数传给了解释器  

 

阻塞  非阻塞   并行  并发   (重点)

阻塞 : 程序遇到io操作是就进入了阻塞状态    

本地IO input      print     sleep    read  write      

网络IO recv  send

非阻塞: 程序正常运行中 没有任何IO操作   就处于非阻塞状态 

阻塞 非阻塞 说的是程序的运行状态 

并发: 多个任务看起来同时在处理 ,本质上是切换执行     速度非常快   

并行: 多个任务真正的同时执行    必须具备多核CPU  才可能并行 

并发  并行  说的是 任务的处理方式

三种状态的切换

 

程序员永恒的话题

提高效率

根本方法就是让程序尽可能处于运行状态

减少IO  尽可能多占用CPU时间    

缓冲区就是用于减少IO操作的 

 

 

进程的创建以及销毁 了解

 

菜谱: 就是程序 

做菜的过程:就是进程

 

 

 

 

进程的两种使用方式 (重点)

1.直接实例化Process  ,将要执行任务用target传入

  

2.继承Process类 ,覆盖run方法  将任务放入run方法中 

import os
from multiprocessing import  Process
class MyProcess(Process):
   def __init__(self,name):
       super().__init__()
       self.name = name
   # 继承Procee覆盖run方法将要执行任务发到run中
   def run(self):
       print(self.name)
       print("子进程 %s running!" % os.getpid())
       print("子进程 %s over!" % os.getpid())

if __name__ == '__main__':
   # 创建时 不用再指定target参数了
   p = MyProcess("rose")
   p.start()
   print("父进程over!")

 

join函数   (重点)

 

Process的对象具备一个join函数

用于提高子进程优先级 ,使得父进程等待子进程结束 

 

僵尸与孤儿进程  了解

孤儿进程

指的是,父进程先结束 ,而子进程还在运行着,

孤儿进程无害,有 其存在的必要性

例如:qq开启了浏览器,qq先退出了  浏览器应该继续运行 

孤儿进程会被操作系统接管   

 

僵尸进程

值得是,子进程已经结束了,但是操作系统会保存一些进程信息,如PID,运行时间等,此时这个进程就称之为僵尸进程

僵尸进程如果太多将会占用大量的资源,造成系统无法开启新新进程

linux 中有一个wai/waitpid 用于父进程回收子进程资源

python会自动回收僵尸进程 

 

 

常用属性

# p.join() # 等待子进程结束
# p.terminate() # 终止进程
# print(p.name) # 进程的名称
# print(p.is_alive()) #是否存活
# p.terminate() # 与start一样 都是给操作系统发送指令 所以会有延迟
# print(p.is_alive())
# print(p.pid)
# print(p.exitcode) # 获取退出码

 

 

 

 

猜你喜欢

转载自www.cnblogs.com/haojunliancheng/p/10956358.html