【Linux】System V 信号量

一、信号量的概念理论渗透

1.1 基本概念

  • 共享资源:多个执行流,可以看到的一份资源
  • 临界资源:被保护起来的资源 —— 保护的方式:同步和互斥
  • 互斥:任何时候只能有一个进程在访问共享资源
  • 资源,一定要被程序员进行访问的,我们使用代码进行访问, 代码 = 访问共享资源的代码(临界区) + 不访问共享资源的代码(非临界区)
  • 所谓的对共享资源进行保护——临界资源——本质上就是对访问共享资源的代码的保护

1.2 什么是同步和互斥

  • 由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥
  • 系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或互斥资源。
  • 在进程中涉及到互斥资源的程序段叫临界区

1.3 特性方面

       IPC资源必须删除,否则不会自动消除,除非重启,所以System V IPC资源的生命周期随内核

二、如何理解信号量的理论

       信号量(信号灯):用于保护共享资源(临界资源)

       我们来举个例子:电影院买票,我们需要进行买票。我们在之前的共享内存是一个整体使用的,但是在电影院中,会有很多的座位供我们挑选。信号量本质上是一个计数器,当我们购买电影票时,我们需要进行电影票的预定,申请信号量的本质就是对公共资源的一种预定机制。

       信号量分为二元信号量和多元信号量,在二元信号量中,信号量的个数为1(相当于将临界资源看成一整块),二元信号量本质解决了临界资源的互斥问题,以下面的伪代码进行解释:

while (1)
{
    if(sem == 1)
         sum--;
    else 
      // 挂起
  // 写入共享内存
     sem++;
}

       根据以上代码,当进程A申请访问共享内存资源时,如果此时sem为1(sem代表当前信号量个数),则进程A申请资源成功,此时需要将sem减减,然后进程A就可以对共享内存进行一系列操作,但是在进程A在访问共享内存时,若是进程B申请访问该共享内存资源,此时sem就为0了,那么这时进程B会被挂起,直到进程A访问共享内存结束后将sem加加,此时才会将进程B唤起,然后进程B再对该共享内存进行访问操作。

       在这种情况下,无论什么时候都只会有一个进程在对同一份共享内存进行访问操作,也就解决了临界资源的互斥问题。

       实际上,代码中计数器sem减减的操作就叫做P操作,而计数器加加的操作就叫做V操作,P操作就是申请信号量,而V操作就是释放信号量。

                          

三、信号量的操作

3.1 信号量的函数

3.1.1 semget函数

函数的原型:

函数的功能:

       创建一个新的信号量或获取一个已经存在的信号量的键值。
函数的参数:

  • key:为整型值,用户可以自己设定。有两种情况:键值是IPC_PRIVATE,该值通常为0,意思就是创建一个仅能被进程进程给我的信号量。键值不是IPC_PRIVATE,我们可以指定键值,例如1234;也可以一个ftok()函数来取得一个唯一的键值。
  • nsems:表示初始化信号量的个数。比如我们要创建一个信号量,则该值为1.,创建2个就是2。
  • semflg:信号量的创建方式或权限。有IPC_CREAT,IPC_EXCL。IPC_CREAT如果信号量不存在,则创建一个信号量,否则获取。IPC_EXCL只有信号量不存在的时候,新的信号量才建立,否则就产生错误。

函数的返回值:

       成功返回信号量的标识码ID。失败返回-1

3.1.2 semctl函数

函数的原型:

函数的功能:

       控制信号量的函数,在这个函数中我们可以删除信号量或初始化信号量。

函数的参数:

  • semid:信号量的标志码(ID),也就是semget()函数的返回值
  • semnum:操作信号在信号集中的编号。从0开始
  • cmd:表示要进行的操作

cmd参数可以使用的命令:

  • IPC_STAT读取一个信号量集的数据结构semid_ds,并将其存储在semun中的buf参数中。
  • IPC_SET设置信号量集的数据结构semid_ds中的元素ipc_perm,其值取自semun中的buf参数。
  • IPC_RMID将信号量集从内存中删除。
  • GETALL用于读取信号量集中的所有信号量的值。
  • GETNCNT返回正在等待资源的进程数目。
  • GETPID返回最后一个执行semop操作的进程的PID。
  • GETVAL返回信号量集中的一个单个的信号量的值。
  • GETZCNT返回这在等待完全空闲的资源的进程数目。
  • SETALL设置信号量集中的所有的信号量的值。
  • SETVAL设置信号量集中的一个单独的信号量的值。

函数的返回值:

       成功返回0,失败返回-1        

3.1.3 semop函数

函数的原型:

函数的功能:

       用户改变信号量的值。也就是使用资源还是释放资源使用权
函数的参数:

  • shmid:信号量的标识码。也就是semget()的返回值。
  • sops是一个指向结构体数组的指针。 
struct   sembuf{

     unsigned short  sem_num;//第几个信号量,第一个信号量为0;

     short  sem_op;//对该信号量的操作。

     short _semflg;

};
  • nsops:操作结构的数量,恒大于或等于1。

函数的返回值:

       成功返回0,失败返回-1

四、信号量的指令

// 查看系统中的信号量
ipcs -s
// 删除系统中的信号量
ipcrm -s shmid

五、操作系统如何把共享内存、消息队列、信号量管理起来

       通过对system V系列进程间通信的学习,可以发现共享内存、消息队列以及信号量,虽然它们内部的属性差别很大,但是维护它们的数据结构的第一个成员确实一样的,都是ipc_perm类型的成员变量。

       这样设计的好处就是,在操作系统内可以定义一个struct ipc_perm类型的数组,此时每当我们申请一个IPC资源,就在该数组当中开辟一个这样的结构。

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

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

相关文章

LeetCode刷题之HOT100之搜索旋转排序数组

2024/6/2 雨一直下,一个上午都在床上趴着看完了《百年孤独》,撑伞去吃了个饭,又回到了宿舍。打开许久未开的老电脑,准备做题了。《百年孤独》讲了什么,想表达什么,想给读者留下什么,我不知道&am…

每日一题《leetcode-- LCR 025.两数相加||》

https://leetcode.cn/problems/lMSNwu/ 分别把给定的两个链表翻转,然后从头开始相加。 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ //反转链表 struct ListNode* reverselist(struct ListNode*h…

项目中统一异常处理

项目中统一异常处理 1.异常处理框架图2.实现 1.异常处理框架图 异常处理除了输出在日志中,还需要提示给用户,前端和后端需要作一些约定: 错误提示信息统一以json格式返回给前端。以HTTP状态码决定当前是否出错,非200为操作异常。…

基于51单片机数控直流数控电源的设计

电源技术尤其是数控电源技术是一门实践性很强的工程技术,服务于各行各业。当今电源技术融合了电气、电子、系统集成、控制理论、材料等诸多学科领域。直流稳压电源是电子技术常用的仪器设备之一,广泛的应用于教学、科研等领域,是电子实验员、电子设计人员及电路开发部门进行…

Win10 Edge提示兼容性问题打不开|解决浏览器兼容性问题

Edge有时候会与某些安全软件不兼容,导致报错 报错代码:STATUS_INVALID_IMAGE_HASH 解决Edge浏览器兼容性问题方法/步骤: 1、按 Win R 组合键,打开运行,并输入 regedit 命令,确定或回车,可以…

大语言模型实战——最小化模型评测

1. 引言 现在国内外的主流模型,在新模型发布时都会给出很多评测数据,用以说明当前模型在不同数据集上的测评表现(如下面llama3发布的评测数据)。 这些评测数据是如何给出来的呢?这篇文章会用一个最小化的流程来还原下…

【Android】手动下载gradle插件包,解决gradle插件包下载不全问题。

问题描述 拉取别人的项目时,因为网络问题gradle插件包一直下载不全,一直build。 解决方案: 打开gradle>wrapper文件下gradle-wrapper.properties,查看需要下载gradle-7.2-bin.zip。 distributionBaseGRADLE_USER_HOME distr…

kafka 发送文件二进制流及使用header发送附属信息

文章目录 背景案例发送方接收方 背景 需要使用kafka发送文件二进制以及附属信息 案例 发送方 import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerRecord;import java.io.InputStream; import java.nio.charset.S…

Part 4.1 线性动态规划

线性动态规划,即具有线性阶段划分的动态规划。 [USACO1.5] [IOI1994]数字三角形 Number Triangles 题目描述 观察下面的数字金字塔。 写一个程序来查找从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到左下方的点也可以到达右…

统计信号处理基础 习题解答10-6

题目 在例10.1中,把数据模型修正为: 其中是WGN,如果,那么方差,如果,那么方差。求PDF 。把它与经典情况PDF 进行比较,在经典的情况下A是确定性的,是WGN,它的方差为&#…

数据库(17)——DCL数据控制语言

DCL DCL是Data Control Language数据控制语言,用来管理数据库用户、控制数据库的访问权限。 DCL-管理用户 语法 1.查询用户 USE mysql; SELECT * FROM user; 也可以直接在datagrip找到user表 我们要操作用户要通过User和Host同时定位。Host表示当前用户只能在哪个…

【深度学习实战—9】:基于MediaPipe的坐姿检测

✨博客主页:王乐予🎈 ✨年轻人要:Living for the moment(活在当下)!💪 🏆推荐专栏:【图像处理】【千锤百炼Python】【深度学习】【排序算法】 目录 😺一、Med…

前端Vue自定义滚动卡片组件设计与实现

摘要 随着技术的日新月异,前端开发的复杂度不断提升。传统的整块应用开发方式在面对小的改动或功能增加时,常常需要修改大量的整体逻辑,造成开发效率低下和维护成本高昂。为了应对这一挑战,组件化开发应运而生。本文将以Vue框架下…

Day46 动态规划part06

完全背包问题 完全背包和01背包问题唯一不同的地方就是,每种物品有无限件。先遍历物品还是先遍历背包以及遍历顺序 根据递推公式可知:每一个dp需要根据上方和左方的数据推出,只要保证数据左上方数据是递推出来的这种两个for循环的顺序就是可…

使用Gradio构建大模型应用:Building Generative AI Applications with Gradio

Building Generative AI Applications with Gradio 本文是学习 https://www.deeplearning.ai/short-courses/building-generative-ai-applications-with-gradio/ 这门课的学习笔记。 What you’ll learn in this course Join our new short course, Building Generative AI A…

C++与Java数据结构设计的区别(持续更新中)

链表 c代码示例 #include <list> int main() {std::list<int> list;list.push_front(1);list.push_back(2);std::list<int>::iterator it list.begin();while (it ! list.end()){std::cout << *it << std::endl;}return 0; } java代码示例 …

C#WPF数字大屏项目实战06--报警信息

1、ItemsControl 简介 ItemsControl 是用来表示一些条目集合的控件&#xff0c;所以它叫条目控件&#xff0c;它的成员是一些其它控件的集合&#xff0c;其继承关系如下&#xff1a; 其常用的派生控件为&#xff1a;ListBox、ListView、ComboBox&#xff0c;为ItemsCo…

Spring Boot 官方不再支持 Spring Boot 的 2.x 版本!新idea如何创建java8项目

idea现在只能创建最少jdk17 使用 IDEA 内置的 Spring Initializr 创建 Spring Boot 新项目时&#xff0c;没有 Java 8 的选项了&#xff0c;只剩下了 > 17 的版本 是因为 Spring Boot 官方不再支持 Spring Boot 的 2.x 版本了&#xff0c;之后全力维护 3.x&#xff1b;而 …

Mac专用投屏工具:AirServer 7 for Mac 激活版下载

AirServer 7 是一款在 Windows 和 macOS 平台上运行的强大的屏幕镜像和屏幕录制软件。它能够将 iOS 设备、Mac 以及其他 AirPlay、Google Cast 和 Miracast 兼容设备的屏幕镜像到电脑上&#xff0c;并支持高质量的录制功能。总的来说&#xff0c;AirServer 7 是一款功能全面的屏…

配置 HTTP 代理 (HTTP proxy)

配置 HTTP 代理 [HTTP proxy] 1. Proxies2. curl2.1. Environment2.2. Proxy protocol prefixes 3. Use an HTTP proxy (使用 HTTP 代理)3.1. Using the examples (使用示例)3.1.1. Linux or macOS3.1.2. Windows Command Prompt 3.2. Authenticating to a proxy (向代理进行身…