IO模型

IO模型


一、IO模型的基础知识

1. 事件驱动模型

通过事件来触发程序的运行,其他时间处于堵塞状态

模型概述

  • 有一个事件队列
  • 当事件生成时,往队列中添加事件
  • 循环取出事件,并调用不同函数

2. 内存空间、进程切换等知识

  • 电脑的内存空间分为用户空间(用户软件所用)和内核空间(操作系统所用)
  • 进程的切换会有cpu资源的损耗,因为需要保存切换时的任务状态
  • 当程序发起堵塞状态时,会主动交出cpu权限
  • 文件描述符(fd)是进程打开文件的记录表
  • 缓存I/O机制:计算机接收的数据会被先放到内核缓存区,再被拷贝到用户应用程序的内存空间

二、四种I/O模型

1. blocking IO

如果没有接收到数据,该进程会被一直堵塞
image

2. non-blocking IO

不堵塞进程,但会有个循环询问是否接收到数据的过程(会有数据延迟的缺点)
image

3. IO mutiplexing(IO多路复用)

可以同时监听多个文件描述符,也就是可以同时监听多个访问的进程(会堵塞进程)
image

4. Asynchronous IO(异步)

系统不存在堵塞状态
image

三、python IO多路复用模块介绍

  1. select:存在最大监听数量的限制;需要循环查看所有的文件描述符,直到找到被修改的(跨平台)
  2. poll:在select的基础上,取消了监听数量的限制
  3. epoll:可直接定位被修改的文件描述符(win不支持)

四、Python socket中的应用

  1. non-bloking IO模型:socket_obj.setblocking(False) # 当存在堵塞状态时报错
  2. IO 多路复用
import select
inputs = [sk1,sk2]
r_list,w_list,e_list = select.select(inputs,[],[],3)	# r返回的是已连接的socket对象序列;第一个参数列表放的是可供连接的socket对象
# select中第1个参数表示inputs中发生变化的句柄放入r_list。
# select中第2个参数表示[]中的值原封不动的传递给w_list。
# select中第3个参数表示inputs中发生错误的句柄放入e_list。
参数1表示1秒监听一次
  1. 水平触发::只要存在某种状态就能触发(socket的触发方式)
  2. 边缘触发:发生某种状态更改才触发
  3. 思考作业:一个客户端退出如何不影响其他客户端
posted @ 2021-04-03 12:10  notesForKai  阅读(47)  评论(0编辑  收藏  举报