Linux 等待队列

2023-11-18

1. Linux内核中等待队列简介

  Linux 内核等待队列可以用于许多用途,如中断、进程同步、以及定时。等待队列实现了在事件上的条件等待:希望等待特定事件的进程把自己放进合适的队列,

并且放弃控制权限。因此等待队列表示一组睡眠的进程,当某一事件为真时,有内核唤醒。

2. Linux 内核等待队列中重要数据结构

2.1 等待队列头

struct __wait_queue_head {
    spinlock_t lock;
    struct list_head task_list;
};
typedef struct __wait_queue_head wait_queue_head_t;

 

2.2 等待队列睡眠过程

  使用等待等待队列通常会定义一个等待队列头,static wait_queue_head_t wq,然后调用wait_event_*函数等待某条件,condition 的当前进程插入到等待队列wq中

并且睡眠,一直等到condition的条件满足后,内核在将对等队列上某一进程或者所有进程唤醒。

 

#define __wait_event_interruptible(wq, condition, ret)            \
do {                                    \
    DEFINE_WAIT(__wait);                        \
                                    \
    for (;;) {                            \
        prepare_to_wait(&wq, &__wait, TASK_INTERRUPTIBLE);    \
        if (condition)                        \
            break;                        \
        if (!signal_pending(current)) {                \
            schedule();                    \
            continue;                    \
        }                            \
        ret = -ERESTARTSYS;                    \
        break;                            \
    }                                \
    finish_wait(&wq, &__wait);                    \
} while (0)

/**
 * wait_event_interruptible - sleep until a condition gets true
 * @wq: the waitqueue to wait on
 * @condition: a C expression for the event to wait for
 *
 * The process is put to sleep (TASK_INTERRUPTIBLE) until the
 * @condition evaluates to true or a signal is received.
 * The @condition is checked each time the waitqueue @wq is woken up.
 *
 * wake_up() has to be called after changing any variable that could
 * change the result of the wait condition.
 *
 * The function will return -ERESTARTSYS if it was interrupted by a
 * signal and 0 if @condition evaluated to true.
 */
#define wait_event_interruptible(wq, condition)                \
({                                    \
    int __ret = 0;                            \
    if (!(condition))                        \
        __wait_event_interruptible(wq, condition, __ret);    \
    __ret;                                \
})

 

 

 

转载于:https://www.cnblogs.com/Lyunfei/p/10514167.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux 等待队列 的相关文章

  • 01背包问题变种:从长度为n的数组里选出m个数使和为固定值sum

    这个问题是我从leetcode上一道问题所想到的 原题 如果是从数组中选出2个数相加使之成为固定的数sum 这当然很简单 把数组中的数字遍历一遍 判断另一个数字是否也在数组中即可 代码如下 vector
  • 《Linux From Scratch》第三部分:构建LFS系统 第六章:安装基本的系统软件- 6.29. Coreutils-8.23...

    Coreutils 软件包包含用于显示和设置基本系统特性的工具 大概编译时间 2 5 SBU 需要磁盘空间 193 MB 6 29 1 安装 Coreutils POSIX 要求 Coreutils 中的程序即使在多字节语言环境也能正确识别
  • 算法--将数组分成和相等的多个子数组,求子数组的最大个数

    作者 陈太汉 一个整数数组 长度为n 将其分为m份 使各份的和相等 求m的最大值 比如 3 2 4 3 6 可以分成 3 2 4 3 6 m 1 3 6 2 4 3 m 2 3 3 2 4 6 m 3 所以m的最大值为3 算法 原理的思想是
  • Sort List

    Sort a linked list in O n log n time using constant space complexity 题目要求用 O n log n 的时间复杂度和常数的空间复杂度来进行链表排序 O nlogn 的排序算
  • 直线检测方法—LSD论文翻译

    附原文链接 LSD a Line Segment Detector 摘 要 LSD是一个线段检测器 能够在线性时间内得到亚像素级精度的检测结果 它无需调试参数就可以适用于任何数字图像上 并且能够自我控制错误数量的检测 平均来说 一个图像中允
  • Qt——用于表格QTableView的模型

    如果想使用表格来呈现数据 Qt提供了一个方便的部件QTableWidget 但是直接用它实现一些功能可能比较困难 这里将介绍一种强大 灵活的方式来操作表格 一 模型 视图架构 在这个架构中 模型用于存储数据 视图用于呈现数据 除此之外 还有
  • 用 Java 实现的八种常用排序算法

    八种排序算法可以按照如图分类 前置知识 1 算法稳定性 在一个序列中 能保证两个相等的数 经过排序之后 其在序列的前后位置顺序不变 A1 A2 排序前 A1 在 A2 前面 排序后 A1 还在 A2 前面 2 时间复杂度 时间复杂度是用于衡
  • DNG格式解析

    Author Maddock Date 2015 04 22 转载请注明出处 http www cnblogs com adong7639 p 4446828 html DNG格式基本概念 DNG格式是在TIFF的基础上扩展出来的 要了解D
  • 递归算法中的时间复杂度分析

    对于一种算法的时间复杂度分析还是特别重要的 在一些非递归算法中 我们仅仅看运算次数最多的那一行代码可能执行多少次就可以 实际就是看在循环中变量的变化 但是对于递归算法中该怎么分析呢 下面介绍几种递归函数中的算法时间复杂度分析的方法 0 递推
  • 数据结构之图的两种遍历实现(C语言版)

    上一期文章分享完了图的两种遍历方式 也是两种很重要的算法 DFS和BFS 这两种算法的应用和重要性我就不多说了 内行的人懂的都懂 今天这文章重要就是来上机实现这两种算法 又由于这两种算法都可以由邻接矩阵和邻接表来表示 博主分享的代码都是上机
  • JavaScript系列——数组元素左右移动N位算法实现

    引言 在自己刚刚毕业不久的时候 去了一家公司面试 面试官现场考了我这道题 我记忆深刻 当时没有想到思路 毫无疑问被面试官当成菜鸟了 最近刚好在研究数组的各种算法实现 就想到这道题 可以拿来实现一下 纪念自己逝去的青春 需求 假设有这样一个数
  • 4Sum

    Given an array S of n integers are there elements a b c and d in S such that a b c d target Find all unique quadruplets
  • Unique Binary Search Trees -- LeetCode

    原题链接 http oj leetcode com problems unique binary search trees 这道题要求可行的二叉查找树的数量 其实二叉查找树可以任意取根 只要满足中序遍历有序的要求就可以 从处理子问题的角度来
  • OJ-合并两个有序链表

    题目描述 代码如下 Definition for singly linked list struct ListNode int val struct ListNode next struct ListNode mergeTwoLists s
  • 用指针访问一维数组

    文章目录 顺序查找 数组方式实现 指针实现方式 对一位数组元素的访问有三种方式 指针变量的关系运算 引例 数组实现方式 主函数 指针实现方式 主函数 一维数组作为函数的参数 实际应用 顺序查找 要求用指针实现 在整数集合r中顺序查找与给定值
  • 数理统计知识整理——回归分析与方差分析

    题记 时值我的北科研究生第一年下 选学 统计优化 课程 备考促学 成此笔记 以谨记 1 线性回归 1 1 原理分析 要研究最大积雪深度x与灌溉面积y之间的关系 测试得到近10年的数据如下表 使用线性回归的方法可以估计x与y之间的线性关系 线
  • Linux 内核中的 Device Mapper 机制

    Linux 内核中的 Device Mapper 机制 尹 洋 在读博士生 尹洋 中科院计算所国家高性能计算机工程技术研究中心的在读博士生 主要从事服务部署和存储资源管理以及Linux块设备一级的开发和研究工作 简介 本文结合具体代码对 L
  • 用两个栈实现队列

    目录 一 栈的基本结构及其接口 二 我的队列结构定义 三 我的队列创建及其初始化 四 我的队列入队 五 我的队列出队 六 我的队列取队头元素 七 我的队列判空 八 我的队列销毁 一 栈的基本结构及其接口 栈的结构定义 typedef int
  • 按照层次遍历结果打印完全二叉树

    按照层次遍历结果打印完全二叉树 按照推论结果 l 层首个节点位置 2 h l 1 l 层节点间距 2 h l 1 1 编码实现 public static
  • 最大流-Dinic算法,原理详解,四大优化,详细代码

    文章目录 零 前言 一 概念回顾 可略过 1 1流网络 1 2流 1 3最大流 1 4残留网络 1 5增广路

随机推荐

  • MySQL慢查询

    看到这个名称我惊呆了 SQL不是希望快速查询取得结果吗 怎么什么时候会有这个概念 问了一个哥们 哥们认为是漫查询 同时多查询 于是Google得出了如下结果 慢查询其实对应的是MySQL慢查询日志系统 用来记录执行比较慢的SQL 怎么去判断
  • python从入门到时间_史上最详细python学习路线-从入门到精通,只需5个月时间

    针对Python的初学者 从无到有的Python语言如何入门 主要包括了 Python的简介 如何下载Python 如何安装Python 如何使用终端 Shell IDE等各种开发环境进行Python开发 Python中的语法和基本知识 概
  • 在一台电脑上出现提交文件名是中文的时候就报错HTTP Status 400 – Bad RequestRequired MultipartFile parameter 'excelFile&#

    在一台电脑上出现提交文件名是中文的时候就报错HTTP Status 400 Bad RequestRequired MultipartFile parameter excelFile
  • 如何在普通PC上安装macOS苹果操作系统

    目录 官网 如何下载和安装 macOS 如何在普通PC上安装macOS苹果操作系统 Mac PC 有什么不同 说明 1 下载 可以直接从 网页上 采用通常的方式进行下载 不需要使用 使用 App Store 但使用使用 App Store下
  • python安装模块方法_Python模块安装方法

    一 方法1 单文件模块 直接把文件拷贝到 python dir Lib 二 方法2 多文件模块 带setup py 下载模块包 进行解压 进入模块文件夹 执行 python setup py install 三 方法3 easy insta
  • python根据TF-IDF使用sklearn(TfidfVectorizer)计算句子的embedding

    TF IDF的计算公式如下 代码案例 from sklearn feature extraction text import TfidfVectorizer import jieba sentences list list 优惠的政策和政府
  • POI操作excel基本使用

    不用多说 下面的一个类中就是一些POI操作Excel xls 的常见操作 但是真正要生成一些如报表等复杂格式Excel的时候 通常的做法都是事先把格式一切的东西都手动制作好 数据模板 然后在Java应用中适当的时机把这个文件读进来 添加相应
  • 【蓝桥杯试题】试题 算法训练 印章

    试题 算法训练 印章 资源限制 时间限制 1 0s 内存限制 256 0MB 问题描述 共有n种图案的印章 每种图案的出现概率相同 小A买了m张印章 求小A集齐n种印章的概率 输入格式 一行两个正整数n和m 输出格式 一个实数P表示答案 保
  • 正则实现去除字符串前后空格

    前言 正则去掉字符串前后空格 1 去除左空格 str1是处理后的 let str1 str replace s g 2 去除右空格 str2是处理后的 let str2 str replace s g 3 去除左右空格 let str3 s
  • qt 多边形填充 生成语义分割的mask 灰度图

    qt多边形的绘制 填充与显示 直接在QWidget界面显示 重写paintEvent即可 QtTest QtTest QWidget parent QMainWindow parent ui setupUi this void QtTest
  • linux c 语言小结

    linux c 语言小结 gdb 使用 gdb是调试linux c语言代码的 所以要调试linux c语言 先要 gcc g 文件名 才能开始调试 gdb 命令 首先在命令行中输入 gdb 调试的基本代码 list 展示 s 进入函数内部
  • 如何理解原码,反码,补码转换

    首先 无论原码还是反码还是补码都是二进制形式 有效位数是7位 最后 最左边 一位是符号位 用以区别正负 数据在内存中是以 补码 的形式存放 一 区别 原码 最高位 0 是正数 最高位 1 是负数 反码 正数 与原码一致 负数 最高位不变 其
  • 为什么我的AJAX请求处理成功了,还报404错误

    为什么我的AJAX请求处理成功了 还报404错误 忘了添加 ResponseBody注解 参考博客 https blog csdn net jiaotuwoaini article details 53445182
  • 标注数字对应的文本_循环嵌套_全局暂元

    标注数字对应的文本 循环嵌套 全局暂元 1 清洗数据 cd path EPS data use temp ybmy nodest dta clear gen hy3 real substr string hy4 1 3 gen hy2 re
  • 安全客&FREEBUF 文章阅读量似乎有点问题

    安全客 FREEBUF 文章阅读量似乎有点问题 随手写个脚本测试一下 其中freebuf那篇文章是很老的文章了 居然阅读量还是嗖嗖的涨 下次是不是可以写个折线图分析一下 看看每次加的是不是有规律的 scripts cat freebufcu
  • OpenJDK 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000b4680000, 297795584, 0)

    在测试环境中 出现如下报错 经排查发现是物理机内存不足 此时对应服务进程已不在 OpenJDK 64 Bit Server VM warning INFO os commit memory 0x00000000b4680000 297795
  • TIM的一些配置参数

    1 使能TIM时钟 RCC APB1PeriphClockCmd RCC APB1Periph TIM ENABLE 2 基础设置 TIM TimeBaseStructure TIM Period 计数值 TIM TimeBaseStruc
  • osg fbo(四),将颜色缓冲区图片中的牛通过shader变绿

    osg fbo 三 中 把整个屏幕变绿了 因为是把shader添加到了颜色缓冲区图片上了 如果只想把牛变绿 就需要把shader添加到原始场景根中 即 osg ref ptr
  • Linux笔记:终端复用与管理工具screen和tmux

    文章目录 目的 screen 快速入门 更多介绍 tmux 快速入门 窗口与窗格 更多介绍 总结 目的 通过终端使用Linux时比较纠结的是一个终端通常同一时间只能做一件事 虽然可以将任务放入后台 但是对于有输出或交互的任务放入后台并不是一
  • Linux 等待队列

    1 Linux内核中等待队列简介 Linux 内核等待队列可以用于许多用途 如中断 进程同步 以及定时 等待队列实现了在事件上的条件等待 希望等待特定事件的进程把自己放进合适的队列 并且放弃控制权限 因此等待队列表示一组睡眠的进程 当某一事