zoukankan      html  css  js  c++  java
  • poll机制

    poll机制概述:当应用程序调用poll函数,进程会休眠一段时间,等待事件发生;休眠期间事件发生就被唤醒,poll函数立即返回,返回值为1;如果超过设定的休眠时间事件还是没发生,poll函数也会返回,返回值为0。

    对于系统调用poll或者select,他们对应的内核函数都是sys_poll,分析sys_poll函数,就可以了解poll机制。

    sys_poll位于fs/select.c文件中。

    sys_poll的函数调用如下:

    sys_poll

      do_sys_poll

        do_poll(nfds, head, &table, timeout)

          

    sys_poll功能说明:

      最终调用了do_poll函数,在for{;;}循环里判断当前“被poll”的设备文件中(可能不止一个),是否由相应的事件发生,如果有则count++

      接下来会判断是否要跳出for{;;}的死循环,跳出的条件有:count非零或者超时(先忽略第三个),如果都没发生,则会休眠设定的时间再进入for{;;}循环,判断事件有没有产生、休眠有没有超时……

      do_pollfd函数里调用了驱动程序里我们自己定义的xxx_poll函数:

    自己实现的xxx_poll函数:

     

    其中,poll_wait函数是把当前进程加入休眠的等待队列里,但不会立即休眠,休眠是在do_poll函数里进行的。

    总结一下poll机制的流程:

    1、应用程序调用poll系统调用

    2、poll会调用我们自己在驱动程序中写的xxx_poll函数

    3、在xxx_poll函数中把当前进程加入内核中的休眠等待队列,并判断等待事件有没有产生。

    4、在系统调用poll中判断我们自己写的xxx_poll函数的返回值

      如果xxx_poll函数返回值非0,说明事件产生,系统调用poll函数立即返回,返回值为非0;

      如果xxx_poll函数返回值非0,说明事件没产生,系统调用poll继续休眠,若休眠超时则返回,返回值为0。

     当按钮按下,会进入中断,在中断中设置ev_press = 1并且唤醒进程:

     这里必须在中断中唤醒进程,如果不唤醒,按下按键时系统调用poll函数可能还在执行5s(假设设了5秒)的休眠,无法立即返回。

  • 相关阅读:
    Java五
    Java I/O流
    第二周学习笔记
    第一周学习笔记
    第六次作业修改版
    第六周作业
    java第四次作业(补)
    java第五次作业
    Java第三次作业
    java第二次作业
  • 原文地址:https://www.cnblogs.com/physworld/p/14835330.html
Copyright © 2011-2022 走看看