内核Poll机制
Poll机制
Poll机制引入
休眠-唤醒机制来等待某个事件产生。完全取决的外部事件,可能等待的时间可能太长。为了避免等待时间过长,
增加超时时间,就是对应的poll机制。
具体流程:
使用poll机制,查询驱动程序是否有数据。
进入内核态,如果有数据,立刻返回
如果当时驱动中没有数据,内核程序进入休闲状态。
如果按键按下,驱动程序的中断被调用,记录数据,唤醒休眠程序,在调用read函数。
但是时间如果超时,也会唤醒内核态休眠的程序。
根据poll返回的值,判断是否有数据,然后调用对应的函数:read函数。
Poll流程
Poll机制执行说明:
App执行poll函数,进入内核态,调用drv_poll函数。
如果此时没有驱动数据,drv_poll把任务挂入等待队列wq。等中断发生或者超时时间到达,去唤醒该任务,判断有无驱动数据,然后返回用户空间。
没有数据,休眠一会,在休眠过程中中断发生,任务被唤醒,返回用户空间。
超时时间一到,任务被唤醒,判断有否数据,并返回用户空间。
在用户空间,根据poll返回的数值,判断是否读取read函数看,获取底层产生的硬件数据。
注意事项
drv_poll是把任务挂入到队列wq。不是在drv_poll中进入休眠,在drv_poll之后进入休眠
app调用poll,有机会调用drv_poll函数2次
任务被唤醒有2种:1.中断唤醒。2 超时时间到达。
App根据drv_poll返回的数,判断是否调用read函数。
drv_poll函数功能
把当前任务挂入wq:
poll_wait:把任务挂入到等待队列。
返回设备状态:
App调用poll,用的参数:与没有数据可以读:POLLIN。有没有空间可以写数据:POLLOUT。
drv_poll需要返回自己的状态:POLLIN或者POLLOUT。
监控类型:
事件类型 |
说明 |
POLLIN |
有数据可读 |
POLLRDNORM |
等同于POLLIN |
POLLRDBAND |
Priority band data can be read,有优先级较较高的“band data”可读 Linux系统中很少使用这个事件 |
POLLPRI |
高优先级数据可读 |
POLLOUT |
可以写数据 |
POLLWRNORM |
等同于POLLOUT |
POLLWRBAND |
Priority data may be written |
POLLERR |
发生了错误 |
POLLHUP |
挂起 |
POLLNVAL |
无效的请求,一般是fd未open |