【linux学习笔记】非阻塞IO轮询(也叫IO复用)

本文是作者学习Linux的笔记,主要探讨非阻塞IO轮询(IO复用)的概念。非阻塞操作在设备无法访问时,通过轮询或信号实现异步,避免挂起进程。详细分析了内核中的poll机制,包括sys_poll、do_sys_poll等函数,解释了驱动程序如何使用poll函数,并介绍了poll_wait在设备驱动和内核中的作用。
摘要由CSDN通过智能技术生成

本部分是本人学习linux的学习笔记,本人系菜鸟一枚,如有错误欢迎指正。个人邮箱:yaoxitong123@hotmail.com

一. 非阻塞操作

非阻塞操作的进程在不能进行设备操作时,并不挂起,它或者放弃,或者不停地查询,直至可以进行操作为止。这就是我们常说的“轮询”。这是一种比较浪费CPU的方式。但是可以通过信号等方式以异步的形式提高CPU的利用率。

使用非阻塞I/O 的应用程序可借助轮询函数来查询设备是否能立即被访问,用户空间调用select()、poll()和epoll()接口,设备驱动提供poll()函数。设备驱动的poll()本身不会阻塞(但是在内核中会休眠,后面会看到),但是poll()、select()和epoll()系统调用则会阻塞地等待文件描述符集合中的至少一个可访问或超时。

(今天在看 设备驱动开发详解 的时候看懵了,poll机制是阻塞且同步的操作,为什么在这里变成了非阻塞的了呢?后来想想明白了:原因是select函数返回之后再去调用相应的系统调用,实现的就是非阻塞操作…哈哈哈哈)

二. 设备驱动中的轮询编程

设备驱动中poll()函数的原型是:

unsigned int (*poll) (struct file *filp, struct poll_table *wait);

第一个参数为file结构体指针,第二个参数为轮询表指针。
该函数进行两项工作:
(1) 对可能引起设备文件状态变化的等待队列调用poll_wait()函数,将对应的等待队列添加到poll_table
(2) 返回表示是否能对设备进行无阻塞读、写访问的掩码。
返回值
说明

POLLIN 	普通或优先级带数据可读
POLLRDNORM 	普通数据可读
POLLRDBAND 	优先级带数据可读
POLLPRI 	高优先级数据可读
POLLOUT 	普通数据可写
POLLWRNORM 	写普通数据不会导致阻塞
POLLWRBAND 	优先级带数据可写
POLLERR 	发生错误
POLLHUP 	发生挂起
POLLNVAL 	描述字不是一个打开的文件

用于向poll_table注册等待队列的poll_wait()函数原型如下:

static inline void poll_wait(struct file *filp, wait_queue_head_t *queue, poll_table *wait)
{
   
	if(wait && wait->qproc && queue)
		wait->qproc(filp, queue, wait);
}

作用:
将当前进程添加到wait参数指定的等待队列(poll_table)中

设备驱动中poll()函数的典型模板

static unsigned int xxx_poll(struct file *filp, poll_table *wait)
 {
   
	unsigned int mask = 0;
	struct xxx_dev *dev = filp->private_data; /* 获得设备结构体指针 */
	...
	poll_wait(filp, &dev->r_wait, wait); /* 加入读等待队列 */
	poll_wait(filp, &dev->w_wait, wait); /* 加入写等待队列 */

	if (...) /* 可读 */
		mask |= POLLIN | POLLRDNORM; /* 标示数据可获得(对用户可读) */

	if (...) /* 可写 */
		mask |= POLLOUT | POLLWRNORM; /* 标示数据可写入 */
	...
	return mask;
}
三. 从内核态分析poll机制

从应用程序直接调用poll函数,系统会走以下流程

app:poll() / select()
kernel:
	SYSCALL_DEFINE3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值