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队列里。