内核如何处理linux的alarm()

2023-11-24

我正在读关于如何alarm()call 可在 Linux 上运行。
alarm(5)会发送一个SIGALRM至少 5 秒内到达发出此调用的进程。
由于内核设置的递减计数器达到零,此时会引起警报。
我的疑问在这里 - 我们可以有 N 个发出警报呼叫的进程,并且系统中有一个可用于此目的的递减计数器。因此,内核必须通过一个递减计数器来跟踪它必须向其发送信号的所有进程。它是如何做到的?

[它是否维护一个排序链表,每个节点代表一个过程?]


我不是 Linux 内核开发人员,但考虑到man-page for alarm(),你已经可以预料到它是如何实现的了。

首先,很明显警报值是针对每个进程的。由于内核已经保留了每个进程的数据结构(task_struct),它只是将所需的闹钟时间存储在那里。然后Linux只是使用其内部定时器系统在指定时间注册回调。然后,所述回调将 SIGALRM 传递给您的进程。

警报不需要内核全局状态或链接的显式链表。内核只是保留一个进程列表并将警报超时存储为每个进程数据的一部分。

如果你想更深入地挖掘,调用树看起来像这样:

  • 系统警报()
  • Alarm_setTimer()
  • do_setitimer():这将内核计时器存储在 as 下task_struct->signal->real_timer;然后它传递调用
  • hrtimer_start(),它是 Linux 内部高分辨率计时器 API 的一部分。

进一步挖掘,Linux 高分辨率内核定时器系统可以做很多事情,例如区分实时(如果有人更改计算机上的时间/日期,可能会倒退)和单调时间。看一眼这篇 LWN 文章以获得概述。

出于此问题的目的,它在内部保留按到期时间排序的计时器列表(首先是即将到期的计时器,最后是稍后到期的计时器)。出于性能原因,这不是作为双向链表实现的,而是作为红黑树。处理完任何回调后,hrtimers 查看其列表,选择第一个条目(最快到期的计时器),然后告诉底层硬件计时器及时中断以服务下一个事件。当这种情况发生时,hrtimers 会调用相关的回调,然后重复该过程。

因此有定时器列表(以树的形式实现),但没有显式的递减计数器,该部分是通过硬件定时器处理的。这部分源代码的主要参考是enqueue_hrtimer().

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

内核如何处理linux的alarm() 的相关文章

  • 如何在Linux上用C/C++编写Web服务器[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在考虑在 Linux 平台上开发一个小型 阅读 初级 Web 服务器 但我不知道从哪里开始 我希望它能够做的是 监听特定端口 接受
  • 一段时间后完成活动

    我正在尝试开发一个类似匹配小图片的游戏 我的问题是我想在一段时间后完成游戏 例如 在第 1 级中 我们有 10 秒的时间来匹配图片 我也想显示剩余时间 如果有任何帮助 我将不胜感激 既然你还想显示倒计时 我会推荐一个倒计时器 http de
  • 使用脚本检查 git 分支是否领先于另一个分支

    I have branch1 and branch2我想要某种 git branch1 isahead branch2 这将显示如果branch1已承诺branch2没有 也可能指定这些提交 我无法检查差异原因branch2 is在之前br
  • 在ubuntu中打开spyder

    我想在ubuntu中打开spyder Python IDE 通常我会在 shell 中编写 spyder 它会打开spyder IDE 现在 当我在shell中编写spyder时 它只是换行 什么也没有发生 类似于按 enter 我如何找回
  • MySQL 与 PHP 的连接无法正常工作

    这是我的情况 我正在尝试使用 Apache 服务器上的 PHP 文件连接到 MySQL 数据库 现在 当我从终端运行 PHP 时 我的 PHP 可以连接到 MySQL 数据库 使用 php f file php 但是当我从网页执行它时 它只
  • 为什么此 NASM 代码会打印我的环境变量?

    本学期我刚刚完成计算机体系结构课程 除其他外 我们一直在涉足 MIPS 汇编并在 MARS 模拟器中运行它 今天 出于好奇 我开始在我的 Ubuntu 机器上摆弄 NASM 基本上只是将教程中的内容拼凑起来 并感受一下 NASM 与 MIP
  • 如何在 Linux 和 C 中使用文件作为互斥体?

    我有不同的进程同时访问 Linux 中的命名管道 并且我想让此访问互斥 我知道可以使用放置在共享内存区域中的互斥体来实现这一点 但作为一种家庭作业 我有一些限制 于是 我想到的是对文件使用锁定原语来实现互斥 我做了一些尝试 但无法使其发挥作
  • Crontab 每 5 分钟一次 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我如何告诉 crontab 每 5 分钟运行一次 但从每小时的第二分钟开始 换句话说 我想在以下时间执行我的脚本minute 5 2 例如 我的脚本应
  • 从常规文件读取时,read() 会失败并显示 EINTR

    据我记忆 read 不能被信号中断并返回errno EINTR当从常规文件中读取时 同样适用于write 写入常规文件时 这与从终端 管道 套接字等读取或写入相反 这在 Linux 上正确吗 这是 POSIX 强制要求的吗 编辑 假设我们正
  • 嵌入清单文件以要求具有 mingw32 的管理员执行级别

    我正在 ubuntu 下使用 i586 mingw32msvc 交叉编译应用程序 我很难理解如何嵌入清单文件以要求 mingw32 具有管理员执行级别 对于我的例子 我使用了这个hello c int main return 0 这个资源文
  • Linux无法删除文件

    当我找到文件时 我在删除它们时遇到问题 任务 必须找到带有空格的文件并将其删除 我的尝试 rm find L root grep i 但我有错误 rm cannot remove root test No such file or dire
  • Ubuntu Python shebang 线不工作

    无法让 shebang 线在 Ubuntu 中为 python 脚本工作 我每次只收到命令未找到错误 test py usr bin env python print Ran which python usr bin python 在 sh
  • 如何在线程创建和退出时调用函数?

    include
  • Linux 使用 boost asio 拒绝套接字绑定权限

    我在绑定套接字时遇到问题 并且以用户身份运行程序时权限被拒绝 这行代码会产生错误 acceptor new boost asio ip tcp acceptor io boost asio ip tcp endpoint boost asi
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • 如何才能将 TCP 连接返回到同一端口?

    机器是 RHEL 5 3 内核 2 6 18 有时我在 netstat 中注意到我的应用程序有连接 建立了 TCP 连接本地地址 and 国外地址是一样的 其他人也报告了同样的问题 症状与链接中描述的相同 客户端连接到本地运行的服务器的端口
  • Tomcat Intellij Idea:远程部署

    RackSpace 云服务器 Ubuntu 12 04 Intellij Idea 11 1 2 Windows 8 Tomcat 7 0 26 JDK 6 在 Intellij Idea 上 当我尝试在远程 Tomcat 7 服务器上运行
  • vmsplice() 和 TCP

    在原来的vmsplice 执行 有人建议 http lwn net Articles 181169 如果您的用户态缓冲区是管道中可容纳的最大页面数的 2 倍 则缓冲区后半部分成功的 vmsplice 将保证内核使用缓冲区的前半部分完成 但事
  • 执行命令而不将其保留在历史记录中[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在进行软件开发时 经常需要在命令行命令中包含机密信息 典型示例是将项目部署到服务器的凭据设置为环境变量 当我不想将某些命令存储在命令历史记
  • ALSA:snd_pcm_writei 调用时缓冲区不足

    当运行我最近从灰烬中带回来的旧程序时 我遇到了缓冲区不足的情况 该程序将原始声音文件完全加载到内存中 2100 字节长 525 帧 并准备 ALSA 进行输出 44 1khz 2 通道 有符号 16 位 if err snd pcm set

随机推荐

  • 具有多个位置的 Spring 属性占位符配置器中的属性解析顺序是什么?

    假设我有一个配置
  • 在Scheme中使用let

    我想编写一个程序来求Scheme中二次方程的根 我使用 LET 来进行某些绑定 define roots with let a b c let 4ac 4 a c 2a 2 a discriminant sqrt b b 4ac cons
  • 如何使用TypeScript将大对象映射到更小的界面?

    我有一个从服务器返回的对象 其中包含例如 lorem 1 ipsa 2 3 dolor sit amet consectetur adipiscing elit you get the picture 和一个 TypeScript 接口 e
  • 如何绕过特定网址的“angular-in-memory-web-api”

    我正在使用 angular in memory web api 来模拟我的 REST Web api 但是现在我已经开始编写实际的 Web api 并且我想替换 angular in memory web api 步骤一步一步 例子 我写了
  • 带有布局的自定义错误页面

    我一直在努力让自定义错误页面正常工作 并不断寻找回到简单使用静态页面的方法 虽然静态页面可以工作 但它需要重新制作导航栏 这是我们目前希望避免的 我目前正在使用以下内容来指定自定义错误页面 Asp net 错误处理
  • ES6 中 var 的用例是什么?

    If the let关键字引入了块作用域的正确实现 var还有用例吗 我是从软件设计的角度来看这个问题的 而不是从语法的 你可以 的角度来看的 If the let关键字引入了块作用域的正确实现 var还有用例吗 可能有一种用例 let全局
  • 累积汇总列

    我可能需要一些有关 SQL 语句的帮助 所以我有一个表 cont 如下所示 cont id name weight 1 1 10 2 1 20 3 2 40 4 2 15 5 2 20 6 3 15 7 3 40 8 4 60 9 5 10
  • 异步/等待不同的线程ID

    我最近正在阅读有关 async await 的内容 我对以下事实感到困惑 我正在阅读的许多文章 帖子都表明使用 async wait 时不会创建新线程 example 我创建了一个简单的控制台应用程序来测试它 class Program s
  • JQuery Datepicker,无法手动触发onSelect事件!

    我正在使用 jquery 的日期选择器 每当从内联日期选择器对象中选取日期时 都会通过 ajax 调用填充项目列表 该脚本工作完美 只是我无法触发 onSelect 事件来填充我的初始项目列表 我可以通过最初使用 php 填充列表来解决这个
  • 当客户端刷新或打开新页面时,Socket.io 在客户端保持连接

    如果用户打开新页面或刷新页面 是否有某种方法可以在客户端保持相同的 socket io 连接 可能将套接字存储在会话中或者这是不可能的 不可能 当页面更改或刷新时 您无法保持相同的 socket io 或 webSocket 客户端连接 浏
  • 将 JSON 转换为数组 Javascript

    我当前正在从应用程序的服务器端接收 JSON 对象 结果是这样的 tags value 2 label Dubstep value 3 label BoysIIMen value 4 label Sylenth1 但后来我真的不需要结果中的
  • C# 中默认的访问修饰符是什么?

    类 方法 成员 构造函数 委托和接口的默认访问修饰符是什么 C 中所有内容的默认访问权限是 您可以为该成员声明的最受限制的访问权限 例如 namespace MyCompany class Outer void Foo class Inne
  • 如何将控件设置为透明背景

    如何将控件的背景设置为透明 我说的是Label and Text目前的控件 但可以是我在 GUI 中看到的任何标准控件 shell setBackgroundMode SWT INHERIT FORCE 会做你想做的事 The Compos
  • UTF-8 可在 Eclipse 上使用,但无法使用导出的 jar

    我正在开发一个桌面应用程序Java Swing并将数据保存在MySQL阿拉伯语数据库 使用UTF 8 当我运行应用程序时Eclipse一切都运行良好 但是当我完成并将我的工作导出到runnable jar using Eclipse exp
  • 在 JavaScript 中检测 WebKit 设备的物理屏幕尺寸

    我想在客户端 JavaScript 代码中按屏幕宽度对设备进行分类 所有适合一只手 7 英寸以下 的设备均属于移动类别 将其他设备视为桌面设备 Fallback 将不支持必要 API 的设备视为移动设备 Question 我可以使用哪些相关
  • 将数据广播到 Flutter 中的多个 widget

    有没有一种方法可以将数据从一个小部件广播到其他小部件 类似于 Android 上的 BroadcastReceiver 或 iOS 上的 NSNotificationCenter 具体来说 我试图检测导航器何时弹出或推送新视图 我将 nav
  • 将内存映射到文件描述符的系统调用(逆映射)?

    我希望能够将内存映射到文件描述符 以便我可以使用一些需要文件描述符的现有函数 这基本上就是我正在寻找的 void do operation1 int fd char data DATA MAX embedded binary data in
  • 快速会话安全:true

    app use session secret testing credentials store sessionStore resave true saveUninitialized true cookie httpOnly true se
  • Airflow:为什么操作员有一个开始日期?

    我不明白为什么我们需要操作员 任务实例 的 开始日期 我们传递给 DAG 的那个不就足够了吗 另外 如果当前时间是 UTC 2018 年 2 月 7 日上午 8 点 30 分 现在我将 dag 的 start date 设置为 2018 年
  • 内核如何处理linux的alarm()

    我正在读关于如何alarm call 可在 Linux 上运行 alarm 5 会发送一个SIGALRM至少 5 秒内到达发出此调用的进程 由于内核设置的递减计数器达到零 此时会引起警报 我的疑问在这里 我们可以有 N 个发出警报呼叫的进程