Linux阻塞与非阻塞IO、轮询与异步通知编程
阻塞与非阻塞IO
-
阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作。被挂起的进程进入睡眠状态,被从调度器的运行队列移走,直到等待的条件被满足。而非阻塞操作的进程在不能进行设备操作时,并不挂起,它要么放弃,要么不停地查询,直至可以进行操作为止。
-
等待队列的Linux驱动代码示例:
static ssize_t xxx_write(struct file *file, const char *buffer, size_t count, loff_t *ppos) { ... DECLARE_WAITQUEUE(wait, current); /* 定义等待队列元素 */ add_wait_queue(&xxx_wait, &wait); /* 添加元素到等待队列 */ /* 等待设备缓冲区可写 */ do { avail = device_writable(...); if (avail < 0) { if (file->f_flags &O_NONBLOCK) /* 非阻塞 */ { ret = -EAGAIN; goto out; } __set_current_state