0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

干货:Linux内核中等待队列的四个用法

如意 来源:CSDN 作者:杨硕 2020-06-20 09:59 次阅读

Linux内核里的等待队列机制在做驱动开发时用的非常多,多用来实现阻塞式访问,下面简单总结了等待队列的四种用法,希望对读者有所帮助。

1. 睡眠等待某个条件发生(条件为假时睡眠):

睡眠方式:wait_event, wait_event_interruptible

唤醒方式:wake_up (唤醒时要检测条件是否为真,如果还为假则继续睡眠,唤醒前一定要把条件变为真)

2. 手工休眠方式一:

1)建立并初始化一个等待队列项

DEFINE_WAIT(my_wait) 《==》 wait_queue_t my_wait; init_wait(&my_wait);

2)将等待队列项添加到等待队列头中,并设置进程的状态

prepare_to_wait(wait_queue_head_t *queue, wait_queue_t *wait, int state)

3)调用schedule(),告诉内核调度别的进程运行

4)schedule返回,完成后续清理工作

finish_wait()

3. 手工休眠方式二:

1)建立并初始化一个等待队列项:

DEFINE_WAIT(my_wait) 《==》 wait_queue_t my_wait; init_wait(&my_wait);

2)将等待队列项添加到等待队列头中:

add_wait_queue

3)设置进程状态

__set_current_status(TASK_INTERRUPTIBLE);

4)schedule()

5)将等待队列项从等待队列中移除

remove_wait_queue()

其实,这种休眠方式相当于把手工休眠方式一中的第二步prepare_to_wait拆成两步做了,即prepare_to_wait 《====》add_wait_queue + __set_current_status,其他都是一样的。

4. 老版本的睡眠函数sleep_on(wait_queue_head_t *queue):

将当前进程无条件休眠在给定的等待队列上,极不赞成使用这个函数,因为它对竞态没有任何保护机制。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206734
  • LINUX内核
    +关注

    关注

    1

    文章

    311

    浏览量

    21388
收藏 人收藏

    评论

    相关推荐

    Linux驱动等待队列与poll机制

    ,可以极大的减轻CPU负荷,在进程挂起是可以让CPU去执行其它资源。而通过等待队列的方式就可实现进程阻塞,满足要求时再唤醒进程。
    的头像 发表于 09-25 09:00 1453次阅读
    <b class='flag-5'>Linux</b>驱动<b class='flag-5'>等待</b><b class='flag-5'>队列</b>与poll机制

    Linux内核中RCU的用法

    Linux内核中,RCU最常见的用途是替换读写锁。在20世纪90年代初期,Paul在实现通用RCU之前,实现了一种轻量级的读写锁。后来,为这个轻量级读写锁原型所设想的每个用途,最终都使用RCU来实现了。
    的头像 发表于 12-27 09:56 774次阅读
    <b class='flag-5'>Linux</b><b class='flag-5'>内核</b>中RCU的<b class='flag-5'>用法</b>

    RT-thread内核之消息队列

    ,接着再初始化消息队列,此时消息队列为空。删除消息队列:rt_err_t rt_mq_delete(rt_mq_t mq);删除消息队列时,如果有线程被挂起在该消息
    发表于 03-06 17:17

    转:第20章 FreeRTOS消息队列

    裸机编程时,使用全局数组的确比较方便,但是在加上RTOS后就是另一种情况了。相比消息队列,使用全局数组主要有如下四个问题: 1、使用消息队列可以让RTOS内核有效地管理任务,而全局数组
    发表于 09-04 14:41

    学习Linux四个步骤

    学习Linux四个步骤解答:学习Linux四个步骤假设你是计算机科班出身,计算机系的基本课程如数据结构、操作系统、体系结构、编译原理、计算机网络你全修过我想大概可以分为4
    发表于 09-24 15:27

    Linux等待队列如何实现

    在软件开发中任务经常由于某种条件没有得到满足而不得不进入睡眠状态,然后等待条件得到满足的时候再继续运行,进入运行状态。这种需求需要等待队列机制的支持。Linux中提供了
    发表于 08-05 07:47

    请问imx6dl的第四个I2C接口该如何配置使能呢

    在飞凌官网购买的一块开发板,CPU型号为imx6dl,使用的内核版本为Linux3.0.35。芯片手册上说明了有四个I2C接口,请问第四个I2C该如何配置使能呢?
    发表于 01-07 08:17

    OpenHarmony:内核对象队列之算法详解(上)

    结束生产者生产了四个消息后就结束了。3.2 FIFO算法之出队列第一步:队列第一消息如上图所示我们回顾下入队列的步骤,知道了每个消息的入队
    发表于 08-09 10:29

    Linux内核等待队列是什么意思?如何实现呢

    Linux内核等待队列是以双循环链表为基础数据结构,与进程调度机制紧密结合,能够用于实现核心的异步事件通知机制。在这个链表中,有两种数据结构:等待
    发表于 08-29 16:42

    rt_wqueue_wakeup能不能一次性唤醒等待队列中的所有线程?

    线程?还有想请教一下waitqueue的用法如果一waitqueue队列被唤醒了,还能不能再在这个队列中在添加等待线程?static st
    发表于 11-07 14:24

    linux kernel工作队列及源码解析

    1. 前言 工作队列(workqueue)的Linux内核中的定义的用来处理不是很紧急事件的回调方式处理方法。 以下代码的linux内核版本
    发表于 10-27 10:19 0次下载

    poll&&epoll之poll实现

    Linux内核中等待队列有很多用途,可用于中断处理、进程同步及定时。我们在这里只说,进程经常必须等待某些事件的发生。
    发表于 05-14 14:41 724次阅读
    poll&&epoll之poll实现

    浅谈鸿蒙内核代码调度队列

    鸿蒙内核代码中有两个源文件是关于队列的,一个是用于调度的队列,另一个是用于线程间通讯的IPC队列
    的头像 发表于 10-23 11:00 1795次阅读

    Liteos-a内核工作队列的实现原理分析及经验总结——芯海科技PPG芯片CS1262接入OpenHarmony实战

    摘要OpenHarmony系统中使用了liteos-m、liteos-a、linux三种内核,工作队列linux内核引入的一种异步处理机制
    的头像 发表于 04-26 09:26 1347次阅读
    Liteos-a<b class='flag-5'>内核</b>工作<b class='flag-5'>队列</b>的实现原理分析及经验总结——芯海科技PPG芯片CS1262接入OpenHarmony实战

    使用 PREEMPT_RT 在 Ubuntu 中构建实时 Linux 内核

    盟通技术干货构建实时Linux内核简介盟通技术干货Motrotech如果需要在Linux中实现实时计算性能,进而有效地将
    的头像 发表于 04-12 08:36 131次阅读
    使用 PREEMPT_RT 在 Ubuntu 中构建实时 <b class='flag-5'>Linux</b> <b class='flag-5'>内核</b>