【Linux操作系统】互斥的4个概念以及认识信号量

news2025/1/11 23:39:46

文章目录

  • 进程互斥的4个概念
  • 认识信号量
  • 认识接口
  • 理解IPC


信号量主要用于同步和互斥的,下面先来看看什么是同步和互斥。

进程互斥的4个概念

我们把大家都能看到的资源,称为公共资源。并且要想实现进程间通信,首要条件就是要让互相通信的进程看到同一份资源。

  • 互斥:由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥,所以任何一个时刻,都只允许一个执行流在进行共享资源的访问。(解决方法:加锁)
  • 我们把任何一个时刻,都只允许一个执行流在进行访问共享资源,叫做临界资源或互斥资源。
  • 临界资源是要通过代码访问的,凡是访问临界资源的代码,叫做临界区(在进程中涉及到互斥资源的程序段叫临界区)。
  • 原子性:要么不做,要么做完,只有两种确定状态的属性。
  • 特性方面:IPC资源必须删除,否则不会自动清除,除非重启,所以system V IPC资源的生命周期随内核

认识信号量

信号量又称信号灯,本质是一个描述资源数量的计数器。

任何一个执行流,想访问临界资源中的一个子资源时,都不能直接访问,必须先申请信号量资源,相当于计数器count–(资源数量减1,OS会进行资源数量的判断,如果资源用完了,就会被挂起,阻塞进程,直到有进程将资源释放),申请成功后,才能进入自己的临界区,访问对应的临界资源。最后释放信号量资源,相当于把计数器count++(资源数量加1),只要将计数器增加,就表示将我们对应的资源进行了归还,这分别称为PV(荷兰语:通过and释放)操作。
在这里插入图片描述

可以类比生活中的电影院,看电影之前,我们得先买票,而买票的的本质功能就是对座位资源的预定机制,并且确保不会导致座位冲突。
假设我们要看晚上18:00的《蜘蛛侠:纵横宇宙》,我们得先申请座位,若预定座位成功了,则座位资源(临界资源就会减减),如果这一场电影的票被卖完了,那么我们就阻塞住了,直到有人退票(临界资源++),我们才能预定电影院放映厅的座位资源。

所有进程都必须先看到同一份信号量,竟然这样,那么信号量也是共享资源咯,所以信号量被归类到了进程间通信,但它不以传送数据为目的,而以让不同的进程看到同一份计数器为目的,并且信号量必须保证的++,–操作是保证原子性的。

认识接口

创建获取信号量

在这里插入图片描述

查看删除信号量——ipc

ipcs -s //查看信号量
ipcrm -s semid //释放信号量
或者使用semctl删除,类似共享内存。

控制信号量

在这里插入图片描述
在这里插入图片描述

信号量的数据结构如下:

在这里插入图片描述

信号量加减

对信号量集进行操作我们需要用semop函数,semop函数的函数原型如下:

int semop(int semid, struct sembuf *sops, unsigned nsops);

功能:
semop是用于操作信号量的系统调用函数之一,它可以实现对信号量进行P、V操作,从而解决多进程或多线程之间的互斥和同步问题。当一个进程要访问共享资源,需要调用semop函数执行P操作,该操作会将信号量减1,如果值小于0,则当前进程会被阻塞住,直到有其它进程执行V操作使信号量加加,释放共享资源。

  1. P操作:我们将申请信号量的操作叫做P操作,申请信号量的本质就是有权限访问临界资源,申请成功后,P操作的本质就是让计数器–即可
  2. V操作:将释放信号量叫做V操作,归还临界资源,V操作的本质是让计数器++

参数解读:

  • semid:要操作的信号量标识符,由semget函数返回。
  • sops:类型是struct sembuf*,是一个指向sembuf结构体数组的指针,表示要对哪些信号量进行操作,sembuf结构体需要我们自己定义,它包括三个成员变量,分别是:sem_num(要操作的信号量在信号量集合中的下标),sem_op(对信号量执行的操作,负值代表P操作,正值代表V操作,0表示不做任何操作),sem_flg(控制操作行为的标志,默认SEM_UNDO在进程异常终止时撤销未完成的操作,因为信号量要保证其原子性)。
  • nsops:表示要执行操作的sembuf结构体数量。

理解IPC

在这里插入图片描述

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

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

相关文章

一文了解kubernetes部署:API部署过程

API部署 准备工作 一、镜像制作 请参考:《API镜像制作》 二、为k8s配置docker私服密钥 请参考:《配置docker私服密钥》 部署API 修改yaml文件 vi/opt/kubernetes/api/config-server.yaml vi/opt/kubernetes/api/api.yaml 1、修改api相应image值为您的镜…

【深度学习】日常笔记7

可以通过在⽹络中加⼊⼀个或多个隐藏层来克服线性模型的限制,使其能处理更普遍的函数关系类型。要做到这⼀点,最简单的⽅法是将许多全连接层堆叠在⼀起。每⼀层都输出到上⾯的层,直到⽣成最后的输出。 上面红框的公式其实换个角度是没错的。实…

总结911

目标规划: 月目标:6月(线性代数强化9讲,考研核心词过三遍) 周目标:线性代数强化5讲,英语背3篇文章并回诵,检测 每日规划 今日已做 1.回诵之前文章 2.每日长难句,句句…

Redis五种数据结构底层编码结构

String String是Redis中最常见的数据存储类型: 其基本编码方式是RAW,基于简单动态字符串(SDS)实现,存储上限为512mb。如果存储的SDS长度小于44字节,则会采用EMBSTR编码,此时object head与SDS是…

Mysql(Linux数据库或者在Navicate中)

Mysql数据库组成 服务端:主要存储数据,并接收用户发过来的SQL语句,并执行结果返回给客户端 客户端:下发用户要执行的sql语句,并显示服务器返回的执行结果 命令行数据库连接方式 mysql -h 数据库 IP -P 端口号 -u 数据库登录用户名 -p 数据库登录密码 -h不加表示为本机,-P不…

编译原理一:编译器工作流

文章目录 1. 编译器工作流1.1. 解析(Parsing)1.2. 遍历(Traversal)1.3 转换(Transformation)1.4 代码生成(Code Generation) 1. 编译器工作流 编译器是将一种语言转化为另一种语言的程序。在编译器工作流中,通常可以分…

git上传云效codeup

为了标识身份,建议先完成 Git 全局设置 git config --global user.name "xxx" git config --global user.email "xxxxxxqq.com" 1.删除本地 .git文件夹 2.云效上 添加库-新建代码库 3.在 git bash 里 按照 建好的代码库 下方的 命令行指引-…

chatgpt赋能python:Python编译成二进制文件:优化代码执行效率

Python编译成二进制文件:优化代码执行效率 介绍 随着Python编程的不断普及,越来越多的开发者选择Python作为开发工具。然而,Python解释器需要读取并解释源代码,这种解释方式在执行效率上存在瓶颈。为了提高执行效率,…

io.netty学习(十三)Netty 解码器

目录 前言 编解码概述 编解码器概述 Netty 内嵌的编码器 解码器 ByteToMessageDecoder 抽象类 ReplayingDecoder 抽象类 MessageToMessageDecoder 抽象类 总结 前言 编码和解码:数据从一种特定协议格式到另一种格式的转换。 处理编码和解码的程序通常被称…

【VulnHub系列】BrokenGallery

因为是从PDF转换过来偶尔可能会出现内容缺少,可以看原版PDF:有道云笔记 实验信息 Broken:192.168.10.111 Kali:192.168.10.106 实验过程 sudo arp-scan --interface eth0 192.168.10.1/24 然后对靶机进行端口探测 nmap -sT -…

定积分的应用—所围图形的面积、绕轴旋转所围成立体的体积、旋转曲面的面积、弧长

本篇本章,将从几个简单的例子带大家分析总结定积分的应用中常用的方法和思想,一起学习进入定积分的世界😜😜 一、求所围图形的面积 1.求由抛物线 y x 2 与 y 2 − x 2 所 围 图 形 的 面 积 yx^2与y2-x^2所围图形的面积 yx2与y2…

Windows下Android studio 搭建 android NDK 搭建 OLLVM 踩坑记录

1. 编译 ollvm-9.0.1 下载源码进行编译 https://github.com/heroims/obfuscator/tree/llvm-9.0.1 编译 这里有坑要注意 不能使用最新的 mingw 8.0.1 编译会报错 报错内容如下: PS D:\OLLVM\obfuscator-llvm-9.0.1\build> cmake -G "MinGW Makefiles" -DCMA…

浏览器 HTTPS 协议的相关知识点有哪些?

💂 个人网站:【海拥】【游戏大全】【神级源码资源网】🤟 前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅 寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】 目录 前言HTTPS协议的概念HT…

腾讯云私有云平台运维面试

文章目录 概述JD 岗位描述一面二面三面HR面 概述 根据会议将面试问题进行总结,很多问题感觉当时没回答好,这是为啥呢?应该还是不熟练吧,或者不善于表达。将次经历分享出来,大家多练练。 JD 岗位描述 私有云平台运维…

io.netty学习(十四)Netty 编码器

目录 前言 MessageToByteEncoder 抽象类 MessageToMessageEncoder 抽象类 总结 前言 上一篇我们讲解了解码器的相关知识,其中也提到了编码器的定义。 编码器就是用来把出站(针对本身来讲,发送都是出站,接收都是入站&#xf…

TIA博途_字符转换为字符串以及截取字符串有效字符的具体方法示例

TIA博途_字符转换为字符串以及截取字符串有效字符的具体方法示例 情景再现: 在做某些通信相关的项目时,可能会遇到通信接收到的字符串是以字节的形式传送过来的字符,此时就需要我们对接收到的这些字符进行处理,从而获取我们实际需要的字符或字符串。 如下图所示,打开博途…

一文了解什么是Dubbo

Dubbo学习 Dubbo应用架构的演变RPC(远程过程调用)RPC介绍RPC组件RPC调用 Apache Dubbo概述Dubbo简介Dubbo的架构 服务注册中心ZookeeperZookeeper介绍运行zookeeper Dubbo的快速开发Dubbo管理控制台治理中心 Dubbo Dubbo是一个分布式服务框架&#xff0…

基于Servlet+JDBC实现的基础博客系统>>系列3 -- Servlet后端服务器搭建

目录 前言 1. 前期准备 2. Model层 2.1 数据库的设计 2.2 数据库表对应的实体类实现 User类 Blog类 2.3 JDBC 工具类实现 2.4 UserDao 的实现 2.5 BlogDao 的实现 3. Controller 层实现 3.1 博客列表页 3.1.1 约定前后端交互接口 3.1.2 编写后端代码 3.1.3 编写…

【Shell1】shell语法,ssh/build/scp/upgrade,环境变量

文章目录 1.shell语法:shell是用C语言编写的程序,是用户使用Linux的桥梁,硬件>内核(os)>shell>文件系统1.1 变量:readonly定义只读变量,unset删除变量1.2 函数:shell脚本传递的参数中包含空格&…