等待队列

作者: 酥酥肉 | 来源:发表于2019-08-25 11:31 被阅读0次

等待队列

  • 表示一组睡眠的进程,当某一条件为真时,由内核唤醒他们

  • 在 Linux 中, 一个等待队列由一个"等待队列头"来管理, 一个 wait_queue_head_t 类型的结构,

  • 当一个任务需要在某个wait_queue_head上睡眠时,将自己的进程控制块信息封装到wait_queue中,然后挂载到wait_queue的链表中,执行调度睡眠。当某些事件发生后,另一个任务(进程)会唤醒wait_queue_head上的某个或者所有任务,唤醒工作也就是将等待队列中的任务设置为可调度的状态,并且从队列中删除。

等待队列头初始化

DECLARE_WAIT_QUEUE_HEAD(name);

wait_queue_head_t my_queue;
init_waitqueue_head(&my_queue);

等待队列

DECLARE_WAITQUEUE(wait, task);

添加移除等待队列

add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);
remove_wait_queue(wait_queue_head_t *q, wait_queue_t *wait);

简单睡眠

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 前 condition == 0 ,则调用 wait_event 之后,当前进程就会休眠

唤醒队列

void wake_up(wait_queue_head_t *queue);void wake_up_interruptible(wait_queue_head_t *queue);
比如你调用 wake_up 去唤醒一个使用wait_event等待队列,进入休眠的进程,唤醒之后,它会判断 condition 是否为真,如果还是假的继续睡眠。

手动睡眠

  • DECLARE_WAITQUEUE(name, tsk) 创建一个等待队列:
    tsk一般为当前进行current. 这个宏定义并初始化一个名为name的等待队列.
  • 将等待队列头 加入/移除 等待队列:add_wait_queue(wait_queue_head_t *q, wait_queue_t *wait)
  • 设置进程状态:set_current_state(TASK_INTERRUPTIBLE) 等
  • 进程调度:schedule() 或者 schedule_timeout()

相关文章

  • Select & Epoll原理

    预备知识 等待队列 等待队列有一个等待队列头,其他加入这个等待队列的需要加在这个头上。 需要加入等待队列的话,可以...

  • AQS源码解析

    等待队列中线程出队列时机 总的来说,一个线程获取锁失败了,被放入等待队列,acquireQueued会把放入队列中...

  • 等待队列

    工作队列和等待队列的区别 1.work queue 是一种bottom half,中断处理的后半程,强调的是动态的...

  • 等待队列

    等待队列 表示一组睡眠的进程,当某一条件为真时,由内核唤醒他们 在 Linux 中, 一个等待队列由一个"等待队列...

  • 等待队列

    等待队列概念以及使用 一、概述等待队列在内核中有很多用途,尤其在中断处理、进程同步及定时。等待队列实现事件上的条件...

  • Day30

    AQS 同步等待队列 & 条件等待队列 ReentrantLock同步执行,类似synchronized可重入 s...

  • 5、阻塞队列(BlockingQueue)和同步队列(Synch

    队列:FIFO(先进先出)阻塞: 写入:如果队列满了,就必须阻塞等待 读取:如果队列为空,必须阻塞等待生产。160...

  • AbstractQueuedSynchronizer (AQS)

    双队列 在AQS中,存在两个队列 等待队列:用于挂起当前线程,等待某个条件满足后唤醒或是被中断。 同步队列:多线程...

  • Java 通过阻塞队列实现生产者消费者模式

    阻塞队列 Blocking Queue 当队列空时,获取元素的线程会等待 当队列满时,存储元素的线程会等待 提供的...

  • go channel

    senq:等待发送的goroutine队列 recvq:等待接收的goroutine队列 buf是指向底层的循环数...

网友评论

    本文标题:等待队列

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