Linux信号量和信号

1.温故知新

        上一篇博客,我们又知道了一种进程间通信的方案:共享内存。它是在物理内存中用系统调用给我们在物理内存开辟一个共享内存,可以由多个进程的页表进行映射,共享内存不和管道一样,它的生命周期是随内核的,而且它的效率高,这是因为共享内存创建出来不需要系统调用,而我们的管道等都需要系统调用进行通信,系统调用由成本,所以共享内存效率比较高,不知道我们学C++的时候还知道内存池吗?SLT它为了提高效率,防止小块内存一直调系统调用,它会提前开辟出一大块内存池让我们的STL去使用,减少内存碎片的问题。new,malloc底层就是系统调用,我们用户肯定无法开辟空间,得让我们的系统帮助我们用户去开辟空间,为什么,系统是管理硬件和软件的软件。共享内存不提供互斥和同步,所以我们用户必须手动来保证访问资源的同步和互斥。

这里简单介绍一下,互斥是什么?顾名思义,就是互斥的,我一个资源在同一时间只能有一个线程来访问,同步就是让不同的线程按照一定的顺序来访问我们的资源,同步必须保证互斥,只不过是有顺序了,所以同步=互斥+顺序。

2.并发编程

        介绍信号之前,先了解一个概念叫做并发编程。

        多个执行流,能看到同一份资源,如果我们并发访问一份共享资源,会导致数据不安全,我们需要协调我们多执行流,就是保护我们的共享资源,一般就是共享和互斥。

        被保护起来的资源,一般是全局变量等全局的,叫做临界资源。

        保护的方式一般就是我们上面说的互斥和同步,让多个进程在同一时间只能有一个进程来访问这个资源,同步就是协调进程,让它们按照一定的顺序来访问,避免饥饿问题。

        多个执行流,在访问临界资源的时候,具有一定的顺序性,叫做同步。同步保证了互斥,在保证一个执行流访问共享资源的时候同时保证了一定的顺序性。

        系统中某些资源同一时间只允许一个执行流访问,这样的资源叫做临界资源。

        在执行流中涉及访问互斥资源的程序叫做临界区,你写的代码=访问临界资源的代码(临界区)+不访问临界资源的代码(非临界区)。

        所谓的对共享资源的保护,其实就是对临界区代码的保护。归根到底我们是写代码来保护资源的,对代码的保护就间接实现了对共享资源的保护。

        

        

        

3.信号量

               信号量就是一个计数器。我们知道我们有的时候会去看电影,假如我们电影是一个资源,我们一个电影院一般要容纳很多人进去看电影,所以我们这个时候很多人进去看电影就是抽象为资源分给很多执行流使用,而如果我们一个VIP影院只允许一个人去看,抽象出来就是我们就是把电影院资源作为一个整体去使用了。

        我们电影院的经营者要进行卖票,我只要买了票,那个位置就是我的,就是对资源的预定。我们电影院是不能将一个位置的票重复出售的。

        未来当我们的所有执行流想要访问一个 公共资源,要先对资源进行申请,也就是买票,相当于对资源的预定机制。

        但是所有进程想要看到信号量,信号量本身就是一个共享资源,那么谁来保证信号量的安全嗯?答案是把信号量设计为原子的,不可被中断的。

        所以我们的信号量实际就是对一个资源的预定机制,允许多个执行流去访问一个共享资源,所以未来执行流想要访问临界资源就要先申请信号量,对资源进行预定。

        我们的二元信号量就是互斥,多元信号量就是同步,说白了我们二元信号量就是只0和1只允许一个执行流申请,多元信号量允许多个执行流对资源进行申请。二元就是把电影院的资源当整体使用,只允许一个人进去看。多元就允许我们多个执行流对资源进行预定,然后进去访问了。多元信号量允许多个线程对资源进行并发访问,如果我们里面有共享资源还要搭配锁来保证我们的线程安全。

信号量可以限制我们执行流访问共享内存的个数,当它为1时,它只允许一个执行流去访问我们的共享内存,会保护我们的共享内存的安全。

  4.信号

1.什么是信号

        讲完了信号量,我们来讲一讲信号,有人问,信号量和信号一字之差有啥联系吗?答案是没有联系,就和老婆饼和老婆没有半毛钱关系一样。

        信号有信号产生,信号保存,信号处理三个阶段。现实生活中我们看到红灯信号就知道不能走,信号在发出之前我们就知道对应的应对方法了。相似的,我们计算机中,我们进程内部都已经内置了对信号的处理方法和处理机制了。我们能识别这些信号是因为被教育过,进程能识别过这些信号是已经被写好了。

        还有信号到来时,我们可能正在做更重要的事,不会立即去处理信号,比如快递到达了, 我还正在打游戏,那得等我打完游戏再去取快递吧。

        进程对于信号的处理有默认动作,顾名思义,就是默认处理,还有就是忽略,忽略它不管它,还有就是我们自定义捕捉,OS会提供对应的函数帮助我们捕捉信号并对它的处理进行修改。

        我们知道前面讲过我们在shell中启动一个命令,如果我们想让它停下来,可以按crtl+c,就可以终止掉这个进程,当我们按下这个键的同时,我们就会想这个进程发送2号信号,让它终止下来,我们看到的就是这个进程被我们终止了。

        结论1:我们通过crtl+c这个案例可以明白我们的键盘可以想进程发送信号。

        结论2:kill命令可以杀死一个进程。

        我们先来说一下crtl+c的详细,就是我们只有前台进程可以通过键盘获取信号,任何时刻,一个登录系统只允许一个进程在前台运行,其他进程都在后台。

        我们fork之后,父进程先退出,让子进程变孤儿进程,它就会自动变为后台进程了。

        我们有一个signal可以对捕捉的信号做自定义处理可以验证我的说法,有兴趣可以去Linux上试一下。

#include <stdio.h>
#include <signal.h>
#include <unistd.h>// 自定义信号处理函数
void signal_handler(int signum) {printf("自定义信号处理:捕获信号 %d\n", signum);
}int main() {// 注册信号处理函数signal(SIGINT, signal_handler);printf("程序运行中,按下 Ctrl+C 触发信号...\n");printf("进程ID: %d\n", getpid());// 无限循环以保持程序运行while(1) {sleep(1);}return 0;
}

2.信号的本质

我们说是信号信号的,其实就是一个宏,我们发现我们的信号是没有0号信号的。我们前面说过信号分为大致下面:信号产生,信号保存,信号处理,我们信号产生不会去立即处理,而是在合适的时候处理,那我就得把我的信号保存下来啊,保存下来我才知道他来过啊!那么记录在哪里呢?怎么记录呢?

下面依次回答:记录在结构体力,结构体里各种变量,怎么记录呢?通过位图,我们一个有这么多信号,我们一个整型刚好32个比特位,一个比特位表示一个信号,可以保存所有产生的信号。

        

下面我有2个问题是:如何理解给进程发信号?有了上面的认识,给进程发信号不就把一个比特位由0变1吗?我们查一下比特位我们就知道这个信号来过了,它就被保存下来了。

        如何识别信号呢?这也是我们看它在位图的哪个比特位,看它对应比特位是0还是1我们就可以知道在这个信号在哪里,是否产生过。

但是总而言之,我们发信号是通过操作系统发送的,无论发送的信号方式有多少种,我们用户是无法发送信号的,本质还是我们操作系统去发送信号的。

不知道还记得我们以前介绍过的task struct结构体吗?每个进程创建出来这个结构体里面就描述它的属性,我们的信号存储就是存储在我们的task_struct里了。task_struct本质是内核的数据结构,谁有权利去内核改数据,只有操作系统,所以我们得出上面的结论,既然我们的信号是通过位图在我们的task_struct(描述进程属性的结构体)里存储的,我们修改里面的一个变量可以保存我们的信号,那么就只有操作系统本身可以去内核修改数据,就只有操作系统才可以给我们的进程发送信号!!!

        

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

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

相关文章

腾讯测试岗位面试真题分析

以下是对腾讯测试工程师面试问题的分类整理、领域占比分析及高频问题精选&#xff08;基于​​92道问题&#xff0c;总出现次数118次​​&#xff09;。问题按​​7大技术领域​​划分&#xff0c;高频问题标注优先级&#xff08;1-5&#x1f31f;&#xff09;&#xff1a; 不…

全面解析远程桌面:功能实现、性能优化与安全防护全攻略

远程桌面技术已成为工作与生活中不可或缺的协作工具&#xff0c;但在实际应用中&#xff0c;用户常遇到连接失败、卡顿延迟、安全隐患等问题。本文从远程桌面功能原理、网络与性能优化、安全防护策略、跨平台兼容性等角度&#xff0c;详细解析常见问题的解决方案&#xff0c;并…

【问题】Mybatis-plus框架使用@Select注解编写查询SQL,json字段查询转换失败

问题描述在使用mybaits-plus的时候定义的Mapper接口实现了BaseMapper&#xff0c;没有编写Mapper对应的xml&#xff0c;大部分查询使用框架的接口进行查询基本属性返回都是正常&#xff0c;复杂对象在sql中会进行查询&#xff0c;但是返回对象中却未包含相关属性。问题原因 没有…

Python多线程实现大文件下载

Python多线程实现大文件下载 在互联网时代&#xff0c;文件下载是日常操作之一&#xff0c;尤其是大文件&#xff0c;如软件安装包、高清视频等。然而&#xff0c;网络条件不稳定或带宽有限时&#xff0c;下载速度会变得很慢&#xff0c;令人抓狂。幸运的是&#xff0c;通过多线…

【R语言】RStudio 中的 Source on Save、Run、Source 辨析

RStudio 中的 Source on Save、Run、Source 辨析 在使用 RStudio 进行 R 语言开发时&#xff0c;我们会在主界面左上角看见三个按钮&#xff1a;Source on Save、Run、Source 。 本文将带你从概念、使用方法、快捷键、使用场景以及注意事项等方面详细解析这三个功能。 文章目录…

蓝桥杯算法之搜索章 - 4

目录 文章目录 前言 一、记忆化搜索 二、题目概略 三、斐波拉契数 四、Function 五、天下第一 六、滑雪 总结 亲爱的读者朋友们&#xff0c;大家好啊&#xff01;不同的时间&#xff0c;相同的地点&#xff0c;今天又带来了关于搜索部分的讲解。接下来我将接着我前面文章的内容…

抗量子加密技术前瞻:后量子时代的密码学革命

目录抗量子加密技术前瞻&#xff1a;后量子时代的密码学革命1. 量子计算威胁现状1.1 量子霸权里程碑1.2 受威胁算法1.3 时间紧迫性2. 抗量子密码学体系2.1 技术路线对比2.2 数学基础革新3. 标准化进程3.1 NIST PQC标准化时间线3.2 当前推荐算法4. 技术实现方案4.1 Kyber密钥交换…

基于STM32设计的矿山环境监测系统(NBIOT)_262

文章目录 一、前言 1.1 项目介绍 【1】开发背景 【2】研究的意义 【3】最终实现需求 【4】项目硬件模块组成 1.2 设计思路 【1】整体设计思路 【2】上位机开发思路 1.3 项目开发背景 【1】选题的意义 【2】摘要 【3】国内外相关研究现状 【5】参考文献 1.4 开发工具的选择 【1】…

电脑如何安装win10专业版_电脑用u盘安装win10专业版教程

电脑如何安装win10专业版&#xff1f;电脑还是建议安装win10专业版。Win分为多个版本&#xff0c;其中家庭版&#xff08;Home&#xff09;和专业版&#xff08;Pro&#xff09;是用户选择最多的两个版本。win10专业版在功能以及安全性方面有着明显的优势&#xff0c;所以电脑还…

多语言文本 AI 情感分析 API 数据接口

多语言文本 AI 情感分析 API 数据接口 AI / 文本处理 AI 模型快速分析文本情感倾向 多语言文本 / 情感分析。 1. 产品功能 支持多语言文本情感分析&#xff1b;基于特定 AI 模型&#xff0c;快速识别文本情感倾向&#xff1b;适用于评论分析、舆情监控等场景&#xff1b;全接…

【R语言】R语言的工作空间映像(workspace image,通常是.RData)详解

R语言的工作空间映像&#xff08;.RData&#xff09;详解 在使用 R 语言时&#xff0c;你可能会注意到&#xff0c;每次退出 R 会弹出一个提示&#xff1a; Save workspace image? [y/n/c] 如果你使用的是 Rstudio 这个 IDE 来进行R语言的开发&#xff0c;那么可能弹出的提示…

在线 A2C实践

在线 A2C&#xff08;Actor-Critic&#xff09;算法在推荐系统中的实践&#xff0c;核心是将推荐过程建模为实时交互的强化学习问题&#xff0c;通过 Actor 生成推荐策略、Critic 评估策略价值&#xff0c;实现 “决策 - 反馈 - 更新” 的闭环。从样本设计到最终上线&#xff0…

Eclipse RCP产品动态模块设计

文章目录 遇到问题具体实践效果演示应用下载 遇到问题 如果你是一个To C产品的设计者&#xff0c;势必会遇到用户需求高度分化的场景&#xff0c;随之而来的是繁杂的功能列表&#xff0c;如何让用户只接触与其任务直接相关的功能&#xff0c;隐藏无关元素&#xff1f; 具体实…

NLP自然语言处理: FastText工具与迁移学习基础详解

FastText工具与迁移学习基础详解 一、知识框架总览 FastText工具核心功能与应用场景FastText模型架构与工作原理层次Softmax加速机制哈夫曼树概念与构建方法 二、FastText工具核心解析 2.1 功能定位 双重核心功能 文本分类&#xff1a;可直接用于文本分类任务&#xff0c;快速生…

uni-app 生命周期详解

概述 uni-app 基于 Vue.js 框架开发&#xff0c;其生命周期包含了三个层面&#xff1a; 应用生命周期&#xff1a;App.vue 的生命周期页面生命周期&#xff1a;各个页面的生命周期Vue 组件生命周期&#xff1a;Vue.js 原生的组件生命周期 这三种生命周期在不同场景下会按特定顺…

MCU外设初始化:为什么参数配置必须优先于使能

在微控制器领域&#xff0c;初始化参数配置阶段至关重要。此时&#xff0c;虽无电源驱动&#xff0c;但微控制器在使能信号到来前&#xff0c;借初始化参数配置这一精细步骤&#xff0c;开启关键准备进程。初始化参数配置如同物理坐标锚定、逻辑指令部署、内在秩序预设&#xf…

AI一周事件(2025年8月6日-8月12日)

&#xff08;以下借助 DeepSeek-R1 & ChatGPT-5 辅助整理&#xff09; 一、AI 模型与算法进展 1. OpenAI 正式发布 GPT-5&#xff08;8月7日&#xff09; 事件&#xff1a;OpenAI 于 2025 年 8 月 7 日推出 GPT-5——其自称拥有“PhD 级别”的智能&#xff0c;通过内置…

快速了解自然语言处理

在这个智能时代&#xff0c;我们每天都在和机器 “对话”—— 用语音助手查询天气、让翻译软件跨越语言障碍、靠智能客服解决问题…… 这些便捷体验的背后&#xff0c;都离不开自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff09; 技术。作为人工…

洛谷 P2607 [ZJOI2008] 骑士-提高+/省选-

题目描述 Z 国的骑士团是一个很有势力的组织&#xff0c;帮会中汇聚了来自各地的精英。他们劫富济贫&#xff0c;惩恶扬善&#xff0c;受到社会各界的赞扬。 最近发生了一件可怕的事情&#xff0c;邪恶的 Y 国发动了一场针对 Z 国的侵略战争。战火绵延五百里&#xff0c;在和平…

不止于GET:掌握POST报错注入的精髓

文章目录引言POST请求简述报错注入核心思想关键前提实战演练POST报错注入与GET报错注入的区别防御之道&#xff1a;如何避免POST报错注入&#xff1f;引言 SQL注入是Web安全领域危害性最大、最常见、最持久的高危漏洞之一。它直接威胁到应用程序核心数据库的安全&#xff0c;可…