linux 内核 poll机制的问题

天王盖地虎626 发布于 2018/11/14 10:14
阅读 78
收藏 0
do_poll(nfds, head, &table, end_time);
            for(;;)
            {
                for (; pfd != pfd_end; pfd++) //查询多个驱动程序
                {
                    if (do_pollfd(pfd, pt))  -> mask = file->f_op->poll(file, pwait);return mask;
                    { //do_pollfd函数相当于调用驱动里面的forth_drv_poll函数,下面另外再进行分析,返回值mask非零,count++,记录等待事件发生的进程数
                        count++;
                        pt = NULL;
                    }
                }
                 
                if (count || timed_out) //若count不为0(有等待的事件发生了)或者timed_out不为0(有信号发生或超时),则推出休眠
                    break;
                 
                //上述条件不满足下面开始进入休眠,若有等待的事件发生了,超时或收到信号则唤醒
                poll_schedule_timeout(wait, TASK_INTERRUPTIBLE, to, slack)
            }

--------------------- 

从代码上,我们可以分析,如果内侧的for循环一直没有执行,也就是count 一直是0,timed_out也没有超时,也就是说,会执行
 poll_schedule_timeout(wait, TASK_INTERRUPTIBLE, to, slack)//进行休眠

因为这个函数是在外侧for循环中的,这样,岂不是导致多次执行

 poll_schedule_timeout函数嘛?不清楚会有什么后果?

加载中
0
彭添
彭添

没用过,让我来推测一波:poll_schedule_timeout会阻塞直到下次event到来,这样的话就不会一直for,因为在没有event来的时候你再次循环也没用

0
天王盖地虎626
天王盖地虎626

引用来自“彭添”的评论

没用过,让我来推测一波:poll_schedule_timeout会阻塞直到下次event到来,这样的话就不会一直for,因为在没有event来的时候你再次循环也没用

我的理解,休眠是挂起要执行相应的进程,而不影响外层for循环的

彭添
彭添
接下面那条:就是说,从进程状态来讲,这个函数根本没阻塞进程,但是从CPU的角度来将,这个进程已经被睡眠了
彭添
彭添
内核里面还有一种机制,就是schedule,主动让出CPU调度,在这种情况下,执行了这个函数这个进程不会再占用CPU时间片,那么等下一次调度的时候就继续for,就是说再次for的时候也可能是空的。刚刚看了下代码,这个函数底层是调用设置为非TASK_RUNNING,并且设置为可抢占, 然后调用schedule(),这样的话调用这个函数后内核会把这个进程移出运行队列,直到下一次调度或者时间到了
返回顶部
顶部