【LINUX】进程间信号

news2024/12/23 0:26:23

文章目录

  • 前言
    • 铺垫
    • 信号
  • 信号的产生
    • 1、终端按钮产生信号
    • 2、调用系统函数向进程发送信号
    • 3、软件条件产生信号
    • 4、硬件异常产生信号
  • 信号的保存
  • 补充:位图数据结构
  • 信号的处理
  • 结语

前言

铺垫

1、日常中我们能经常感受到信号的存在:红灯停绿灯行、三更鸡鸣、妈妈的一通电话,这些都是信号,当我们遇到这些信号的时候,我们都知道接下来要做什么,进程也知道接下来要做什么,因为程序员在设计进程的时候就告诉他了。
2、信号可能随时产生,有可能进程在做优先级更高的事情,因此从进程产生到进程执行有一个时间窗口,同时进程也要有能够记录下这个信号的能力
3、信号的产生对于进程来说是异步的。
4、进程由操作系统通过pcb来管理,在对应进程的pcb里的某个位图结构记录着信号是否发生。
5、正因为是由操作系统维护,因此无论是通过哪种方法,都必须通过OS来写入!

信号

可以使用kill -l命令查看系统定义的信号列表,34号以后是实时信号,暂不讨论。
在这里插入图片描述

信号的产生

1、终端按钮产生信号

键盘在按下后会通过硬件单元告知cpu的特定针脚引发硬件中断,某个寄存器会存入9号信息,再通过中断向量表和中断号找到对应的方法,通过驱动程序来读取键盘的数据,再把数据给OS,OS会将其转化成2号信号再写入对应的位图结构,如下图:
在这里插入图片描述

2、调用系统函数向进程发送信号

alarm

#include <unistd.h>
功能:计时器
	int alarm(int seconds);
参数:
	seconds:秒数
返回值:
	返回0,如果进程被提前叫醒,就返回上次闹钟剩余的秒数

3、软件条件产生信号

先来学习一个函数:signal,我们知道进程拿到信号后会执行相应的动作,默认一般是退出,可以通过这个函数修改其执行动作。

#include <signal.h>
typedef void(* sighander_t)(int);
sighander_t signal(int signum,sighander_t handler);

作用:
	设置某一个信号的默认动作
参数;
	signum:要处理的信号类型
	handler:函数指针,要设置的对应动作
返回值:
	返回信号处理函数指针
#include <signal.h>
#include <sys/types.h>
	int kill(pid_t pid, int sig)
作用:控制进程信号
参数:
	pid:哪个进程
	sig:发送几号信号
返回值:

4、硬件异常产生信号

除0的本质,就是触发硬件异常。
在这里插入图片描述

信号的保存

通过上面的四种方式,信号被OS写入到pcb对应的位图结构内,接下来我们再来看一下信号保存的相关细节:
在这里插入图片描述
在学习进程控制程序退出和异常的时候我们知道status的低七位是异常信号,低第八位称为core dump位,当时没有解释这一位代表什么,现在说明一下:
程序因信号退出会有两种方式:
1、Term:直接退出
2、Core:会先进行核心转储,再退出

OS可以在该进程异常的时候,核心代码部分进行核心转储,将内存中进程相关数据,全都dump到磁盘中。黑核心转储文件方便在异常后进行调试,可以用ulimit -a来查看是否开启。
在这里插入图片描述

像我这台服务器就没有打开,可以使用ulimit -c [size] 来指定核心转储文件的大小,一般云服务器都默认不开启,因为云服务器一般作为生产环境。


言归正传,信号是如何保存在对应的数据结构里的呢?
在这里插入图片描述
pending表:位图结构,比特位位置表示哪一个信号,内容表示是否收到该信号
block表: 位图结构,比特位位置表示哪一个信号,内容表示是否阻塞该信号
handler表: 函数指针数组,下标表示信号编号,内容表示该信号传递的动作

补充:位图数据结构

//TODO…

信号的处理

首先我们要先明确一个问题:信号可以被立即处理吗?
信号不是被立即处理的,而是在合适的时候,信号的产生是异步的,当前进程可能正在做更重要的事情,那什么时候合适呢?当进程从内核态切换回用户态的时候,进程会在OS的指导下,进行信号的检测与处理。

这里提到了一个概念:什么是内核态和用户态?

用户态:执行用户写的代码时,进程所处的状态
内核态:执行OS的代码时,进程所处的状态

为什么要有这样的区分呢?又是如何做到这样的区分呢?
在上次讲解进程地址空间的时候,我们知道进程地址空间通过一张 页表 来建立虚拟地址空间和物理内存之间的联系,其实这个页表分为两种:上次介绍的页表是用户级页表,还有一张内核级页表,一个进程的虚拟地址空间由两部分构成,其中0-3G为用户虚拟地址,3-4G是内核的虚拟地址,正式通过这张内核级页表,可以让进程完成系统调用。

总结:
所有的进程都有自己的用户级页表;但所有的进程都可以看到同一张内核级页表,这样就支持所有进程通过统一窗口,看到同一个OS,所以OS的本质都是在进程的地址空间内运行的,因此,系统调用的本质其实就是在自己的地址空间跳转并返回。

在这里插入图片描述
那么问题来了,进程如何完成上述跳转呢?进程又是如何被调度的呢?

一、如何完成上述跳转?
实际上在CPU内部有一个叫做CR3的寄存器
3、0分别表征当前运行的进程是用户态、内核态,当然用户是不可以直接更改系统级别的,在系统调用的时候,内部光遇在正式调用逻辑的时候,修改执行级别。
详细流程:

当一个进程的时间片到了或者要进行系统调用的时候,这个进程的状态就会由用户态切换成内核态,在内核态的进程就会开始检查是否有信号需要处理,当检查到有信号需要处理,进程就会再由内核态切换成用户态,完成用户自定义的方法,完成这个方法后,进程应当重新嵌入内核,再调用sys_sigreturn回到用户态执行后续代码。
在这里插入图片描述

二、进程是如何被调度的?
不知道大家有没有想过一个问题,每次电脑关机后,断电一段时间,即使不联网也可以获得当前的时间,原因在于位于PC主板CMOS内的时钟硬件!

回到这个问题,首先我们要清楚:进程是由操作系统管理的,操作系统是一个软件,本质是一个死循环,而OS时钟硬件,每隔一段很短的时间就会向OS发送时钟中断,OS就要执行对应的中断方法,然后检查当前进程的时间片,通过系统调用函数:schedule() ;如果发现进程的时间片到了,就将进程对应的上下文进行保存并切换,再选择合适的进程。

结语

以上就是进程间信号的全部内容了,感谢收看,这里是蓝色学者,我们下次再见。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

60.网络训练中的超参调整策略—学习率调整2

4、inverse_time_decay inverse_time_decay(learning_rate, global_step, decay_steps, decay_rate,staircase=False, name=None)逆时衰减,这种方式和指数型类似。如图, 5、cosine_decay cosine_decay(learning_rate, global_step

K8s in Action 阅读笔记——【7】ConfigMaps and Secrets: configuring applications

K8s in Action 阅读笔记——【7】ConfigMaps and Secrets: configuring applications 7.1 Configuring containerized applications 在我们讨论如何将配置数据传递给在Kubernetes中运行的应用程序之前&#xff0c;让我们先看看通常如何配置容器化应用程序。 如果忽略了你可以…

002. java.lang.NumberFormatException: Infinite or NaN,怎么破?

你好&#xff0c;我是YourBatman&#xff1a;当我老了&#xff0c;也写代码&#xff1b;不为别的&#xff0c;只为爱好。 &#x1f4da;前言 如果你工作超5年&#xff0c;100%遇到过这个异常&#xff1a;java.lang.NumberFormatException: Infinite or NaN Infinite中文释义…

使用MockJS进行前端开发中的数据模拟

在前端开发中&#xff0c;有时我们需要在没有后端接口的情况下进行前端页面的开发和测试。这时&#xff0c;我们可以使用MockJS来模拟数据&#xff0c;以便进行开发和调试。MockJS是一个用于生成随机数据和拦截Ajax请求的JavaScript库&#xff0c;它能够帮助我们快速搭建起一个…

InVEST模型

学习目标&#xff1a; 1)采用InVEST模型&#xff0c;掌握产水&#xff08;包括水源涵养&#xff09;、碳存储&#xff08;包括固碳&#xff09;、土壤保持、水质&#xff08;氮磷&#xff09;、生境质量和热岛缓解等生态系统服务评估方法&#xff0c;开展人类活动影响、重大工…

MATLAB EXPO 2023会议记录|基于STM32的MATLAB电机控制方案

算法导出工作流视频&#xff1a;(99 封私信 / 82 条消息) Simulink 算法导出工作流 —— stm32电机控制示例(v2) - 知乎 (zhihu.com) Algorithm-Export Workflows for Custom Hardware 示例&#xff1a; Algorithm-Export Workflows for Custom Hardware - MATLAB & Simuli…

JavaScript拖拽API,ondragstart、ondragover、ondragenter、ondrop,使用详细(JavaScript常用原生拖拽API)

简述&#xff1a;JavaScript的拖拽api相必大家都不陌生&#xff0c;今天来分享下元素在拖动时触发的事件&#xff0c;顺便做下记录。 一、ondragstart事件 ondragstart事件在拖动元素时触发&#xff0c;通常用于设置拖动时的数据类型和数据。可以通过event.dataTransfer.setDa…

开发环境搭建-stm32CubeIDE进行标准库开发

stm32CubeIDE介绍 https://www.stmcu.com.cn/ecosystem/Cube/STM32CubeIDE stm32CubeIDE下载 点击上面的链接&#xff0c;登录即可下载。 搭建demo工程 新建工作空间 创建一个工程 选择芯片-STM32F103C8T6 点击“Next” 点击“Finish ” 添加标准库到项目工程文件目录下 配…

SM国密算法(二)-- OpenSSL库中分离算法

一、OpenSSL简介&#xff1a; OpenSSL 是用于传输层安全性 (TLS) 和安全套接字层 (SSL) 协议的一个强大、商业级和功能齐全的工具包。它也是一个通用的密码学库&#xff0c;包含有RSA、SM4、DES、AES等诸多加密算法。 OpenSSL GitHub地址 二、移植过程 1. 文件目录 下载在…

除蚂蚁文件数据恢复大师之外,还有哪些相似的软件?

数据丢失是一件常见的事情&#xff0c;许多人都会遇到这样的问题。为了解决这个问题&#xff0c;出现了许多数据恢复软件&#xff0c;其中包含蚂蚁文件数据恢复大师。但是&#xff0c;除了蚂蚁文件数据恢复大师之外&#xff0c;还有哪些类似的软件呢&#xff1f;本文为您整理了…

笔试强训总结3

作者&#xff1a;爱塔居 专栏&#xff1a;笔试强训 作者简介&#xff1a;大三学生&#xff0c;希望能同大家一起进步&#xff01; 1.以下代码运行输出的是 public class Person{ private String name "Person"; int age0; } public class Child extends Person{ p…

selenium clear()无效的解决办法

做自动化时&#xff0c;在往输入框中send_keys前往往需要先清空一下这个输入框里的内容&#xff0c;避免输入框原本有内容或默认值&#xff0c;导致最终输入的结果不是预期的内容。 清空内容我们一般会用clear()方法 import time from selenium import webdriverdriver webd…

如何使用Python操作Excel文件?看这篇博客就够了!

前言 如何使用Python操作Excel文件&#xff1f;看这篇博客就够了&#xff01; 在工作中&#xff0c;我们经常需要处理和分析数据。而Excel作为一种广泛使用的数据分析工具&#xff0c;被很多人所熟知。但是&#xff0c;对于一些非技术背景的用户来说&#xff0c;如何操作Exce…

自学网络安全,一般人我劝你还是算了吧

学前感言: 我为什么会这样说&#xff0c;要一般人自学网络安全就算了&#xff0c;因为我不是一般人 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发 .3.有时多 google,baidu,我们往往…

自学网络安全(黑客)?一般人我劝你还是算了吧!

一、自学网络安全学习的误区和陷阱 1.不要试图以编程为基础的学习开始学习 我在之前的回答中&#xff0c;我都一再强调不要以编程为基础再开始学习网络安全&#xff0c;一般来说&#xff0c;学习编程不但学习周期长&#xff0c;而且实际向安全过渡后可用到的关键知识并不多 …

IMX6ULL裸机篇之IIC协议

一. IIC实验简介 I2C 是最常用的通信接口&#xff0c;众多的传感器都会提供 I2C 接口来和主控相连。 比如摄像头、 加速度计、触摸屏等。 I.MX6U-ALPHA开发板 使用 I2C1 接口连接了一个距离传感器 AP3216C &#xff0c;本章我们就来学习如何使用 I.MX6U 的 I2C 接口…

“开启科技之门,每日工作充满力量” —— 全国科技者工作日

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…

科技创新—人工智能应用技术的出现

科技创新—人工智能应用技术的出现 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;研究目的是通过探索智慧的实质&#xff0c;扩展人类智能——促使智能主体会听&#xff08;语音识别、机器翻译等&#xff09;、会看&#xff08;图像识别、文字识别等…

深入解析CPU性能火焰图生成的内部原理

在进行CPU性能优化的时候&#xff0c;我们经常先需要分析出来我们的应用程序中的CPU资源在哪些函数中使用的比较多&#xff0c;这样才能高效地优化。一个非常好的分析工具就是《性能之巅》作者 Brendan Gregg 发明的火焰图。 我们今天就来介绍下火焰图的使用方法&#xff0c;以…

这三款识别图片手写文字的软件超好用

在过去&#xff0c;我们需要通过扫描或者人工录入的方式将手写文字数字化&#xff0c;这样操作不仅繁琐而且容易出错。而随着人工智能技术的发展&#xff0c;我们现在可以通过图片识别技术将手写文字自动识别为数字形态&#xff0c;从而实现自动化的信息处理和提取。这项技术可…