内核如何处理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() 的相关文章

  • 在 C++ linux 中将 STRINGS 写入串口

    我知道这个问题遍布互联网 但仍然没有任何东西能让我完全解决这个问题 我想用 C linux 将数据写入 Propeller 板的串行端口 从控制台获取输入时程序运行良好 但是当我向它写入字符串时总是返回 ERROR Invalid comm
  • 捕获实时流量时如何开启纳秒精度?

    如何告诉 libpcap v1 6 2 将纳秒值存储在struct pcap pkthdr ts tv usec 而不是微秒值 捕获实时数据包时 Note This question is similar to How to enable
  • 在 unix 中编译 dhrystone 时出错

    我是使用基准测试和 makefile 的新手 我已经从下面的链接下载了 Dhrystone 基准测试 我正在尝试编译它 但我遇到了奇怪的错误 我尝试解决它 但没有成功 有人可以帮助我运行 dhrystone 基准测试吗 以下是我尝试编译的两
  • 从 systemd bash 内联脚本创建 filename_$(date %Y-%m-%d)

    我正在尝试执行systemd计时器并希望将执行脚本的输出保存在每个日期的文件中 这是我的ExecStart脚本中的 service file ExecStart bin bash c echo date Y m d gt gt home u
  • 如何从 PROC 获取有关子进程的信息

    我正在尝试编写一个以几个进程作为参数的程序 然后父进程执行每个子进程并打印出一些相关的统计信息 示例 generate ls l 将生成一个程序 打印出有关 ls l 的一些统计信息 特别是其系统时间 用户时间和上下文切换次数 我不想使用
  • 在 Ubuntu 中找不到 X11/Xlib.h

    我试图在 Linux 上使用 open gl 编写一个相当简单的程序 但在编译时它说 编译拇指 egl 我对 GL 完全陌生 不知道出了什么问题 快速搜索使用 apt search Xlib h 打开 libx11 dev 包 但纯 Ope
  • 捕获数据包后会发生什么?

    我一直在阅读关于网卡捕获数据包后会发生什么的内容 我读得越多 我就越困惑 首先 我读过传统上 在网卡捕获数据包后 它会被复制到内核空间中的一个内存块 然后复制到用户空间 供随后处理数据包数据的任何应用程序使用 然后我读到了 DMA 其中 N
  • Web 应用程序的带宽和流量模拟器?

    您能否建议如何创建一个测试环境来模拟 Web 应用程序中的各种类型的带宽和流量 或者也许是一个针对本地主机执行此操作的开源程序 我认为在编写网络应用程序时这是一个非常重要的主题 但这不是一个常见的主题 我能想象创建这种环境的唯一方法是在本地
  • 无法在 64 位 Linux 上从汇编 (yasm) 代码调用 C 标准库函数

    我有一个函数foo以汇编语言编写 并在 Linux Ubuntu 64 位上使用 yasm 和 GCC 编译 它只是使用以下命令将消息打印到标准输出puts 如下所示 bits 64 extern puts global foo secti
  • 使用 inotify 的正确方法是什么?

    我想使用inotifyLinux 上的机制 我希望我的应用程序知道文件何时aaa被改变了 您能给我提供一个如何做到这一点的示例吗 文档 来自监视文件系统活动 inotify https developer ibm com tutorials
  • 在 Linux 上访问 main 之外的主要参数

    是否可以访问参数main在外面main 即在共享库构造函数中 在 Linux 上除了通过解析之外 proc self cmdline 您可以通过将构造函数放入 init array部分 功能在 init array 不像 init 使用相同
  • 如何使用 echo 写入非 ASCII 字符?

    如何写非ASCII http en wikipedia org wiki ASCII使用 echo 的字符 是否有转义序列 例如 012或类似的东西 我想使用以下方法将 ASCII 字符附加到文件中 echo gt gt file 如果您关
  • 在许多驱动程序文件夹中创建 build-in.o

    我正在用我的自定义驱动程序构建内核 成功构建后 我发现了许多 build in o 文件 任何人都可以详细说明这些文件是如何在这里结束的吗 我只能怀疑这些与更高级别的 makefile 有关 built in o 文件是未构建为模块的内核的
  • 找出 Linux 上的默认语言

    有没有办法从C语言中找出Linux系统的默认语言 有 POSIX API 可以实现这个功能吗 例如 我想要一个人类可读格式的字符串 即德语系统上的 German 或 Deutsch 法语系统上的 French 或 Francais 等 有类
  • 从 php/linux 获取 pdf 的布局模式(横向或纵向)

    给定一个 PDF 如何使用 PHP lib 或 Linux 命令行工具获取 PDF 的布局模式 或相对宽度 高度 Using http www tecnick com public code cp dpage php aiocp dp tc
  • 用于编辑 /etc/sudoers 文件的正则表达式模式

    我想删除 etc sudoers 文件中的 uncommnet 轮组 那么我应该使用什么正则表达式模式 cat etc sudoers Allows members of the sys group to run networking so
  • 未找到 Gem 命令

    我已经在 Ubuntu 10 10 32 位上安装了 gem apt get install gem y 但当我尝试跑步时 gem install something gem 我收到未找到命令的错误 bash gem command not
  • 如何确定代码是否在信号处理程序上下文中运行?

    我刚刚发现有人正在从信号处理程序调用我编写的绝对不是异步信号安全的函数 所以 现在我很好奇 如何避免这种情况再次发生 我希望能够轻松确定我的代码是否在信号处理程序上下文中运行 语言是 C 但该解决方案不适用于任何语言吗 int myfunc
  • 使用 gcc 理解共享库

    我试图理解 C 中共享库的以下行为 机器一 cat one c include
  • 如何从远程 ssh 连接上运行的 tmux(复制模式)复制到本地剪贴板

    我通过 OS X 上的 VirtualBox 运行 Linux 我通过在无头状态下运行虚拟机 然后使用端口转发 sshing 到 Linux 机器来实现这一点 现在 无论复制到我的虚拟机上的剪贴板 我都可以粘贴到我的远程 ssh 会话上 但

随机推荐

  • 具有多个位置的 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 个发出警报呼叫的进程