15 - 信号处理设计模式

---- 整理自狄泰软件唐佐林老师课程

查看所有文章链接:(更新中)Linux系统编程训练营 - 目录

文章目录

  • 1. Linux应用程序安全性讨论
    • 1.1 问题
    • 1.2 不同场景
      • 1.2.1 场景一:不需要处理信号
      • 1.2.2 场景二:需要处理信号
  • 2. 场景一:不需要信号处理(单一功能应用程序)
  • 3. 场景二:需要处理信号(长时间运行的应用)
    • 3.1 同步解决方案(单任务)
      • 3.1.1 方案设计一
        • 3.1.1.1 同步方案示例一
        • 3.1.1.2 编程实验
        • 3.1.1.3 存在的问题
      • 3.1.2 方案设计二
        • 3.1.2.1 关键系统函数
        • 3.1.2.2 编程实验
        • 3.1.2.3 存在的问题
        • 3.1.2.4 思考
    • 3.2 异步解决方案(多任务)
      • 3.2.1 问题
      • 3.2.2 多线程信号处理
      • 3.2.3 方案
      • 3.2.4 进程与线程
        • 3.2.4.1 Linux多线程API函数
        • 3.2.4.2 多线程编程示例
      • 3.2.5 异步方案示例
      • 3.2.6 编程实验:多线程信号处理
  • 4. 信号设计模式小结

1. Linux应用程序安全性讨论

1.1 问题

  • 如何编写信号安全的应用程序?

1.2 不同场景

1.2.1 场景一:不需要处理信号

应用程序实现单一功能,不需要关注信号
如:数据处理程序,文件加密程序,科学计算程序

1.2.2 场景二:需要处理信号

应用程序长时间运行,需要关注信号,并及时处理
如:服务端程序,上位机程序

2. 场景一:不需要信号处理(单一功能应用程序)

在代码层面,直接阻塞所有可能的信号(本质上就是信号始终处于未决状态,无法递达进程)

在这里插入图片描述

  • 编程实验:不需要处理信号

【参看链接】:15 - 信号处理设计模式 / 00不需要处理信号场景/main.c

在这里插入图片描述
在这里插入图片描述

3. 场景二:需要处理信号(长时间运行的应用)

  • 同步方案
    • 通过 标记 同步处理信号,整个应用中 只有一个执行流
  • 异步方案
    • 专用任务处理,应用中存在 多个执行流(多线程应用)
    • 设置 专用于信号处理的任务,其它任务忽略信号,专注功能实现

3.1 同步解决方案(单任务)

  • 信号处理逻辑与程序逻辑位于同一个上下文
    即:信号处理函数与主函数不存在资源竞争关系

3.1.1 方案设计一

  1. 将任务分解为 子任务(每个任务可对应一个函数)
  2. 信号递达时,信号处理函数中 标记 递达状态
  3. 子任务处理结束后,真正执行信号处理

在这里插入图片描述

3.1.1.1 同步方案示例一

在这里插入图片描述

3.1.1.2 编程实验

【参看链接】:15 - 信号处理设计模式 / 01处理信号场景_同步方案

  1. 对于不可靠信号

在这里插入图片描述
在这里插入图片描述

  1. 对于可靠信号存在问题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1.1.3 存在的问题

  • 由于给每个信号唯一的标记位置,因此,所有信号转变为不可靠信号,并且仅保留最近递达的信号信息。
  • 可能改进方案:
    • 标记位置设计为链表,信号递达后在对应位置的链表处增加结点保留信号信息
      (增加结点涉及到malloc,不安全)

3.1.2 方案设计二

  1. 将任务分解为子任务(每个任务可对应一个函数)
  2. 创建 信号文件描述符,并阻塞所有信号(可靠信号递达前位于内核队列)
    • 意义:化被动为主动,原先任务的执行流在收到信号后被动中断。现在主动去检查是否有信号,如果有信号,将信号取出来处理,此时就需要文件描述符。
  3. 子任务处理结束后,通过 select机制 判断是否有信号需要处理
    • true:处理信号,false:等待超时

3.1.2.1 关键系统函数

在这里插入图片描述

  • 使用signalfd()处理信号
    先屏蔽所有信号(无法递达进程),之后为屏蔽信号创建文件描述符,当时机成熟,通过read()系统调用读取未决信号(主动接收信号)。

在这里插入图片描述

  • 使用select()监听文件描述符

在这里插入图片描述

  • 使用select()处理信号

在这里插入图片描述

3.1.2.2 编程实验

【参看链接】:15 - 信号处理设计模式 / 02处理信号场景_同步方案_select

  1. 可靠信号

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 不可靠信号

在这里插入图片描述
在这里插入图片描述

3.1.2.3 存在的问题

  • 虽然解决了信号丢失的问题,但是实时性不好。由于使用了select()机制,即便没有信号需要处理,也需要等待select超时,任务 实时性 受到影响

在这里插入图片描述

3.1.2.4 思考

  • 是否可以兼顾 信号处理任务执行 的实时性?

3.2 异步解决方案(多任务)

  • 使用独立任务处理信号,程序逻辑在其它任务中执行
    即:通过 多线程 分离信号处理与程序逻辑
    • 主线程:专用于处理信号
    • 其它线程:完成程序功能

3.2.1 问题

  • 信号递达进程后,在 哪一个执行流 中进行处理?

3.2.2 多线程信号处理

  • 信号的发送目标是 进程,而不是某个特定的线程
  • 发送给进程的信号仅递送给一个线程 ==> 哪一个线程处理?
  • 内核在不会阻塞目标信号的线程中进行随机选择
  • 每个线程拥有独立的信号屏蔽掩码

3.2.3 方案

  • 主线程:对目标信号设置信号处理的方式
    • 当信号递达进程时,只可能是 主线程 进行信号处理
  • 其它线程:首先屏蔽所有可能的信号(简单粗暴),之后执行任务代码
    • 无法接收到信号,不具备信号处理能力

3.2.4 进程与线程

  • 进程:应用程序的一次加载执行(系统进行资源分配的基本单位)
  • 线程:进程中的程序执行流
    • 一个进程可以存在多个线程(至少存在一个线程)
    • 每个线程执行不同的任务(多个线程可并行执行)
    • 同一个进程中的多个线程共享进程的系统资源

3.2.4.1 Linux多线程API函数

在这里插入图片描述

  • 线程标识:pthread_t pthread_self(void);
    • 获取当前线程的ID标识(tid)
  • 线程等待:int pthread_join(pthread_t thread, void** retval);
    • 等待目标线程执行结束

3.2.4.2 多线程编程示例

在这里插入图片描述

3.2.5 异步方案示例

  1. 主线程

在这里插入图片描述

  1. 任务线程

在这里插入图片描述

3.2.6 编程实验:多线程信号处理

【参看链接】:15 - 信号处理设计模式 / 03处理信号场景_异步方案_多线程

  1. 不可靠信号

在这里插入图片描述
在这里插入图片描述

  1. 可靠信号

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 信号设计模式小结

  • 多数程序不需要处理信号,因此可直接屏蔽信号
  • 需要处理信号的程序,重点考虑信号安全性问题
    • 同步 处理方案,通过设计让 任务代码信号处理代码 交替执行
      问题:信号处理是否及时?任务执行是否实时?
    • 异步 处理方案,任务代码信号处理代码 位于 不同执行流
      问题:将信号安全性问题转换为线程安全性问题,因此,程序本身是否做到线程安全?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/38244.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matlab将0 1矩阵显示为黑白图像

解决方法 clear clc pattern cell2mat(struct2cell(load("pattern"))); pic1 squeeze(pattern(1:64,:,:,:)); pic1 logical(permute(pic1, [2,3,1])); temp pic1(:,:,1); imshow(pic1(:,:,1));显示效果 test int8(rand(30,30)); imshow(logical(test));本来想…

初识mysql数据库之索引概念与磁盘效率问题

目录 一、索引的概念及作用 二、实际看看索引的效率提升 三、认识磁盘 1. 简单了解磁盘 2. 数据库文件存储位置 3. 定位扇区 4. 数据读取效率问题 5. 磁盘随机访问与磁盘连续访问 5.1 随机访问 5.2 连续访问 四、mysql与磁盘的交互 五、建立共识 一、索引的概念及…

Flask_使用flask_marshmallow序列化数据

代码如下: from flask import Flask from flask_marshmallow import Marshmallow from flask_sqlalchemy import SQLAlchemy from marshmallow import fieldsapp Flask(__name__) app.config["SQLALCHEMY_DATABASE_URI"] "mysqlpymysql://root:12…

excel常用操作备忘

excel操作: 1、快速填充多列公式:选中多列后,按ctrlD填 充。 2、快速删除空行:全选行,按ctrlG,空值项前边打上钩,点确定,针对选中的空行,鼠标右击,点删除&…

消息推送(websocket)集群化解决方案

目录 需求分析解决方案实现步骤架构图配置websocket请求地址配置websocket连接前置和连接关闭监听配置websocket处理程序配置redis交换机配置redis订阅监听配置redis发布监听需求分析 及时信息传递:消息推送功能能够确保网站向用户发送及时的重要信息,包括新闻更新、促销活动…

漏洞复现畅捷通CRM SQL注入

免责声明 术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共秩序,尊重社会公德,不得利用网络从事危害国家安全、荣誉和利益,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用…

网络安全专业必考的三个证书,初学者建议收藏!

学习网络安全,有三个必考证书,最后一个人手一本! 一,NISP证书 NISP即国家信息安全水平考试,由中国信息安全测评中心发证,属于网络安全专业的必考证书。 只有考取NISP一级证书才有机会考取二级&#xff0…

三季度上市,比亚迪海豹DM-i内饰官图发布,延续海洋风格

据报道,比亚迪海洋网旗下全新车型海豹 DM-i今日发布了内饰官方图片。新车内部采用了独特的“海洋美学”设计理念,并体现了海洋网最新一代内饰风格。消息称,这款车型将于第三季度上市,定位为中大型混合动力轿车。 值得注意的是&…

亚马逊会员日结束了,如何防止销量和排名“断崖式”下跌?

令人瞩目的2023亚马逊Prime会员日落下了帷幕,据官方数据显示,48小时售出商品超3.75亿件,再一次创造了历史新纪录! 好不容易因为亚马逊会员日提升了销售额和曝光了品牌,那么会员日结束了,如何稳住您的销量和…

java通过url获取视频时长(无需下载文件)

1、导入架包 <!-- jave 核心依赖 --><dependency><groupId>ws.schild</groupId><artifactId>jave-core</artifactId><version>2.4.6</version></dependency><!-- 根据不同操作系统引入不同FFmpeg包 --><!-- wi…

【多线程例题】顺序打印abc线程

顺序打印-进阶版 方法一&#xff1a;三个线程竞争同一个锁&#xff0c;通过count判断是否打印 方法二&#xff1a;三个线程同时start&#xff0c;分别上锁&#xff0c;从a开始&#xff0c;打印后唤醒b 三个线程分别打印A&#xff0c;B&#xff0c;C 方法一&#xff1a;通过co…

keep-alive和router-view配合使用缓存整个路由页面以及路由切换

实现内容&#xff1a;通过vue实现&#xff0c;在页面有侧边栏动态来展示当前页面流程&#xff0c;右边进行页面的切换&#xff0c;左右两边都是组件&#xff0c;但是A/B/C组件的切换是通过keep-alive搭配router-view实现的&#xff0c;首先在当前文件中创建五个文件&#xff1a…

【搜索引擎Solr】Solr:提高批量索引的性能

几个月前&#xff0c;我致力于提高“完整”索引器的性能。我觉得这种改进足以分享这个故事。完整索引器是 Box 从头开始创建搜索索引的过程&#xff0c;从 hbase 表中读取我们所有的文档并将文档插入到 Solr 索引中。 我们根据 id 对索引文档进行分片&#xff0c;同样的文档 id…

云原生之深入解析Flink on k8s的运行模式与实战操作

一、概述 Flink 核心是一个流式的数据流执行引擎&#xff0c;并且能够基于同一个 Flink 运行时&#xff0c;提供支持流处理和批处理两种类型应用。其针对数据流的分布式计算提供了数据分布&#xff0c;数据通信及容错机制等功能。Flink 官网不同版本的文档flink on k8s 官方文…

优秀的 RocketMQ 可视化管理工具 GUI 客户端

优秀的 RocketMQ 可视化管理工具 GUI 客户端 官网地址&#xff1a;http://www.redisant.cn/rocketmq 快速查看所有 RocketMQ 集群&#xff0c;包括Brokers、Topics和Consumers查看消费者订阅了哪些主题&#xff0c;以及消息队列被分配给了哪些消费者&#xff1b;当出现消息积…

黑客(网络安全)自学

建议一&#xff1a;黑客七个等级 黑客&#xff0c;对很多人来说充满诱惑力。很多人可以发现这门领域如同任何一门领域&#xff0c;越深入越敬畏&#xff0c;知识如海洋&#xff0c;黑客也存在一些等级&#xff0c;参考知道创宇 CEO ic&#xff08;世界顶级黑客团队 0x557 成员…

(转载)极限学习机(extreme learning machine, ELM)的回归拟合及分类(matlab实现)

单隐含层前馈神经网络(single-hidden layer feedforward neural network,SLFN)以其良好的学习能力在许多领域中得到了广泛的应用。然而&#xff0c;传统的学习算法(如BP算法等)固有的一些缺点&#xff0c;成为制约其发展的主要瓶颈。前馈神经网络大多采用梯度下降方法&#xff…

MSA【1】:Segment Anything Model for Medical Image Analysis: an Experimental Study

文章目录 前言1. Abstraction & Introduction1.1. Abstraction1.2. Introduction1.2.1. What is SAM?1.2.2. How to segment medical images with SAM? 2. Methodology2.1. SAM is used in the process of segmentation of medical images2.1.1. Semi-automated annotati…

【golang中的切片的相关知识点】[ ] slice

golang-切片 切片的定义和初始化切片的内存分析切片的操作获取长度和容量追加元素复制切片 切片的遍历切片的特性总结 Golang中的切片是一种灵活且强大的数据结构&#xff0c;它可以动态地增长和缩小。切片是基于数组的抽象&#xff0c;它提供了更方便的操作和更灵活的内存管理…

前端实现 DIV 高度只有100px,宽度只有100px ,我要在这个DIV放一个宽度200的DIV,左右拉动滚动条显示

<!DOCTYPE html> <html> <head><title>点击监听两组span标签</title><style>.outer-div {width: 100px;height: 100px;overflow-x: scroll;background-color: #abc1ee;}.inner-div {width: 200px;}/* 自定义滚动条样式 */.outer-div::-web…