• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

「译文」深入解析 Go 的信号处理---gsignal

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

本文字数:720 字

精读时间:5 分钟

也可在 2 分钟内完成速读

原文地址:https://medium.com/a-journey-with-go/go-gsignal-master-of-signals-329f7ff39391

本文基于 Go 1.13 分析

signal提供信号处理机制,并允许我们的 Go 程序与传入的信号进行交互。让我们先从监听者开始,然后再深入了解内部。

订阅

信号的订阅是通过 channel 完成的。这是一个监听任何中断信号或调整终端大小的程序示例

每个os.Signal channel 都会收听自己相应的事件集。这是上一个示例里面带有订阅工作流程的图:

Go 还为通道提供了停止通知的功能Stop(os.Signal)-或忽略信号的功能Ignore(...os.Signal)。这是这两个功能的简短示例:

该程序不能被CTRL+C 中断并且永远不会停止,因为在第二次从该通道接收之前,该通道已停止监听用于终端调整大小的信号。现在让我们看一下处理传入信号的listenerprocess是如何构建的。

gsignal

在初始化阶段,signal产生一个goroutine,该 goroutine 循环运行并充当处理信号的使用者。此循环将一直休眠直到得到通知。这是第一步:


然后,当信号到达程序时,信号处理程序将其委托给称为gsignal的特殊 goroutine。此 goroutine 是使用固定的且无法增长的较大堆栈(32k,以满足不同操作系统的要求)创建的。每个线程(用 M 表示)都有一个内部gsignal goroutine 来处理信号。这是更新的图:

gsignal 分析信号以检查其是否可处理,并唤醒睡眠的goroutine并将信号发送到队列:

SIGBUSSIGFPE之类的同步信号无法管理,将转换为 panic

然后,此循环 goroutine 可以对其进行处理。它首先查找已预订此事件的 channel,并将信号推送给他们:

循环过程信号的 goroutine 可以通过以下工具在 trace 中可视化分析: go tool trace

锁定或阻塞gsignal会使信号处理陷入困境。由于其固定大小,它也无法分配内存。这就是为什么在信号处理链中具有两个独立的 goroutine 的重要性:一个在信号到达时立即将它们排队,另一个在同一队列中循环处理它们。

现在,我们可以使用新组件来更新第一部分的插图:

本文来源于 Golang China 论坛精华文章,请点击“阅读原文”跳转至论坛浏览。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
godriver:badconnection发布时间:2022-07-10
下一篇:
DAVID 进行 GO/KEGG 功能富集分析 - 0820LL发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap