IO多路复用

概要

使用非阻塞IO 的应用程序通常使用IO多路复用函数 查询设备是否可以立即访问。IO多路复用 对应的驱动需要实现文件操作的POLL()函数。
IO多路函数调用的时候,每个驱动的poll()接口会调用到,执行IO多路函数的进程被挂到每个驱动的等待队列上,可以被任何一个驱动唤醒。

poll函数实现模板

poll(struct file *file, poll_table *wait)
{
 poll_wait(file,自己定义的等待队列Q,wait); // 向poll_table添加等待队列

 if(数据可读)
  return POLLIN|POLLRDNORM;

 if(数据可写)
  return POLLOUT|POLLWRNORM;

 return 0; // 返回0,调用进程被设置为休眠状态,同时挂到自定义的等待队列Q上,当有数据读写时,
       // 调用wake_up_interruptible(Q)唤醒调用进程,调用进程重新调用poll()方法,返回POLLIN或POLLOUT。
}

用户空间编程接口

select()
poll()
epoll()  // 不会随fd数目增长而降低性能,select和poll则会.

epll机制的用户空间编程接口:
epoll_create()
epoll_ctl()
epoll_wait()

epoll监听事件:
EPOLLET: 设置fd为edge triggered模式。默认是level triggered模式。LT就是内核通知应用fd就绪后,如果应用不执行IO操作,内核会多次发送通知。 而ET模式就是内核通知应用fd就绪后,假设应用已经处理不会再发送通知。
EPOLLONESHOT: 指一次性监听。即监听完fd事件后,如果需要继续监听那么需要再次把fd加入到epoll队列里。

原文地址:https://www.cnblogs.com/bobfly1984/p/14083147.html