IO模型
IO模型
目录
一、IO模型的基础知识
1. 事件驱动模型
通过事件来触发程序的运行,其他时间处于堵塞状态
模型概述
- 有一个事件队列
- 当事件生成时,往队列中添加事件
- 循环取出事件,并调用不同函数
2. 内存空间、进程切换等知识
- 电脑的内存空间分为用户空间(用户软件所用)和内核空间(操作系统所用)
- 进程的切换会有cpu资源的损耗,因为需要保存切换时的任务状态
- 当程序发起堵塞状态时,会主动交出cpu权限
- 文件描述符(fd)是进程打开文件的记录表
- 缓存I/O机制:计算机接收的数据会被先放到内核缓存区,再被拷贝到用户应用程序的内存空间
二、四种I/O模型
1. blocking IO
如果没有接收到数据,该进程会被一直堵塞
2. non-blocking IO
不堵塞进程,但会有个循环询问是否接收到数据的过程(会有数据延迟的缺点)
3. IO mutiplexing(IO多路复用)
可以同时监听多个文件描述符,也就是可以同时监听多个访问的进程(会堵塞进程)
4. Asynchronous IO(异步)
系统不存在堵塞状态
三、python IO多路复用模块介绍
- select:存在最大监听数量的限制;需要循环查看所有的文件描述符,直到找到被修改的(跨平台)
- poll:在select的基础上,取消了监听数量的限制
- epoll:可直接定位被修改的文件描述符(win不支持)
四、Python socket中的应用
- non-bloking IO模型:socket_obj.setblocking(False) # 当存在堵塞状态时报错
- 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秒监听一次
- 水平触发::只要存在某种状态就能触发(socket的触发方式)
- 边缘触发:发生某种状态更改才触发
- 思考作业:一个客户端退出如何不影响其他客户端