曲径通幽论坛

标题: 等待队列结构体 | wait_queue_t [打印本页]

作者: beyes    时间: 2011-3-4 10:20
标题: 等待队列结构体 | wait_queue_t
内核:2.6.24


等待队列中的成员为下面的数据结构:
struct __wait_queue {
    unsigned int flags;
#define WQ_FLAG_EXCLUSIVE    0x01
    void *private;
    wait_queue_func_t func;
    struct list_head task_list;
};



flag 的值或者为 WQ_FLAG_EXCLUSIVE 或者为 0 。WQ_FLAG_EXCLUSIVE 相被独占地唤醒。
private 是一个指针,一般都用来指向等待进程的 task_struct 实例。
func 调用它来唤醒等待进程。
task_list 用作一个链表元素,在等待队列中,就靠它来进行连接。


为使当前进程在一个等待队列中睡眠,要使用 wait_event 配对函数,一般约定:
使用 wait_event() 睡眠,则用 wake_up() 来唤醒;
使用 wait_event_interruptible() 睡眠,则用 wake_up_interruptible() 来唤醒。


内核通常会在向块设备发出传输数据的请求后调用该函数。因为传输不会立即发生,而在此期间又无事可做,所以进程可以睡眠,睡眠后 CPU 会让给其他进程。在等到块设备的数据到达后,必须调用 wake_up() 或 wake_up_interruptible() 函数将睡眠的进程唤醒。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2