`
emowuyi
  • 浏览: 1475477 次
文章分类
社区版块
存档分类
最新评论

LINUX 等待队列

 
阅读更多

(转载) bojan 收录于2010-10-09 阅读数: 公众公开
我也要收藏
在Linux驱动程序中,可以使用等待队列(wait queue)来实现阻塞进程的唤醒。wait queue很早就作为一种基本的功能单位出现在Linux内核里了,它以队列位基础数据结构,与进程调度机制紧密结合,能够用于实现内核中异步事件通知机制。等待队列可以用来同步对系统资源的访问。(信号量在内核中也依赖等待队列来实现).

Linux-2.6提供如下关于等待队列的操作:
(1) 定义"等待队列头"
wait_queue_head_t my_queue;


(2) 初始化"等待队列头"
init_waitqueue_head(&my_queue);
定义和初始化的快捷方式:
DECLARE_WAIT_QUEUE_HEAD(my_queue);


(3) 定义等待队列
DECLARE_WAITQUEUE(name, tsk);
定义并初始化一个名为name的等待队列(wait_queue_t);


(4) 添加/移除等待队列
void fastcall add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);
void fastcall remove_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);
add_wait_queue()用于将等待队列wait添加到等待队列头q指向的等待队列链表中,而remove_wait_queue()用于将等待队列wait从附属的等待队列头q指向的等待队列链表中移除。


(5) 等待事件
wait_event(queue, condition);
wait_event_interruptible(queue, condition);
wait_event_timeout(queue, condition, timeout);
wait_event_interruptible_timeout(queue, condition, timeout);
等待第一个参数queue作为等待队列头的等待队列被唤醒,而且第二个参数condition必须满足,否则阻塞。wait_event()和wait_event_interruptible()的区别在于后者可以被信号打断,而前者不能。加上timeout后的宏意味着阻塞等待的超时时间,以jiffy为单位,在第三个参数的timeout到达时,不论condition是否满足,均返回。


(6) 唤醒队列
void wake_up(wait_queue_head_t *queue);
void wake_up_interruptible(wait_queue_head_t *queue);
上述操作会唤醒以queue作为等待队列头的所有等待队列对应的进程。
wake_up() <---> wait_event()
wait_event_timeout()
wake_up_interruptible() <---> wait_event_interruptible()
wait_event_interruptible_timeout()

wake_up()可以唤醒处于TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE的进程
wake_up_interruptble()只能唤醒处于TASK_INTERRUPTIBLE的进程。


(7) 在等待队列上睡眠
sleep_on(wait_queue_head_t *q);
interruptible_sleep_on(wait_queue_head_t *q);

sleep_on()函数的作用就是将当前进程的状态置成TASK_UNINTERRUPTIBLE,定义一个等待队列,并把它添加到等待队列头q,直到支援获得,q引导的等待队列被唤醒。
interruptible_sleep_on()与sleep_on()函数类似,其作用是将目前进程的状态置成TASK_INTERRUPTIBLE,并定义一个等待队列,之后把它附属到等待队列头q,直到资源可获得,q引导的等待队列被唤醒或者进程收到信号。

sleep_on() <---> wake_up()
interruptible_sleep_on() <---> wake_up_interruptible()


分享到:
评论

相关推荐

    linux 等待队列

    linux 等待队列 模板代码,摘自宋宝华书中

    Linux的等待队列介绍

    介绍等待队列的管理,如何初始化,如何添加一个等待队列entry,希望对学习者有帮助。

    \Linux内核机制之等待队列

    \Linux内核机制之等待队列,消息讲述了wait_queue队列的数据结构和在内核中的实现源码,有助于对如何使用队列更加一目了然。

    Linux操作系统内核等待队列机制介绍

    在 Linux kernel 里有一个数据结构可以帮助我们做到这样的功能。这个数据结构就是本位要为大家介绍的 wait queue。在 kernel 里,wait_queue 的应用很广,举凡 device driver semaphore 等方面都会使用到 wait_queue...

    Linux内核的等待队列[汇编].pdf

    Linux内核的等待队列[汇编].pdf

    嵌入式Linux内核中的等待队列操作.pdf

    嵌入式Linux内核中的等待队列操作.pdf

    libthread_new.rar_linux 线程池_linux任务队列_线程池

    实现了一个线程池。其中运用了队列,以避免任务丢失。在队列和线程池之间创建了一个中间夹层,以提高可移植性。当任务来时,先压入队列,然后...线程完成任务后,再去队列查询,如果有任务就去执行,没有则阻塞,等待

    Linux下生产者消费者问题的实现

    一组生产者进程和一组消费者进程共享一个初始为空、大小为n的缓冲区,只有缓冲区没满时,生产者才把消息放入到缓冲区,否则必须等待;只有缓冲区不空时,消费者才能从中取出消息,否则必须等待。由于缓冲区是临界...

    LINUX的消息函数的分析

    Msqid_ds队列也包括两个等待队列:一个用于向消息队列写,另一个用于读。 每一次一个进程试图向写队列写消息,它的有效用户和组的标识符就要和队列的 ipc_perm数据结构的模式比较。如果进程可以向这个队列写,则...

    项目-银行账户管理系统(linux C编程和 消息队列实现IPC编程).rar

    客户端:提供一个界面供用户选择,当用户选择具体的业务操作之后,客户端将用户的选择信息发送给服务器进行处理,客户端等待服务器的结果,并且显示给客户。 服务器:接收客户端发来的用户选择信息进行处理,需要...

    MQ服务消息队列介绍

    系统进入等待界面: 队列管理器QM_JACK创建成功 3)在QM_JACK下创建名为"QUEUE_RECV"和"QUEUE_REPLY"的本地队列(客户可以根据自己的需求随意更改本地队列的名字和数量,这里创建这两个本地队列只是为之后的MQ_...

    Linux进程的睡眠和唤醒

    在这种情况下,进程则必须从运行队列移出,加入到一个等待队列中,这个时候进程就进入了睡眠状态。 Linux 中的进程睡眠状态有两种:一种是可中断的睡眠状态,其状态标志位TASK_INTERRUPTIBLE; 另一种是不可中断 的...

    设备驱动中阻塞与非阻塞及实现

    设备驱动中阻塞与非阻塞及实现:在Linux驱动程序中,我们可以使用等待队列(wait queue)来实现阻塞操作。wait queue很早就作为一个基本的功能单位出现在Linux内核里了,它以队列为基础数据结构,与进程调度机制紧密...

    国嵌培训课件Linux驱动程序设计

    2.内核等待队列 3. 阻塞型驱动程序设计 4.Poll设备操作 第三天 1.Mmap设备操作 2. 硬件访问 3. 混杂设备驱动 4. LED驱动程序设计 第四天 1. Linux总线、设备、驱动模型 2. Linux platform驱动 3. 中断处理 4. ...

    深入理解Linux内核-勘误表

    这就是"等待队列".(有多种原因可以让进程进入TASK_INTERRUPTIBLE和TASK_UNINTERRUPTIBLE状态, 如等待缓冲区被填充, 等待 锁被释放等, 于是就构造一个链表, 链表中的进程都在等待同一事件的产生.).解Linux内核正版...

    Linux编程--Linux内核

    9.1.4 等待队列 110 9.1.5 自旋锁 110 9.1.6 信号量 110 9.2 模块 111 9.2.1 模块载入 112 9.2.2 模块卸载 113 第10章 处理器 115 10.1 X86 115 10.2 ARM 115 10.3 Alpha AXP处理器 115 第11章 Linux内核源代码 117 ...

    国嵌嵌入式LINUX视频教程LINUX内核驱动进阶班共35讲.txt

    linux嵌入式开发 1-1(linux内核简合) 1-2(linux内核源代码) 1-3(linux内核配置与编译) 1-4(linux内核模块开发) 2-1(bootloader介绍) ...7-2(内核等待队列) 7-3(阻塞型字符设备驱动) 7-4(poll设备方法)

    Linux进程的睡眠和唤醒简析

     在Linux中,仅等待CPU时间的进程称为绪进程,它们被放置在一个运行队列中,一个绪进程的状 态标志位为TASK_RUNNING。一旦一个运行中的进程时间片用完, Linux 内核的调度器会剥夺这个进程对CPU的控制权,并且从...

    linux学习笔记v1.0 - 周立功开发板平台使用指令合集.docx

    Linux学习笔记 ... /* 加入等待队列,等待被唤醒,也就是有按键按下 */ //ret = wait_event_interruptible(dev-&gt;r_wait, atomic_read(&dev-&gt;releasekey)); //if (ret) { // goto wait_error; //}

    Linux设备驱动阻塞与非阻塞

    在Linux驱动程序中,我们可以使用等待队列(wait queue)来实现阻塞操作。wait queue很早就作为一个基本的功能单位出现在Linux内核里了,它以队列为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步...

Global site tag (gtag.js) - Google Analytics