美文网首页
kernel 阻塞

kernel 阻塞

作者: henry_zeng | 来源:发表于2016-07-30 23:43 被阅读0次

    等待队列#

    • wake_up() 可唤醒处于 TASK_INTERRUPTIBLETASK_UNINTERRUPTIBLE 的进程; wake_up_interruptible() 只能唤醒处于 TASK_INTERRUPTIBLE 的进程
    static ssize_t xx_write(struct file *filp,
        const char __user *buf, size_t size, loff_t *ppos)
    {
        ...
        /* initial element in wait queue, priv = current */
        DECLARE_WAITQUEUE(wait, current);
        /* insert element into wait queue */
        add_wait_queue(&xxx_wait, &wait);
    
        do {
            avail = device_writable(...);
            if (avail < 0) {
                if (filp->f_flags & O_NONBLOCK) {
                    ret = -EAGAIN;
                    goto out;
                }
                set_current_state(TASK_INTERRUPTIBLE);
                schedule();
    
                /* be waken up by signal */
                if (signal_pending(current)) {
                    ret = -ERESTARTSYS;
                    goto out;
                }
            }
        } while(avail < 0);
    
        device_write(...);
    
    out:
        remove_wait_queue(&xxx_wait, &wait);
        set_current_state(TASK_RUNNING);
    
        return ret;
    }
    

    轮询#

    • select(),poll(),epoll() 最终调用驱动中的 poll() 函数

    • 多路复用的文件数量庞大、I/O流量频繁,一般不适用 select()poll() ,宜用 epoll()

    • EPOLLIN 可读; EPOLLOUT 可写

    • EPOLLET edge triggered, 相对于缺省的level triggered, 当fd从未就绪变为就绪时,内核通过epoll告诉用户,并且不会为该fd继续发送更多就绪通知

    • 驱动程序中 poll() 应完成两项任务:

      1. 调用 poll_wait() 将等待队列头部添加到 poll_table
      2. 返回表示能对设备进行无阻塞读写的掩码
    • poll_wait() 本身并不引起阻塞,只是将等待队列头部添加到 poll_table 中,是让唤醒等待队列可以唤醒因 select() 而睡眠的进程

    static unsigned int xxx_poll(struct file *filp, poll_table *wait)
    {
        unsigned int mask = 0;
        struct xxx_dev *dev = flip->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;
    }
    

    相关文章

      网友评论

          本文标题:kernel 阻塞

          本文链接:https://www.haomeiwen.com/subject/xzptsttx.html