LDD高级字符驱动程序-poll,epoll,select

2 篇文章 0 订阅
1 篇文章 0 订阅

1,poll,epoll,select用途基本一样,经常用在需要操作多个输入和输出流而又不阻塞与其中任何一个输入或输出流的进程中(关键在于多个,如果数量是一个作用体现不是很明显,如果文件描述符个数为一个可以使用异步通知操作);

       底层都是通过 int (*poll)(struct file *filp,poll_table *table);函数来实现的,poll函数是作为struct file_operations 实例对象的成员函数指针poll来调用的;


2,模块中poll函数的实现由关键的两大步骤来完成,由内核系统调用sys_poll来回调被poll监控的文件描述符对应的模块中的poll函数(通过struct file_operations 实例对象的成员函数指针分量来调用);

     step 1,调用void poll(struct file *filp,wait_queue_head_t *wait_queue,poll_table *table);函数将用户空间调用libc库中poll函数的进程初始化的等待队列入口项加入等待队列;如果被监控的文件描述符没有一个能够执行无阻塞操作,则在sys_poll系统调用函数中通过count变量综合评估之后,调用用户空间poll函数的进程休眠等待,等待在每一个文件描述符对应模块中的等待队列上,如果有某一个或多个文件描述符能够进行无阻塞操作,则唤醒文件描述对应模块的相应等待队列上的所有非独占进程及一个独占进程;调用了用户空间poll函数的进程(调用了sys_poll系统调用的进程)返回到用户空间进行汇报一个或多个文件描述符能够进行无阻塞操作,然后进程进行相应的无阻塞操作;


    step 2,根据是否满足阻塞条件返回满足与不满足相对应的原语掩码,sys_poll系统调用遍历回调每一个文件描述符对应的模块poll函数之后得到这个返回值,最后通过对所有的掩码和对应文件描述符的请求掩码进行按位与(&)运算之后,综合得到能够进行无阻塞操作的数量count,如果count大于0则poll进程(调用了sys_poll系统调用的进程)不休眠直接返回到用户空间汇报,如果count小于等于0则poll进程休眠等待,等待在每一个文件描述符对应模块的等待队列上;


上述两部核心关键操作,是linux内核源代码中的关键点,这些点通过内核源代码贯穿在一起;


用户空间请求和linux内核空间返回的10(11)个原语掩码如下:

   ·a,读操作相关的:POLLIN,POLLRDNORM,POLLRDHAND(频带读),POLLPRI(高优先级读,select函数中解析为错误),

    b,写操作相关的:POLLOUT,POLLWTNORM,POLLWTHAND,

    c, 错误相关的   : POLLERR,POLLHUP(select函数中解析为读),POLLINTR.  


3,poll,epoll,select区别于联系:  功能相同为什么会出现不同形式?这三个函数是操作系统不同时期的不同版本实现,

             a,select 是Unix实现,根据文件描述符对应模块的阻塞位(O_NONBLOCK)是否设置,可以调用了select函数进程本身实现无阻塞操作;

             b,poll是System V实现,

             c,epoll是linux2.5之后实现,提升了poll的性能,epoll将poll文件描述符数量扩展到上千个(poll函数会将poll_table 数据结构释放掉,而epoll不会将poll_table(数据结构不太确定?) 数据结构释放以便重复利用从而提高性能)。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值