阻塞与非阻塞io

                                 等待队列

 等待队列是一个双向列表,有队列头与队列节点组成。将休眠的进程挂载到等待队列节点上。wait_queque_head_t 队列头。DECLARE_W AIT_QUEUE_HEAD()宏可以作为定义并初始化等待队列头, 运行期间可以采用wait_queue_head_t my_queue定义一个等待队列投,并采用init_waitqueue_head(&my_queue)将其初始化。

wait_queque_t 等待队列节点。init_wait_queue_entry 函数初始化一个节点。DECLARE_WAITQUEUE(name, tsk) 定义yu初始化节点。add_wait_queue()用于将等待队列 wait 添加到等待队列头 q 指向的等待队列链表中, 而 remove_wait_queue()用于将等待队列 wait 从附属的等待队列头 q 指向的等待队列链表中移除。

                                            等待队列的核心操作  wait 与wakeup

等待事件:

wait_event(queue, condition)
wait_event_interruptible(queue, condition)
wait_event_timeout(queue, condition, timeout)
wait_event_interruptible_timeout(queue, condition, timeout)

唤醒队列

void wake_up(wait_queue_head_t *queue);
void wake_up_interruptible(wait_queue_head_t *queue);

在等待队列上睡眠

sleep_on(wait_queue_head_t *q );
interruptible_sleep_on(wait_queue_head_t *q );

                                            同步阻塞io

 

 

 

 

                                                            异步阻塞io 

设备驱动中 poll()函数的原型如下:
unsigned int(*poll)(struct file * filp, struct poll_table* wait);
第一个参数为 file 结构体指针,第二个参数为轮询表指针。这个函数应该进行以下两项工作。
l 对可能引起设备文件状态变化的等待队列调用 poll_wait()函数,将对应的等待队列头添加到 poll_table。
l 返回表示是否能对设备进行无阻塞读、写访问的掩码。
关键的用于向 poll_table 注册等待队列的 poll_wait()函数的原型如下:
void poll_wait(struct file *filp, wait_queue_heat_t *queue, poll_table * wait);
poll_wait()函数的名称非常容易让人产生误会,以为它和 wait_event()等一样,会阻塞地等待某事件的发生,其实这个函数并不会引起阻塞。poll_wait()函数所做的工作是把当前进程添加到 wait 参数指定的等待列表(poll_table)中。

 

posted on 2019-12-17 10:51  yangjunhe  阅读(189)  评论(0)    收藏  举报