美文网首页
阻塞IO与多路复用

阻塞IO与多路复用

作者: 遇明不散 | 来源:发表于2019-04-22 14:25 被阅读0次

IO操作

在内存中存在数据交换的操作都可以认为是IO操作

# 和终端交互 : input   print
# 和磁盘交互 : read    write
# 和网络交互 : recv    send
IO密集型程序

在程序执行过程中存在大量IO操作,而cpu运算操作较少,消耗cpu较少,运行效率较低

计算密集型程序(cpu密集型程序)

在程序执行中cpu运算较多,IO操作相对较少,消耗cpu大,运行速度快

阻塞IO与非阻塞IO

阻塞IO是IO的默认形态,是效率较低的一种IO情形

阻塞情况
  • 因某种条件没有达成造成的阻塞
    例如:accept,input,recv
  • 处理IO数据传输时间较长形成的阻塞
    例如:网络传输过程,文件读写过程
非阻塞IO
  • 通过修改IO事件的属性,使其变为非阻塞状态。(让一些条件阻塞函数不再阻塞)
  • 非阻塞IO往往和循环判断一起使用
设置非阻塞状态

将套接子对象设置为非阻塞状态,当有客户端连接进来时,即可出来客户端请求

超时检测

将原本阻塞的函数设置一个最长阻塞时间。如果时间内条件达成则正常运行,如果仍然阻塞则视为超时,继续向下运行或产生异常。

# 将套接字设置为非阻塞状态
s.setblocking(False)

# 设置套接字的超时时间
s.settimeout(sec)

IO多路复用

同时监控多个IO事件,当哪个IO事件准备就绪就执行哪个IO事件。以此形成可用同时操作多个IO的并发行为,避免一个IO阻塞,造成所有IO都无法执行。
IO事件准备就绪:一种IO必然要发生的临界状态,当IO准备就绪后,就不需要人为的控制,计算机自动完成后续操作。

IO多路复用的编程实现
  • 将IO设置为关注IO
  • 将关注IO提交给内核监测
  • 处理内核给我们反馈的准备就绪的IO
具体方案
  • select --> windows linux unix
  • poll --> linux unix
  • epoll --> linux unix
select方案
import  select

# rs,ws,xs = select(rlist, wlist, xlist[, timeout])
# 功能: 监控IO事件,阻塞等待IO事件发生
# 参数:
#      rlist    列表   存放我们要监控等待处理的IO事件
#      wlist    列表   存放我们要主动操作的IO事件
#      xlist    列表   我们要关注出错处理的IO事件
#      timeout  超时时间
# 返回值:
#      rs  列表   rlist中准备就绪的IO
#      ws  列表   wlist中准备就绪的IO
#      xs  列表   xlist中准备就绪的IO

# 注意 : 
#   wlist中如果有IO事件则select立即回返回为ws
#   在处理IO过程中不要处理一个客户端长期占有服务端使服务端无法运行到select的情况
#   IO多路复用占用计算机资源少,IO效率高
poll方案
  • 创建 poll 对象
import  select
p = select.poll()
  • 通过文件描述符找到对应的IO对象
# poll 的返回值没有IO对象
# 用字典以键值对的形式保存文件描述符对应的IO对象
{s.fileno() : s}
  • 添加注册事件
# 添加注册事件
p.register(s,POLLIN | POLLERR)
# 常见事件:
#    POLLIN   POLLOUT  POLLERR  POLLHUP  POLLNVAL
#     rlist    wlist    xlist    断开     无效数据

# 从关注事件中移除
p.unregister(s)
  • 阻塞等待IO发生
# 功能:阻塞等待IO发生
# 返回值:
#   events 是一个列表,列表中给每一个元素都是一个元组,代表一个发生的IO事件
#   [(fileno,event),(),()....]
#      fileno:就绪IO的文件描述符          
#      event:具体就绪事件
events = p.poll()
  • 处理具体的IO事件
epoll方案

使用方法基本与poll方法相同

  • 将生产对象 poll() 改为 epoll()
  • 将所有 poll 对象事件改为 epoll 对象事件
poll与epoll的区别
  • epoll 的效率要比pollselect
  • epoll 的事件触发方式更多

相关文章

  • 阻塞I/O、非阻塞I/O和I/O多路复用

    看概念:阻塞I/O、非阻塞I/O和I/O多路复用 - skiler - 博客园 图解阻塞io和非阻塞io及多路复用...

  • 细谈Select,Poll,Epoll

    阻塞 io 模型 blocking IO非阻塞 io 模型 nonblocking IOio多路复用模型 IO m...

  • IO模型

    阻塞IO 非阻塞IO 多路复用IO 信号驱动IO 异步IO 吃午饭之阻塞IO 下单之后,排队等在取餐口等待厨师做好...

  • 1.Nette入门第一章——IO演进

    1. IO 基础 1.1. linux网络IO模型 阻塞IO模型 非阻塞IO模型 IO多路复用模型(NIO) 信...

  • netty学习主目录

    学习基础 四种io模型(同步阻塞io,同步非阻塞io,io多路复用(select/poll,epoll),异步io...

  • Netty和NIO-未完待续

    linux底层支持bio(阻塞io),nio(多路复用io),aio(异步非阻塞io),信号io等多种方案; jd...

  • 五种 IO 模型

    五种 IO 模型 参考链接 一共有五种 IO 模型 阻塞 IO 非阻塞 IO 多路复用 IO 信号驱动 IO 异步...

  • 使用python编写一个异步非阻塞模块

    异步IO请求的本质则是【非阻塞Socket】+【IO多路复用】

  • IO多路复用

    IO模型 阻塞IO只能阻塞一个IO操作,IO复用模型能阻塞多个IO操作,所以才叫多路复用读数据: 等待数据到达 将...

  • 2.Netty框架-线程模型(Reactor线程模型)

    一、了解IO多路复用技术 IO多路复用技术,将多个IO的阻塞复用到一个select的阻塞上,从而是系统在单线程的情...

网友评论

      本文标题:阻塞IO与多路复用

      本文链接:https://www.haomeiwen.com/subject/uclcgqtx.html