【Linux初阶】system V消息队列 + system V信号量

文章目录

  • 一、system V消息队列(了解)
  • 二、system V信号量(了解)
    • 1.信号量是什么
    • 2.临界资源和临界区
    • 3.互斥
    • 4.为什么要信号量
  • 三、IPC资源的组织方式
  • 结语


一、system V消息队列(了解)

  • 消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法。
  • 每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值。
  • 特性方面 :IPC(处理进程间通信)资源必须删除,否则不会自动清除,除非重启,所以system V IPC资源的生命周期随内核

有兴趣的伙伴可以自行学习对应的接口


二、system V信号量(了解)

1.信号量是什么

信号量本质是一个计数器,通常用来表示公共资源中,资源量多少的问题。

公共资源:可以被多个进程同时访问的资源。

访问没有保护的公共资源,会产生数据不一致问题。比如,一段数据必须要完整读取才有意义,但是在写端进程还没写完的情况下,读端进程就把数据读走了。

———— 我是一条知识分割线 ————

2.临界资源和临界区

那些被保护起来的公共资源,我们称之为 临界资源。在我们的计算机中虽然有很多临界资源,但是大部分还是独立资源(非公共)。

资源(内存、文件、网络等)是要被进程使用的,它一定会有对应的代码来访问这部分的临界资源,这部分可以访问资源的代码,我们称之为 临界区。当然,有临界区,就肯定有非临界区,即与资源访问无关联的代码。

———— 我是一条知识分割线 ————

3.互斥

某个共享资源在一段时间之内只允许一个进程访问,不允许其他进程访问,这种进程之间的关系我们称之为 互斥。在编程中,我们通常需要 来实现。

原子性要么不做,要做就做完。举一个例子,银行转账,要么成功,要么失败,不允许出现转账的钱不翼而飞的情况。

———— 我是一条知识分割线 ————

4.为什么要信号量

共享资源分两种:一种是整体使用的共享资源,另一种是将一个整体资源划分为一个个子资源给进程使用。

那么问题来了,我们如何知道这些资源的一个个子资源有没有被占用呢?

此时,信号量可以帮助我们解决这个问题。在我们想要某种资源时,信号量可以帮助我们做 “预定”我们可以用信号量的大小来帮助我们确认这个整体资源的使用情况

举一个简单的例子,一个整体资源有 20个子资源,我们可以信号量 sem=20,当有一个进程需要访问其中一个子资源时,sem–(预定资源),进程访问,访问完成,sem++(释放资源)。这样,我们就通过 sem确定了整体资源的使用情况。

在这里插入图片描述
我们称预定资源的操作称为 P操作,释放资源的操作称为 V操作,它们加起来就是一个很重要的基础操作 PV操作

当一个整体资源的信号量初始值为 1,就证明这个资源只允许一个进程访问,这种信号量我们称之为 二元信号量。二元信号量标识的资源,具有互斥功能

在上文中我们提及了原子性的知识,根据上图中的文字推导,我们可以知道信号量也是公共资源(因为它要让所有要申请资源的进程看到), PV操作具有原子性

有兴趣的伙伴可以自行学习对应的接口


三、IPC资源的组织方式

system V共享内存、system V消息队列 、 system V信号量,它们都是system V标准的额进程间通信。

因此,它们的接口相似度非常高,操作系统的设计者在此基础上,为了方便同一管理它们的资源,设计了一种IPC资源的组织方式,那就是指针数组。

接口查看指令如下:

[root@VM-12-11-centos ~]$ man shmctl	#共享内存
[root@VM-12-11-centos ~]$ man msgctl	#消息队列
[root@VM-12-11-centos ~]$ man semctl	#信号量

将每个system V标准的通信方式的结构体的指针放到指针数组中,让用户可以通过 类型强转 + 下标 + (./->其它属性)的方法具体访问某个特定通信方式的特定方法。

图解如下:

在这里插入图片描述


结语

🌹🌹 system V消息队列 + system V信号量 的知识大概就讲到这里啦,博主后续会继续更新更多C++ 和 Linux的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪

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

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

相关文章

dataframe resample时间重采样的坑

无论日期列不在index,index一定要按顺序,否则结果会和实际不一致。reset_index

LVGL学习笔记 30 - List(列表)

目录 1. 添加文本 2. 添加按钮 3. 事件 4. 修改样式 4.1 背景色 4.2 改变项的颜色 列表是一个垂直布局的矩形,可以向其中添加按钮和文本。 lv_obj_t* list1 lv_list_create(lv_scr_act());lv_obj_set_size(list1, 180, 220);lv_obj_center(list1); 部件包含&…

C++——vector介绍及其简要模拟实现

vector的介绍 此主题介绍转载自(https://cplusplus.com/reference/vector/vector/) 1.vector是一个表示可变大小数组的序列容器 2.vector同数组一样,采用连续存储空间来存储元素,这样可以用下标来对vector中的元素进行访问,但是vector的大…

image has dependent child images

问题:很多none的镜像无法被删除 解决过程: 1、通过 docker image prune -f 提示可删除为 0 2、直接进行删除报错: docker rmi 8f5116cbc201Error response from daemon: conflict: unable to delete 8f5116cbc201 (cannot be forced) - im…

Jmeter进阶使用:BeanShell实现接口前置和后置操作

一、背景 我们使用Jmeter做压力测试或者接口测试时,除了最简单的直接对接口发起请求,很多时候需要对接口进行一些前置操作:比如提前生成测试数据,以及一些后置操作:比如提取接口响应内容中的某个字段的值。举个最常用…

面试热题(全排列)

给定一个不含重复数字的整数数组 nums ,返回其 所有可能的全排列 。可以 按任意顺序 返回答案。 输入:nums [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 先在这里说明一下排列和组合的区别? 组合:是指从一…

opencv+ffmpeg+QOpenGLWidget开发的音视频播放器demo

前言 本篇文档的demo包含了 1.使用OpenCV对图像进行处理,对图像进行置灰,旋转,抠图,高斯模糊,中值滤波,部分区域清除置黑,背景移除,边缘检测等操作;2.单纯使用opencv播放…

旧版本docker未及时更新,导致更新/etc/docker/daemon.json配置文件出现docker重启失败

一、背景 安装完docker和containerd之后,尝试重启docker的时候,报错如下: systemctl restart dockerJob for docker.service failed because the control process exited with error code. See “systemctl status docker.service” and “…

面试热题(缺失的第一个正数)

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 输入:nums [1,2,0] 输出:3 尝试的路途是痛苦的,不断的尝试新方法,错何尝…

Termux SFTP 进行远程文件传输

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP(SSH File Transfer Protocol)是一种基于SSH(Secure Shell)安全协议的文件传输协议。与FTP协议相比,SFTP使用了…

IOS开发-XCode14介绍与入门

IOS开发-XCode14介绍与入门 1. XCODE14的小吐槽2. XCODE的功能bar一览3. XCODE项目配置一览4. XCODE更改DEBUG/RELEASE模式5. XCODE单元测试 1. XCODE14的小吐槽 iOS开发工具一直有个毛病,就是新版本的开发工具的总会有一些奇奇怪怪的bug。比如在我的Mac-Pro&#…

redis的三种集群方式

redis有三种集群方式:主从复制,哨兵模式和集群。 1.主从复制 主从复制原理: 从服务器连接主服务器,发送SYNC命令; 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所…