信号量机制及信号量实现进程同步、互斥、前驱关系

        进程互斥的四种软件实现万式(单标志法、双标志先检查、双标志后检查、Peterson算法)进程互斥的三种硬件实现方式(中断屏蔽方法、TS/TSL指令、Swap/XCHG指令) 1.在双标志先检查法中,进入区的“检查”、“上锁”操作无法一气呵成,从而导致了两个进程有可能同时进入临界区的问题: 2.所有的解决方案都无法实现“让权等待”。

        用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步。信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为1的信号量。

        原语是一种特殊的程序段,其执行只能一气呵成,不可被中断。原语是由关中断/开中断指令实现的。软件解决方案的主要问题是由“进入区的各种操作无法一气呵成”,因此如果能把进入区、退出区的操作都用“原语”实现,使这些操作能“一气呵成”就能避免问题。一对原语:wait(S)原语和signal(S)原语,可以把原语理解为我们自己写的函数,函数名分别为wait和signal,括号里的信号量S其实就是函数调用时传入的一个参数。 wait、signal原语常简称为P、V操作(来自荷兰语proberen和verhogen)。因此,做题的时候常把 wait(S)、signal(s)两个操作分别写为P(S)、V(S)。

一、 整型信号量

一个整型信号量维护一个整数值,该值可以被多个进程或线程并发地访问和修改。整型信号量通常用于控制对共享资源的访问,以确保多个并发执行的任务之间的协调和同步。

整型信号量的基本操作通常包括:

  1. 初始化: 在使用信号量之前,需要对其进行初始化,设置初始的整数值。这个整数值通常代表可用资源的数量。

  2. 等待(Wait): 当一个任务希望使用资源时,它会尝试执行等待操作。如果当前信号量值大于零,表示有可用资源,任务可以继续执行。否则,任务可能需要等待,直到有足够的资源可用。

  3. 释放(Signal): 当任务使用完资源后,它会执行释放操作,增加信号量的计数器。这通常会释放一个资源,使得其他等待资源的任务可以继续执行。

整型信号量的典型应用场景包括解决生产者-消费者问题、避免资源竞争等。

 二、记录型信号量

        记录型信号量(record semaphore)是信号量的一种变体,它不仅包括一个整数值的计数器,还包括一个队列,用于跟踪等待信号量的进程或线程。

记录型信号量通常具有以下特征:

  1. 整数计数器: 与普通的整型信号量类似,记录型信号量也包含一个整数计数器,用于表示可用资源的数量。

  2. 等待队列: 记录型信号量额外包含一个等待队列,用于保存正在等待信号量的进程或线程的信息。这样,当一个任务试图获取一个信号量,但当前计数器值为零时,它会被放入等待队列,等待信号量的释放。

  3. 原子操作: 操作记录型信号量的增减等操作通常是原子的,以防止竞态条件。这确保了多个任务能够正确地协调并访问共享资源。

        记录型信号量的使用场景与整型信号量类似,主要用于协调对共享资源的访问。当多个任务需要互斥地访问某一资源时,记录型信号量可以确保在任意时刻只有一个任务能够持有该资源。

 

三、信号量实现进程同步和互斥 

3.1 信号量实现进程互斥

        信号量是一种用于控制进程或线程访问共享资源的同步机制,而进程互斥是信号量常见的应用之一。下面是使用信号量实现进程互斥的一般步骤:

  1. 初始化信号量: 创建一个信号量,并初始化其计数器。通常,这个计数器的初始值为1,因为我们希望在任意时刻只有一个进程能够进入临界区。

  2. 进入临界区前等待信号量: 在进入临界区之前,进程尝试等待信号量。如果信号量的值大于零,表示没有其他进程在临界区内,该进程可以继续执行临界区的代码。否则,它会被阻塞,等待信号量的值变为正数。

  3. 离开临界区后释放信号量: 进程在完成临界区的操作后,释放信号量,将信号量的值加一。这表示临界区现在可以被其他等待的进程访问。

3.2 信号量实现进程同步 

        信号量也可以用于实现进程同步,确保多个进程按照某种顺序或协作来执行任务。进程同步的一个常见应用是生产者-消费者问题,其中生产者和消费者之间需要协调以避免数据竞争和不一致的情况。以下是使用信号量实现进程同步的一般步骤:

  1. 初始化信号量: 创建两个信号量,一个用于表示可用资源的数量,另一个用于表示等待的资源数量。

  2. 生产者等待资源: 在生产者代码中,当要生产一个资源时,它首先等待可用资源的信号量。

  3. 生产者生产资源: 生产者生产一个资源后,将可用资源的信号量增加。

  4. 消费者等待资源: 在消费者代码中,当要消费一个资源时,它首先等待可用资源的信号量。

  5. 消费者消费资源: 消费者消费一个资源后,将可用资源的信号量减少。

 

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

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

相关文章

性能测试、负载测试、压力测试之间的差异!

1、什么是性能测试 性能测试是一种用于确定计算机、网络或设备速度的测试。它通过在不同的负载场景中传递不同的参数来检查系统组件的性能。 2、什么是负载测试 负载测试是在任何应用程序或网站上模拟实际用户负载的过程。它检查应用程序在正常和高负载期间的行为。当开发项目…

CAN 三: STM32 CAN相关寄存器介绍

1、寄存器列表(F1/F4/F7) 寄存器名称作用CAN_MCRCAN主控制寄存器主要负责CAN工作模式的配置CAN_BTR位时序寄存器用来设置分频/TBS1/TBS2/TSWJ等参数,设置测试模式CAN_(T/R)IxR标识符寄存器存放(待发送/接收)的报文ID、扩展ID、IDE位及RTR位C…

[c]零钱兑换

题目比较简单&#xff0c;看答案就能看懂什么意思 #include<stdio.h> int main() {int count 0;int n;scanf("%d", &n);for (int i 0; i < n; i){for (int k 0; k <n/2; k){for (int j 0; j < n/5 ; j){if (i 2 * k 5 * j n){count;}}}}p…

ZXing生成二维码

&#x1f60a; 作者&#xff1a; 瓶盖子io &#x1f496; 主页&#xff1a; 瓶盖子io-CSDN博客 1.介绍 Android Zxing框架 生成二维码扫码功能;ZXing是一个开源的类库&#xff0c;是用Java编写的多格式的1D / 2D条码图像处理库&#xff0c;使用ZXing可以生成、识别QR Code(…

Servlet 的初步学习

前言 咱们最核心的目标是基于tomcat编程, 做出网站来 ~~ 基于tomcat进行网站后端的开发. 网站后端, http服务器,肯定是需要针对http 协议进行一系列操作的. 幸运的是, tomcat,已经把这些http相关的底层操作,封装好了只需要调用tomcat给咱们提供的api即可 Servlet 是什么 Servl…

做数据分析为何要学统计学(6)——什么问题适合使用卡方检验?

卡方检验作为一种非常著名的非参数检验方法&#xff08;不受总体分布因素的限制&#xff09;&#xff0c;在工程试验、临床试验、社会调查等领域被广泛应用。但是也正是因为使用的便捷性&#xff0c;造成时常被误用。本文参阅相关的文献&#xff0c;对卡方检验的适用性进行粗浅…

基于Java8构建Docke镜像

基于Java8构建Docke镜像 搜索java8安装包 docker search java8 --no-trunc &#xff0c; --no-trunc展开描述信息 选择拉取 docker pull docker.io/mykro/java8-jre&#xff0c;为了减少磁盘占用&#xff0c;选择jre版本基础镜像 在宿主机创建文件夹iot&#xff0c;并把所需…

opencv 十五 红外图像中虹膜的提取

一、算法需求 在医疗检测中&#xff0c;需要使用红外相机拍摄眼睛照片&#xff0c;然后提取出虹膜的区域。在拍摄过程瞳孔需要进行运动&#xff0c;其通常不在正前方&#xff0c;无法形成圆形&#xff0c;不能使用常规的霍夫圆检测进行提取定位。且在在红外图像中&#xff0c;…

Java 语言关键字

Java关键字是电脑语言里事先定义的&#xff0c;有特别意义的标识符&#xff0c;有时又叫保留字&#xff0c;还有特别意义的变量。Java的关键字对Java的编译器有特殊的意义&#xff0c;他们用来表示一种数据类型&#xff0c;或者表示程序的结构等&#xff0c;关键字不能用作变量…

鸿蒙OS应用开发者高级认证题库

一、判断题 云函数打包完成后&#xff0c;需要到AppGallery Connect创建对应函数的触发器才可以在端侧中调用&#xff08;错&#xff09; 在column和Row容器组件中&#xff0c;aligntems用于设置子组件在主轴方向上的对齐格式&#xff0c;justifycontent用于设置子组件在交叉轴…

IO零拷贝

在介绍零拷贝之前我们先看看传统的 Java 网络 IO 编程是怎样的。 下面代码展示了一个典型的 Java 网络程序。 File file new File("index.jsp");RandomAccessFile rdf new RandomAccessFile(file, "rw");byte[] arr new byte[(int) file.length()];rdf…

差分进化算法DE

此算法是一种基于贪心的并行直接搜索算法。 1.过程 &#xff08;1&#xff09;初始化种群 NP个D维的参数向量(i1,2,...,NP)作为每一代G种群&#xff0c;种群规模必须>4 &#xff08;2&#xff09;变异 使用种群中两个不同向量来干扰一个现有向量&#xff0c;进行差分操…

穿梭时光的Java魔法:轻松掌握Date类,揭示当前时间的神秘面纱!

一、实现目标 获取当前时间&#xff01; 二、上代码 import java.text.SimpleDateFormat; import java.util.Date; public class Date_ { // 输出当前的时间 public static void main(String[] arg…

集群监控Zabbix和Prometheus

文章目录 一、Zabbix入门概述1、Zabbix概述2、Zabbix 基础架构3、Zabbix部署3.1 前提环境准备3.2 安装Zabbix3.3 配置Zabbix3.4 启动停止Zabbix 二、Zabbix的使用与集成1、Zabbix常用术语2、Zabbix实战2.1 创建Host2.2 创建监控项&#xff08;Items&#xff09;2.3 创建触发器&…

Dueling DQN 跑 Pendulum-v1

gym-0.26.1 Pendulum-v1 Dueling DQN 因为还是DQN,所以我们沿用double DQN,然后把 Qnet 换成 VAnet。 其他的不变&#xff0c;详情参考前一篇文章。 class VA(nn.Module):"""只有一层隐藏层的A网络和V网络"""def __init__(self, state_dim, hidd…

二百一十五、Flume——Flume拓扑结构之复制和多路复用的开发案例(亲测,附截图)

一、目的 对于Flume的复制和多路复用拓扑结构&#xff0c;进行一个小的开发测试 二、复制和多路复用拓扑结构 &#xff08;一&#xff09;结构含义 Flume 支持将事件流向一个或者多个目的地。 &#xff08;二&#xff09;结构特征 这种模式可以将相同数据复制到多个channe…

【UML】组件图中的供接口和需接口与面向对象中的接口

UML&#xff08;统一建模语言&#xff09;组件图中的“供接口”&#xff08;Provided Interface&#xff09;和“需接口”&#xff08;Required Interface&#xff09;与面向对象编程中的接口概念有关联&#xff0c;但它们在应用上有所区别。 下面解释两者的关系&#xff1a; …

使用kubeadm部署一套Kubernetes v1.23.0集群

使用kubeadm部署一套Kubernetes v1.23.0集群 1、前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式&#xff1a; • kubeadm Kubeadm是一个K8s部署工具&#xff0c;提供kubeadm init和kubeadm join&#xff0c;用于快速部…

14光线追踪(加速结构)

1.Uniform Spatial Partitions(Grids)—均匀空间划分 1.1场景预处理 Find bounding boxCreate gridStore each object in overlapping cells判断哪些网格可能有物体&#xff0c;有物体的格子做上特殊标记 1.2开始光线追踪 开始做光追→ 光线到有物体的格子 → 判断是否有交点…

day03、关系模型之基本概念

关系模型之基本概念 1.关系模型概述1.1 关系模型三要素基本结构&#xff1a;relation/Table基本操作:relation operator 2.什么是关系3.关系模型中的完整性约束 本视频来源于B站&#xff0c;战德臣老师 1.关系模型概述 1.1 关系模型三要素 基本结构&#xff1a;relation/Table…