Linux进程间通信——互斥锁与信号量详解

文章目录

    • 互斥锁
    • 信号量
      • 整形信号量
      • 记录形信号量
      • 利用信号量实现进程互斥
      • 利用信号量实现同步
      • 利用信号量实现前驱关系

互斥锁

现实中的锁有两种状态,打开和关闭,分别对应这资源可以被使用,和不可以被使用,我们可以通过使用钥匙对锁的状态进行改变

那么解决临界区的最简单的工具其实就是锁(mutex lock),我们称之为互斥锁

当一个进程进入临界区的时候,调用acquire函数,进行上锁,相当于不让别人再访问资源

退出临界区的时候调用release函数,来打开锁,可以让别人访问资源

一个锁只能上锁一次,因此在互斥锁中也有一个bool变量available,表示锁是否可以被上锁,可以被上锁时acquire函数就可以调用成功

这两个函数的执行必须是原子的,不允许被中断,因此通常都是硬件实现的

这种互斥锁也称之为自旋锁,主要问题是忙等待,也就是必须循环检查available是否可用

这种互斥锁可以用来解决同步问题

信号量

我们之前简单了解过信号量,本质上其实就是描述资源的数量

可以用来解决互斥和同步的问题,他只能被wait和signal原语访问,也称为PV操作,分别对应着申请和释放资源两个操作

整形信号量

这种就是最基础的用法,描述资源的数目

wait操作和P操作是申请操作,原理可以这样表示

void wait(int& S)
{while(S<=0); // 当资源不足时循环等待S--; // 足够了则申请
}

signal操作和S操作是释放操作

void signal(int& S)
{S++;
}

这种实现方法不遵循让权等待,会一直占用CPU

记录形信号量

这种信号量终于满足了不让忙等的机制,但是代价就是数据结构变得复杂

用一个结构体来描述,其中一个value表示资源数量,一个链表链接等待该资源的进程

struct semaphore // 信号量
{int value; // 资源数量list<PCB> L; // 等待PCB进程链表
};

然后用wait操作或者P操作进行资源申请

void wait(semaphore& S, PCB& new_L)
{S.value--;if(S.value < 0){S.L.push_back(new_L);block(new_L)}
}

这个操作的逻辑就是先将资源数量-1,如果此时资源数量小于0,则加入到等待队列中

这实际上是一种预定操作,虽然现在没有资源,但是我预定好了,并且一直处于等待队列中吗,并且手动block阻塞,不会让其占用CPU,等待释放资源,轮到我了,我再进行唤醒,我自然就可以使用了

void signal(semaphore& S) {S.value++;if (S.value <= 0) {PCB ret = S.L.front();S.L.pop_front();wakeup(ret);}
}

注意是小于等于的时候都要进行唤醒,因为是先进行的+1操作,说明在还没有进行唤醒之前,是小于0的,说明链表不为空

需要说明的是,这里仅是使用C++的list数据结构进行表示,操作系统中并非是用C++代码进行实现的,在Linux中,所有的操作都是使用C语言实现的

利用信号量实现进程互斥

当可用的资源只有一个的时候,实际上信号量就变成了锁

因此我们就可以直接用PV操作来表示申请资源和释放资源

// P1进程
P(S); // 进入区
// 临界区
V(S); // 退出区
// P2进程
P(S); // 进入区
// 临界区
V(S); // 退出区

P操作进去之前一定是需要上锁的

需要注意的是,对于不同的资源需要设置不同的信号量,PV操作也必须成对出现,不然一定会出问题

利用信号量实现同步

同步问题是我们需要不同进程之间的操作执行操作是按照一定顺序的

我们想要解决同步问题,就可以利用PV操作自带的锁,手动阻塞来实现

也就是先运行的进程,进行V操作释放操作,后运行的进程进行P操作申请操作

各自只执行一半

例如func1函数需要先执行,func2函数需要后执行,并且这两个函数分别属于P1和P2两个进程

// P1
func1();
V(S);
// P2
P(S);
func2();

因为两个进程是异步的,我们无法确定哪个进程先执行

但是可以确定的是,两个进程要么P1先执行,P2后执行,要么P2先执行,P1后执行

当P1先执行时,符合我们的要求,func1先执行,V操作释放资源,func2后执行,P操作申请资源,两个进程都相安无事

当P2操作先执行时,进行P操作申请资源,此时P1进程没有释放资源,所以P2进程被阻塞,真正原因其实是因为func1没有被执行,因此所谓的“资源”没有被释放,P2阻塞,于是P1进程运行,只有当P1进程释放资源之后,P2进程才能继续运行func2

利用信号量实现前驱关系

同步是两个进程之间的关系,而当多个进程都有前后制约关系时,我们称之为前驱关系

需要注意的时,进程之前可能没有先后关系,只是其中的某个函数或者语句有先后关系,这里只是为了方便描述

例如有下面的关系

请添加图片描述

我们可以对每一个箭头都设置一个信号量,或者对每一个节点设置一个信号量

这两种个思路其实都可以用来限制先后顺序,问题的难点在于如何分析题目画出这样的前驱图

例如下面是根据节点设置信号量

semaphore a1=a2=a3=a4=a5=a6=0;// P1
// ..
V(a1); // 表示1号操作完成// P2
P(a1); // 查看1号进程是否完成,未完成自动阻塞
// ..
V(a2); // 表示2号进程完成// P3
P(a1); // 查看1号进程是否完成,未完成自动阻塞
// ..
V(a3); // 表示3号进程完成// P4
P(a2); // 查看2号进程是否完成,未完成自动阻塞
// ..
V(a4); // 表示4号进程完成// P5
P(a2); // 查看2号进程是否完成,未完成自动阻塞
// ..
V(a5); // 表示5号进程完成// P6
P(a4),P(a5),P(a6); // 查看4,5,6号进程是否完成,未完成自动阻塞
// ..

另一种方法就是用来表示线,思路是一样的

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

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

相关文章

<数据集>考场行为识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;2192张 标注数量(xml文件个数)&#xff1a;2192 标注数量(txt文件个数)&#xff1a;2192 标注类别数&#xff1a;2 标注类别名称&#xff1a;[cheating, good] 序号类别名称图片数框数1cheating128214412good1067…

在多云生态下,如何实现跨云的自动化身份管理?

在多云环境下实现跨云的自动化身份管理是一个重要的课题&#xff0c;因为这可以帮助企业确保用户和应用程序能够在不同云服务提供商之间无缝地访问资源&#xff0c;同时保持高度的安全性和合规性。以下是一些关键技术和实践方法&#xff0c;用于实现跨云环境下的自动化身份管理…

Linux驱动开发基础(中断)

所学来自百问网 目录 1. 嵌入式中断系统 2. 中断处理流程 3. 异常向量表 4. Linux系统对中断的处理 4.1 ARM 处理器程序运行的过程 4.2 保护现场 5. Linux 系统对中断处理的演进 5.1 硬件中断和软件中断 5.2 中断拆分(上半部和下半部) 5.2.1 tasklet 5.2.2 工作队列…

git笔记:git常用命令备忘录

1、工作区域和文件状态 1.1、工作区域 git的数据管理分为四个区域&#xff1a; 工作区&#xff08;Working Directory&#xff09; 本地工作目录&#xff0c;是我们电脑上的目录&#xff0c;是我们实际编写代码的区域&#xff0c;修改完工作区的文件后可以使用git add命令将…

72 华为资源库

1 报文格式 https://info.support.huawei.com/info-finder/tool/zh/enterprise/packetformat 2 华为IP网络电子书 资源可以下载 https://e.huawei.com/cn/topic/enterprise-network/ip-ebook 3 华为产品文档 https://support.huawei.com/enterprise/zh/doc/index.html 4 华为…

Facebook的AI助手:如何提升用户社交体验的智能化

在现代社交媒体平台中&#xff0c;人工智能&#xff08;AI&#xff09;的应用正逐渐改变人们的社交体验。Facebook作为全球最大的社交媒体平台之一&#xff0c;已在AI技术的开发与应用上投入了大量资源&#xff0c;并通过其AI助手为用户提供了更加个性化、智能化的互动体验。这…

vagrant 创建虚拟机

创建一个名为 “Vagrantfile” 的文件&#xff0c;修改如下内容&#xff1a; Vagrant.configure("2") do |config|(1..3).each do |i|config.vm.define "k8s-node#{i}" do |node|# 设置虚拟机的Boxnode.vm.box "centos/7"# 设置虚拟机的主机名…

逆向中的游戏-入土为安的第二十五天

逆向中的游戏 CE的介绍 Cheat Engine &#xff0c;简称CE&#xff0c;是逆向工程师常用的几大神器之一&#xff0c;也是游戏汉化、破解以及外挂编写中常用的工具&#xff0c;其功能包括&#xff1a;内存扫描、十六进制编辑器、调试工具&#xff0c;可以进行反汇编调试、断点跟…

代码随想录算法训练营_day28

题目信息 122. 买卖股票的最佳时机 II 题目链接: https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/题目描述: 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你…

matlab 计算复共轭

目录 一、概述1、算法概述2、主要函数二、代码示例1、求复数的复共轭2、求矩阵中复数值的复共轭三、参考链接本文由CSDN点云侠翻译,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的抄袭狗。 一、概述 1、算法概述 2、主要函数 Zc = conj(Z)返回 Z …

【python】Python中小巧的异步web框架Sanic快速上手实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Git在IDEA中的集成操作(附步骤图)

1.先做适配操作&#xff0c;将安装的Git软件关联到IDEA中 点击Test之后若成功会显示出Git版本&#xff1a; 2.创建版本仓库 3.创建新的版本 3.1将文件提交到暂存区(不重要) 第一种方式&#xff1a;菜单栏提交 第二种方式&#xff1a;项目右键提交 4.查看历史版本信息 目…

整合sentinel遇到的小问题

1.运行jar包 &#xff0c;端口为默认8080 正确命令 java -Dserver.port8090 -Dcsp.sentinel.dashboard.server127.0.0.1:8090 -Dproject.namesentinel-dashboard -jar sentinel-dashboard-1.8.6.jar -D这些指令要在 -jar前面 在宝塔部署时&#xff0c;直接复制到运行命令后…

Sparse Kernel Canonical Correlation Analysis

论文链接&#xff1a;https://arxiv.org/pdf/1701.04207 看这篇论文终于看懂核函数了。。谢谢作者

基于无人机边沿相关 ------- IBUS、SBUS协议和PPM信号

文章目录 一、IBUS协议二、SBUS协议三、PPM信号 一、IBUS协议 IBUS&#xff08;Intelligent Bus&#xff09;是一种用于电子设备之间通信的协议&#xff0c;采用串行通信方式&#xff0c;允许多设备通过单一数据线通信&#xff0c;较低延迟&#xff0c;支持多主机和从机结构&a…

SpringBoot集成kafka-监听器注解

SpringBoot集成kafka-监听器注解 1、application.yml2、生产者3、消费者4、测试类5、测试 1、application.yml #自定义配置 kafka:topic:name: helloTopicconsumer:group: helloGroup2、生产者 package com.power.producer;import com.power.model.User; import com.power.uti…

C++11详解 (右值引用、可变参数模板、emplace_back、lambda表达式、function、bind)

目录 简介 左值引用与右值引用 左值引用与右值引用是什么 左值引用与右值引用的比较 右值引用的使用场景与C11中STL的新变化 完美转发 新的类功能 可变参数模板 可变参数模板的应用——emplace_back lambda表达式 包装器 function bind 结语 简介 在过往&#xf…

基于vue框架的毕业设计选题系统bqx47(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;学生,指导老师,课题信息,类型,选题信息 开题报告内容 基于Vue框架的毕业设计选题系统 开题报告 一、引言 毕业设计选题是高等教育中极为关键的一环&#xff0c;它不仅关乎学生未来研究的方向与深度&#xff0c;也是培养其创新思维和实…

SSRF漏洞与redis未授权访问的共同利用

1.利用靶场Pikachu来认识SSRF漏洞 1.什么是SSRF SSRF漏洞允许攻击者通过向服务器发起请求来伪造请求。这种漏洞的核心在于攻击者能够控制服务器向任意目标地址发起请求&#xff0c;而这些请求通常是攻击者无法直接从客户端发起的。 简单来说&#xff0c;假设你的网站有一个功能…

rk3568 npu opencv 怎么联系起来

问题&#xff1a; 客户一直再问 关于 3568 npu opencv 的编译内容。 大致了解一些 &#xff0c;这方面的内容。 网上的资料。 也许这个基本上就是他的逻辑了&#xff0c; 首先界面使用QT来写。 然后&#xff0c;使用 opencv 去读取摄像头。 然后拿到一帧图像之后&#xff…